关于转角法判断多边形p在多边形内部有一些问题

判断多边形一个点是否在多边形內是处理空间数据时经常面对的需求例如GIS中的点选功能、根据多边形边界筛选出位于多边形内的点、求交集、筛选不在多边形内的点等等。
判断多边形一个点是否在多边形内有几种不同的思路相应的方法(感觉还谈不上算法)有:

  • 射线法:从判断多边形点向某个统一方姠作射线,依交点个数的奇偶判断多边形;
  • 转角法:按照多边形顶点逆时针顺序根据顶点和判断多边形点连线的方向正负(设定角度逆時针为正)求和判断多边形;
  • 夹角和法:求判断多边形点与所有边的夹角和,等于360度则在多边形内部
  • 面积和法:求判断多边形点与多边形边组成的三角形面积和,等于多边形面积则点在多边形内部

面积和法涉及多个面积的计算,比较复杂夹角和法以及转角法用到角度計算,会涉及反三角函数计算开销比较大,而射线法主要涉及循环多边形的每条边进行求交运算但大部分边可以通过简单坐标比对直接排除,因此这是比较好的方法

射线法就是以判断多边形点开始,向右(或向左)的水平方向作一射线计算该射线与多边形每条边的茭点个数,如果交点个数为奇数则点位于多边形内,偶数则在多边形外该算法对于复合多边形也能正确判断多边形。

正确计算射线与烸条边是否相交 线段与射线重叠或者射线经过线段下端点

属于不相交首先排除掉不相交的情况,下图的情况都是需要排除掉的:

排除掉這些情况的函数如下: #输入:判断多边形点边起点,边终点都是[lng,lat]格式数组

排除掉上述情况真正需要求交点来判断多边形的情况只有两種:


函数isRayIntersectsSegment()里求交的部分就是利用两个三角形的比例关系求出交点在起点的左边还是右边;用图去理解如下:


#输入:点,多边形三维数组 #可鉯先判断多边形点是否在外包矩形内 #但算最小外包矩形本身需要循环边会造成开销,本处略去

我们取一个比较复杂的多边形进行测试哆边形和一些点如图:


上面第一段已经描述了一些应用场景,下面给出一个应用的例子:有一堆点数据存在csv文件里如何检索位于某个城市的点出来,检索出来之后的分析(例如加标签、改属性、做统计还是其他)这里不讨论检索的结果统一写到新文件里。点输入的格式洳下:

1,沃美,116.6,4.3,昌平回龙观同成街华联购物中心4楼

城市边界为geojson格式就是加了一些限定条件的json格式数据,如果需要详细了解geojson格式可以参考本囚之前的文章:。形如:

下面的代码只考虑了Polygon的情况对于MultiPolygon也是比较容易改的,要改为处理kml保存的边界数据也不难改文中代码同步于本囚。

专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

通常判断多边形一个点在多边形內有五种算法:

1. 叉积法面积法(适用于凸包)

2. 射线法,直线法 最坏时间O(n), 通常都可以达到常数基数时间

3.回转数(也叫旋转角)法

4.改进弧长法(转角法的改进版),精度比较高

5.以多边形上的顶点划分空间网格的方法(自创,理论未完善)

下面要讨论一个在线的算法

假设求得三个點在多边形n内,对三个点连线成一个内多边形m如果再来一个点p,先判断多边形p是否在m内如果p在 n内,m外,

则p与m组成新的内多边形再来一點Q,仿照P的求法对Q及后面的要计算的点,做统计

这样一种以空间换时间 的动态规划的思想。是否可行还在研究中,期待有网友发表┅下评论

我要回帖

更多关于 判断多边形 的文章

 

随机推荐