检测地理位置是不是在复杂多边形中
Posted
技术标签:
【中文标题】检测地理位置是不是在复杂多边形中【英文标题】:Detect if geolocation is in complex polygon or not检测地理位置是否在复杂多边形中 【发布时间】:2013-10-17 09:54:55 【问题描述】:我们目前正在使用以下算法来检测地理点是否位于复杂多边形内。这可以正常工作,除非多边形穿过 180° 经线。
例如在多边形 160,65,0 160,15,0 -160,15,0 -160,65,0 160,65,0 中未检测到点 (-170, 60)
看下图: [图片]http://tinypic.com/r/14x2xl1[/img] 我想要红色框中的所有内容。不是黄框!
public static bool IsCoordinateInPolygon(IList<KMLCoordinate> polygon, KMLCoordinate testPoint)
bool result = false;
int j = polygon.Count - 1;
for (int i = 0; i < polygon.Count; i++)
if (polygon[i].Latitude < testPoint.Latitude && polygon[j].Latitude >= testPoint.Latitude || polygon[j].Latitude < testPoint.Latitude && polygon[i].Latitude >= testPoint.Latitude)
if (polygon[i].Longitude + (testPoint.Latitude - polygon[i].Latitude) / (polygon[j].Latitude - polygon[i].Latitude) * (polygon[j].Longitude - polygon[i].Longitude) < testPoint.Longitude)
result = !result;
j = i;
return result;
有人有更好的算法吗?
【问题讨论】:
en.wikipedia.org/wiki/Point_in_polygon 如果你有一个跨越+/- 180
的多边形,只需将所有经度偏移+180
。点是否在多边形内部都不会受到这种变换的影响。你甚至不需要测试多边形的位置和偏移,如果它笨拙,你可以为所有测试进行转换
球体表面的多边形将球体分成两个区域。您如何确定哪个区域是“内部”,哪个区域是“外部”? (在平面上这很容易:无限的在外面)
请更正图片。它不会起作用。
【参考方案1】:
球坐标系有它的怪癖
为了避免它们,请改用 3D 正交/正交笛卡尔坐标系
转换多边形顶点和地理位置
所以(long,lat,alt) -> (x,y,z)
。 here 你知道怎么做。您不需要只应用第一个球面到 3D 笛卡尔变换的局部变换(项目符号 #1。)
使用任何内部多边形测试...
我通常会计算从您的地理位置投射到任何方向的线与多边形边界线之间的交叉点数。
如果是奇数则点在里面 如果是偶数,则该点在外面 如果点位于多边形的任何一条线上,那么它在里面 如果您的投射线击中任何顶点,请记住(不要计算该顶点的多次击中)或稍微改变方向并重试[备注]
别忘了把所有的都当作 3D 向量而不是 2D 来处理!!!
【讨论】:
以上是关于检测地理位置是不是在复杂多边形中的主要内容,如果未能解决你的问题,请参考以下文章
斯威夫特:多边形中的点?如何检查用户的位置是不是在 Geo-JSON 多边形内?