2016-07-25 6 views
1

This article описывает, как получить общий размер карты в пикселях в зависимости от фактического уровня масштабирования.MapControl map size (pixels)

Формула должна быть:

карта ширина = карта пикселей высота = 256 * 2^уровень

К сожалению, это не похоже на работу для MapControl для универсальных приложений. Во-первых, свойство ZoomLevel имеет тип double not integer (как требуется в примере в статье). Но также с целым числом ZoomLevel, то есть 4.0 (int -> 4), формула не работает.

Теперь, я попытался получить размер карты в пикселях с помощью метода MapControl.GetOffsetFromLocation:

private double GetMapSize() 
    { 
     Point pW, pE; 

     myMap.GetOffsetFromLocation(new Geopoint(new BasicGeoposition() 
      { Longitude = -90, Latitude = 0 }), out pW); 
     myMap.GetOffsetFromLocation(new Geopoint(new BasicGeoposition() 
      { Longitude = 90, Latitude = 0 }), out pE); 

     return (pE.X - pW.X) * 2; 
    } 

Это работает с несоответствием некоторых пикселей, но этот вопрос на самом деле не имеет значения.

я получаю на моей поверхности Pro 3 следующие результаты (ZoomLevel 4,0):

Поверхность экрана (масштаб 1,5): 3654px

поверхности внешнего экрана (масштаб 1,0): 3274px

None из этих результатов 4096px, как описано в статье. Результаты верны, и я могу с этим справиться. Но для меня это всего лишь обходной путь, а также если ZoomLevel выше, чем приблизительно 13, метод GetOffsetFromLocation возвращает -1 для pE.X и pW.X (для -90 и 90). Для ближайших долготы к фактическому центру это работает. Кажется, что GetOffsetFromLocation имеет максимальное расстояние. Поэтому мне нужно будет использовать более близкие значения долготы при более высоком ZoomLevel.

Это не совсем четкое решение. Так что мой вопрос: Есть ли способ сохранения, чтобы получить точный размер карты в пикселях для UWP MapControl?

Спасибо!

Maas

ответ

1

В статье вы ссылаетесь была написана годами назад и является основой для системы карты плиточной во всех элементах управления Bing Maps. Однако это относится к системе черепицы и необязательно отображаемой карте. Элемент управления UWP изменяет способ выравнивания с плотностью пикселей вашего экрана, чтобы он был приятным и понятным. Вот почему вы видите расхождения между ожидаемым размером пикселя карты при использовании GetOffsetFromLocation. Я полагаю, что UWP контролирует базовую плотность пикселей, используемую для вычислений, составляет 128. Surface Pro 3 имеет плотность пикселей 216,33. Таким образом, с небольшим количеством математики и с учетом масштабирования 1.5, мы видим, что (128 * 1.5) /216.33*4096 = 3635, что намного ближе к значениям, которые вы вычисляете с помощью вашего метода. Имея это в виду, я бы оценил, что плотность пикселей вашего внешнего экрана 4096/3274 * 128 = 160.

А:

map width = map height = 256 * 2^zoom; 

Это работает с двойниками тоже. Старый элемент управления Bing Maps Silverlight также позволил получить двойной уровень масштабирования, и это отлично срабатывало при выполнении вычислений пикселей.

+0

Я немного поиграю с этим. Благодаря! Но нет, мой экран имеет плотность пикселей 91. Из Windows.Graphics.Display.DisplayInformation.GetForCurrentView(): Экран поверхности -> ЛогическийDpi: 144 | RawDpi: 216 | Масштаб: 1,5 Внешний экран -> ЛогическийDpi: 96 | RawDpi: 91 | Масштаб: 1,0 – Maas