我有一个MapPolygon,它覆盖了Silverlight Bing Maps控件上的某个区域, 我想知道一个特定的位置是否位于这个MapPolygon中。
我已经尝试了以下代码,它不会返回我想要的结果,因为它只检查测试位置是否是MapPolygon的顶点之一,并且不检查此位置是否包含在此MapPolygon中。 / p>
polygon.Locations.Contains(new Location(this.Site.Latitude, this.Site.Longitude, this.Site.Altitude));
是否也可以确定两个MapPolygons是否相互交叉?
答案 0 :(得分:3)
当然这两件事都相当简单,请看下面的文章。 http://msdn.microsoft.com/en-us/library/cc451895.aspx它为Bounding Box,Radius和Polygon Search提供了很好的方法。特殊性注意pointInPolygon方法。
答案 1 :(得分:3)
polygon.Locations是定义多边形的点列表。
您必须创建一个方法来查找您的点是否在多边形内。
使用类似的东西(如果编译则不测试):
static bool PointInPolygon(LocationCollection polyPoints, Location point)
{
if (polyPoints.Length < 3)
{
return false;
}
bool inside = false;
Location p1, p2;
//iterate each side of the polygon
Location oldPoint = polyPoints[polyPoints.Count - 1];
foreach(Location newPoint in polyPoints)
{
//order points so p1.lat <= p2.lat;
if (newPoint.Latitude > oldPoint.Latitude)
{
p1 = oldPoint;
p2 = newPoint;
}
else
{
p1 = newPoint;
p2 = oldPoint;
}
//test if the line is crossed and if so invert the inside flag.
if ((newPoint.Latitude < point.Latitude) == (point.Latitude <= oldPoint.Latitude)
&& (point.Longitude - p1.Longitude) * (p2.Latitude - p1.Latitude)
< (p2.Longitude - p1.Longitude) * (point.Latitude - p1.Latitude))
{
inside = !inside;
}
oldPoint = newPoint;
}
return inside;
}
并称之为:
if (PointInPolygon(polygon.Locations, new Location(this.Site.Latitude, this.Site.Longitude, this.Site.Altitude)))
{
//do something
}