Как увеличить масштаб, чтобы поместиться в элемент управления WP7 Bing Maps с помощью LocationCollection? - PullRequest
8 голосов
/ 14 января 2011

Как увеличить масштаб элемента управления Microsoft.Phone.Controls.Maps.Map до нужного уровня масштабирования в Windows Phone 7?

У меня есть LocationCollection GeoCoordinates, и я сам рассчитал центр, но теперь, как мне рассчитать правильный уровень масштабирования, чтобы соответствовать LocationCollection?

P.S. Есть ли какой-либо из готовых методов для расчета центра GeoCoordinates, поэтому мне не нужно вычислять его самому?

EDIT: Я нашел другое прекрасное решение: http://4mkmobile.com/2010/09/quick-tip-position-a-map-based-on-a-collection-of-pushpins/

map.SetView(LocationRect.CreateLocationRect(points));

Ответы [ 3 ]

8 голосов
/ 14 января 2011

Вы можете использовать следующий код для вычисления LocationRect, который ограничивает набор точек, а затем передать LocationRect методу SetView() в элементе управления карты:

var bounds = new LocationRect(
    points.Max((p) => p.Latitude),
    points.Min((p) => p.Longitude),
    points.Min((p) => p.Latitude),
    points.Max((p) => p.Longitude));
map.SetView(bounds);

Элемент управления картой обрабатывает анимацию с текущей позиции на новую.

ПРИМЕЧАНИЕ. Вам понадобится оператор using для System.Linq, чтобы получить методы Min и Max.

1 голос
/ 14 января 2011

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

 double north, west, south, west;

 north = south = points[0].Latitude;
 west = east = points[0].Longitude;

 foreach (var p in points.Skip(1))
 {
     if (north < p.Latitude) north = p.Latitude;
     if (west > p.Longitude) west = p.Longitude;
     if (south > p.Latitude) south = p.Latitude;
     if (east < p.Longitude) east = p.Longitude
 }
 map.SetView(new LocationRect(north, west, south, east));
0 голосов
/ 11 ноября 2013

Как подсказывают другие ответы, я использую SetView с LocationRect.

Однако я обнаружил, что это всегда приводит к низкому уровню масштабирования, поскольку использовались только целые значения.Например, если идеальный уровень масштабирования будет 5,5, вы получите 5,0.Для правильной подгонки я вычисляю новый уровень масштабирования из TargetZoomLevel и TargetBoundingRectangle:

viewRect = LocationRect.CreateLocationRect(coordinates);
map.SetView(viewRect);
double scale = map.TargetBoundingRectangle.Height/viewRect.Height;
map.ZoomLevel = map.TargetZoomLevel + Math.Log(scale, 2);

. В этом примере устанавливается уровень масштабирования, соответствующий высоте viewRect на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...