我们目前正在使用以下算法来检测地理点是否在复杂多边形内。这工作正常,除非多边形穿过 180° 经线。
例如在多边形 160,65,0 160,15,0 -160,15,0 -160,65,0 160,65,0 中未检测到点 (-170, 60)
请看下图: [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;
}
有没有人有更好的算法?
最佳答案
球坐标系有它的怪癖
为避免它们,请改用3D 正交/正交笛卡尔坐标系
转换您的多边形顶点和地理位置
所以
(long,lat,alt) -> (x,y,z)
。 here你会找到怎么做的。您不需要仅将第一个球面应用局部变换到 3D 笛卡尔变换(项目符号 #1。)使用任何内部多边形测试...
我通常会计算从您的地理位置转换到任何方向的线与多边形边界线之间的交点数。
- 如果是奇数则点在里面
- 如果是偶数则点在外面
- 如果点在多边形的任何一条线上则它在里面
- 如果您的 throw 线击中任何顶点,则请记住(不要计算该顶点的多次击中)或稍微改变方向并重试
[注释]
不要忘记将所有内容都视为 3D 矢量而不是 2D !!!
关于c# - 检测地理位置是否在复杂的多边形中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19423472/