Как проверить, находится ли местоположение в MapPolygon в элементе управления Silverlight Bing Maps? - PullRequest
4 голосов
/ 10 июля 2010

У меня есть MapPolygon, который покрывает определенную область в элементе управления Silverlight Bing Maps, и я хотел бы знать, находится ли определенное местоположение в этом MapPolygon.

Я пробовал следующий код, который делает 't вернуть желаемый результат, потому что он только проверяет, является ли проверенное местоположение одной из вершин MapPolygon, и не проверяет, содержится ли это расположение в этом MapPolygon.

polygon.Locations.Contains(new Location(this.Site.Latitude, this.Site.Longitude, this.Site.Altitude));

Возможно ли это такжеопределить, пересекаются ли два MapPolygons друг с другом?

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Полигон. Расположение - это список точек, определяющих полигон.

Вы должны создать метод, чтобы определить, находится ли ваша точка внутри многоугольника.

Используйте что-то вроде этого (не проверяется, если компилируется):

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 
}
3 голосов
/ 19 июля 2010

Конечно, обе эти вещи довольно тривиальны, взгляните на следующую статью.http://msdn.microsoft.com/en-us/library/cc451895.aspx Это дает хорошие методы для Bounding Box, Radius и Polygon Search.Особенность обратите внимание на метод pointInPolygon.

...