【发布时间】: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;
}
有人有更好的算法吗?
【问题讨论】:
-
如果你有一个跨越
+/- 180的多边形,只需将所有经度偏移+180。点是否在多边形内部都不会受到这种变换的影响。你甚至不需要测试多边形的位置和偏移,如果它笨拙,你可以为所有测试进行转换 -
球体表面的多边形将球体分成两个区域。您如何确定哪个区域是“内部”,哪个区域是“外部”? (在平面上这很容易:无限的在外面)
-
请更正图片。它不会起作用。
标签: c# algorithm geolocation geometry