空间搜索-射线法
在配送场景下,每个商户都有自己的配送区域,底层数据是按照geojson格式保存对应的配送区域
比如下面的多边形对应的存储格式和地图上表示的范围
{
"type": "Feature",
"properties": {
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[106.10595703125, 33.33970700424026],
[106.32568359375, 32.41706632846282],
[108.03955078125, 32.2313896627376],
[108.25927734375, 33.15594830078649],
[106.10595703125, 33.33970700424026]
]
]
}
}
在配送场景下每个商户都有多个如上图的配送区域,搜索干的事就是判断用户定位点是不是在这个配送区域里面,这不就是几何判断逻辑嘛!?
射线法
在几何学中,PIP(Point in Polygon)问题即判断一点在多边形的内部或外部。
射线法(Ray casting algorithm)是一种判断点是否在多边形内部的一种简单方法。即从该点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外部。
如何理解呢?
其实,对于平面内任意闭合曲线,曲线都把平面分割成了内、外两部分。对于平面内任意一条直线,在穿越多边形边界时,有且只有两种情况:进入多边形或穿出多边形。即:
如果点在多边形内部,射线第一次穿越边界一定是穿出多边形。
如果点在多边形外部,射线第一次穿越边界一定是进入多边形。
由于直线可以无限延伸,而闭合曲线包围的区域是有限的,因此最后一次穿越多边形边界,一定是穿出多边形,到达外部。
由上可推断,从一点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外部。
这里直接上代码
import java.io.Serializable;
import java.util.List;
/**
* @author duson
*/
public class MyPoly {
private List<Corner> corner;
public List<Corner> getCorner() {
return corner;
}
public void setCorner(List<Corner> corner)