Как поместить несколько круговых оверлеев в элемент управления Bing Map WP7? - PullRequest
3 голосов
/ 09 сентября 2011

Я хочу поместить несколько (прозрачных) кругов в элемент управления Bing Map Control в качестве оверлеев. Подумайте о «радиусе взрыва» или «сфере влияния». Мне понадобится как минимум два десятка таких кругов на карте, вместе с некоторыми другими полигонами, поэтому, чтобы убедиться, что производительность не пострадает, а карты по-прежнему легко манипулировать, это кажется ключевым моментом здесь.

Пока я могу вспомнить три варианта (из которых я попробовал два):

  • Добавьте n-сторонние MapPolygon экземпляров на карту для каждого круга. Пробовал это, и работает нормально в принципе. Тем не менее, количество вершин на многоугольник немного рассеяно. Слишком мало, и при увеличении это выглядит отвратительно. Слишком много, и производительность начнет страдать.

  • Добавьте Pushpin экземпляров для каждого круга и задайте их стиль / шаблон в виде круга, центрированного вокруг положения метки. Кажется, работает, за исключением того, что размер цикла затем фиксируется по размеру экрана, а не по размеру карты. Поэтому при масштабировании круги остаются на экране одинакового размера, в то время как они должны увеличиваться вместе с картой. Можете ли вы каким-либо образом привязать размер элемента управления Ellipse (в шаблоне в стиле, который я использую) к Zoom элемента управления родительской карты ..?

  • Создайте пользовательский подкласс MapShapeBase для представления каждого круга. Эта реализация может динамически изменять количество вершин, используемых для рисования многоугольника, в зависимости от того, видна ли фигура на карте или нет (= внутри текущего порта просмотра) и каков уровень масштабирования. То есть, если фигуры карты имеют доступ к этой информации. Я еще не пробовал эту опцию.

Что вы использовали? Что бы вы использовали? Как бы вы обошли проблемы, упомянутые выше, , особенно связывая свойство элемента управления в шаблоне, используемом в стиле, со свойством родительского элемента управления, используя XAML ? Или у вас есть другие варианты, которые я мог бы попробовать заставить это работать?

Ответы [ 3 ]

1 голос
/ 09 сентября 2011

В RunKeeper мы использовали первый параметр и привязали свойство Locations к LocationCollection с 360 точками, созданными следующим образом:

protected void UpdateAccuracyCircle()
{
    var location = this.CurrentLocation;
    if (null != location)
    {
        var lat = location.Latitude * (Math.PI / 180);
        var lng = location.Longitude * (Math.PI / 180);
        var d = (this.Accuracy / 1000.0) / Constants.EarthRadius;
        var circle = new LocationCollection();

        for (int x = 0; x <= 360; x++)
        {
            var brng = x * (Math.PI / 180);
            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));

            circle.Add(
                new GeoCoordinate(
                    latRadians * (180 / Math.PI),
                    lngRadians * (180 / Math.PI)));
        }

        Dispatcher.BeginInvoke(() => this.AccuracyCircle = circle);
    }
}

В этом случае мы имеем дело только с одним кругом (для индикации точности), поэтому может быть не особенно эффективным, если вам нужно несколько кругов.

Учитывая, что логика для создания круга находится в коде в этом примере, я думаю, вы могли бы легко настроить логику, чтобы использовать больше/ меньше очков на основе ZoomLevel для соответствия варианту 3.

0 голосов
/ 23 сентября 2011

Я предлагаю вам отойти от элементов управления Bing Map и начать использовать ESRI Silverlight / WP7 Toolkit. У них гораздо больше доступных элементов управления, которые вы можете использовать "из коробки".

http://help.arcgis.com/en/arcgismobile/10.0/apis/windowsphone/

Вот все образцы: http://help.arcgis.com/en/arcgismobile/10.0/apis/windowsphone/samples/start.htm

Для загрузки SDK вам понадобится аккаунт, но он бесплатный (для регистрации и загрузки).

0 голосов
/ 20 сентября 2011

Я бы предложил использовать холст в качестве наложения с прозрачным фоном, а затем добавить к нему объекты эллипса, используя метод, аналогичный описанному здесь .

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

...