文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。前端
公司在乐亭的项目中,工程同事提出了须要在对接车辆GPS上报点时,可以实时判断该点是否落在乐亭行政区内。若是不在,将其报警。算法
处理思路分为了两种,一种是前端实时从数据库中拉取存入的GPS点,而后判断点是否落在区域面中。第二种,就是在与GPS厂商实时对接GPS数据,将GPS数据存入到我方数据库中对应表时,就进行点是否落在区域面中的判断,若是不是,则在对应表的判断点面关系字段中将其标注。数据库
考虑到效率以及记录的保存,最后选择第二种方案,即在数据库层面进行操做,并保存判断记录方式。json
判断点面关系的算法通常有以下几种:微信
a差乘判别法(只针对凸多边形)测试
b.面积判别法(只针对凸多边形)优化
c.角度和判别法等(任意多边形都可)blog
为了之后存储过程的通用性,选择使用角度和判别法更符合需求。get
原理:令P={p1,p2,…,pn,p1}是一个顶点为pi(xi,yi), i=1,2,…,n的封闭多角形,pt是一个测试点。PtPi为链接pt和pi的向量,αi表示向量PtPi到PtPi+1的夹角。博客
若Σαi = 0 Pt在P的外面;
若Σαi = ±2π Pt在P里面。
以上角度和算法是相对耗时的,若是咱们在判断点面关系前先用最简单的方式作一次过滤判断,让只有知足要求的点进入到角度和算法的判断中,会对效率提示有更大的帮助。
这里,能够直接在获取到点时使用范围的四角坐标对该点进行过滤。
由于GPS存在必定的偏差范围,特将乐亭的边界进行了必定的外延。而后将外延的范围变成ring格式的json点串。而后选择多个点进行测试。
重复测试多个样本,均符合要求。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^