Создание масштабированного круга карты - PullRequest
3 голосов
/ 30 декабря 2010

Подобные вопросы задавались здесь несколько раз, но ни один из них, похоже, не дает мне именно то, что я хочу. Я работаю с элементом управления Bing Map в Windows Phone, и я хотел бы добавить эллипс, который правильно масштабируется с изменениями масштаба. Это можно сделать с помощью полилиний и многоугольников, но нет типа эллипса, полученного из MapShapeBase. Я пробовал разные способы сделать это, но им нужно поиграться с размерами пикселов и придумать математику, чтобы выровнять ее с географическими координатами. Я хочу создать эллипс с центром и размерами x / y в метрах, а остальное сделает каркас. Кажется, все так просто. Я что-то пропустил? Другой мой подход - нарисовать 365 сегментов линии в виде ломаной линии, но это выглядит ужасно уродливо, и, поскольку центр может двигаться, мне нужно привязать расположение каждого сегмента. Это кажется очень тяжелым. Есть еще мысли?

[В частности, я хочу добавить индикатор «Точность GPS» в виде круга вокруг текущего местоположения.]

1 Ответ

5 голосов
/ 26 июля 2011

Обновление

В Mango телефон автоматически показывает такой круг.

Оригинальная почта

Это довольно просто. Вы просто используете элемент управления Pushpin для рисования с помощью.

1) Добавьте MapLayer к вашему элементу управления:

<maps:MapLayer>
    <maps:MapPolygon Fill="Gray"
                        IsHitTestVisible="False"
                        Locations="{Binding AccuracyLocationCollection}"
                        Opacity="0.6"
                        Stroke="Black"
                        StrokeThickness="2" />
</maps:MapLayer>

2) Добавьте свойство AccuracyLocationCollection в свою модель представления

public LocationCollection AccuracyLocationCollection
{
    get;
    set;
}

3) В обработчике событий GeoCoordinateWatcher_PositionChanged вычислите размер круга и установите значение AccuracyLocationCollection

ViewModel.AccuracyLocationCollection = DrawMapsCircle(e.Position.Location);

4) Код для DrawMapsCircle выглядит следующим образом:

приватный статический двойной ToRadian (двойной градус) { обратные градусы * (Math.PI / 180); }

private static double ToDegrees(double radians)
{
    return radians * (180 / Math.PI);
}

public static LocationCollection DrawMapsCircle(GeoCoordinate location)
{
    double earthRadiusInMeters = 6367.0 * 1000.0;
    var lat = ToRadian(location.Latitude);
    var lng = ToRadian(location.Longitude);
    var d = location.HorizontalAccuracy / earthRadiusInMeters;

    var locations = new LocationCollection();

    for (var x = 0; x <= 360; x++)
    {
        var brng = ToRadian(x);
        var latRadians = Math.Asin(Math.Sin(lat) * Math.Cos(d) + Math.Cos(lat) * Math.Sin(d) * Math.Cos(brng));
        var lngRadians = lng + Math.Atan2(Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat), Math.Cos(d) - Math.Sin(lat) * Math.Sin(latRadians));

        locations.Add(new Location()
        {
            Latitude = ToDegrees(latRadians),
            Longitude = ToDegrees(lngRadians)
        });
    }

    return locations;
}

Результат: (Это рядом с моим домом, я могу подтвердить, что между дорогами примерно 3 метра, между которыми отображается серый круг)

Accuracy Circle

...