判断点是否落在面中的Oracle存储过程描述
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.背景公司在乐亭的项目中,工程同事提出了需要在对接车辆GPS上报点时,能够实时判断该点是否落在乐亭行政区内。如果不在,将其报警。 处理思路分为了两种,一种是前端实时从数据库中拉取存入的GPS点,然后判断点是否落在区域面中。第二种,就是在与GPS厂商实时对接GPS数据,将GPS数据存入到我方数据库中对应表时,就进行点是否落在区域面中的判断,如果不是,则在对应表的判断点面关系字段中将其标注。 考虑到效率以及记录的保存,最后选择第二种方案,即在数据库层面进行操作,并保存判断记录方式。 2.判断点面关系的算法2.1 算法选择判断点面关系的算法一般有如下几种: a差乘判别法(只针对凸多边形) b.面积判别法(只针对凸多边形) c.角度和判别法等(任意多边形均可) 为了以后存储过程的通用性,选择使用角度和判别法更符合需求。 2.2 角度和判别方法的原理
原理:令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里面。 3.用存储过程实现该算法3.1 单个角度获取(夹角αi算法)
3.2 角度总和判别
3.算法优化以上角度和算法是相对耗时的,如果我们在判断点面关系前先用最简单的方式做一次过滤判断,让只有满足要求的点进入到角度和算法的判断中,会对效率提示有更大的帮助。 这里,可以直接在获取到点时使用范围的四角坐标对该点进行过滤。 4.算法测试 因为GPS存在一定的误差范围,特将乐亭的边界进行了一定的外延。然后将外延的范围变成ring格式的json点串。然后选择多个点进行测试。 重复测试多个样本,均符合要求。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |