我们目前使用以下算法来检测地理点是否在复杂多边形内部。这个算法运行良好,但当多边形穿过180°经线时会出现问题。
例如,点(-170, 60)未被检测为在多边形内,而该多边形顶点坐标为160,65,0 160,15,0 -160,15,0 -160,65,0 160,65,0。
请查看以下图像: [Img]http://tinypic.com/r/14x2xl1[/img] 我想要红框内的内容,而不是黄框内的内容!
例如,点(-170, 60)未被检测为在多边形内,而该多边形顶点坐标为160,65,0 160,15,0 -160,15,0 -160,65,0 160,65,0。
请查看以下图像: [Img]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
。这种转换不会影响该点是否在多边形内。您甚至不需要测试多边形的位置和偏移是否处于奇怪的位置,您可以为所有测试执行该转换。 - High Performance Mark