Welcome 微信登录

首页 / 数据库 / MySQL / 判断点是否落在面中的Oracle存储过程描述

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点串。然后选择多个点进行测试。重复测试多个样本,均符合要求。更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址