2010-12-29 3 views
3

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

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

+0

AFAIK, то API Безразлично» t возвращает данные, указывающие на точность позиционирования. Если бы это произошло, вам все равно нужно было бы увеличить масштаб, чтобы даже увидеть круг, который представляет диаметр 2-5 м. Большинство блоков GPS просто представляют это как номер где-то на экране. – Stonetip

ответ

5

Update

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

Orginal Сообщение

Это довольно легко. Вы просто используете элемент управления 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 в вашей ViewModel

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

+0

Это выглядит довольно хорошо. Похоже, что было бы дешевле, если бы я мог сделать настоящий эллипс, а не 360-точечный полигон, но я возьму то, что смогу получить. Благодаря! –

+0

Для записи в Mango это автоматически отображается, поэтому нет причин для кода самостоятельно. –

+0

@ ClausJørgensen: Я использую манго, и это не похоже на такой круг точности. Есть ли параметр, который я должен установить? –

Смежные вопросы