Мини обзорная карта в приложении UWP с использованием MapControl - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь создать мини-карту обзора / ориентации, синхронизированную с полным представлением MapControl, например: ( Полный снимок экрана )

this picture

У меня возникают проблемы при попытке вычислить ширину, высоту и местоположение маленького красного прямоугольника внутри мини-карты в соответствии с размером, расположением и масштабом MapControl.

Он должен быть синхронизирован с представлением MapControl, и нажатие на маленькую карту также должно изменить центральную точку MapControl.

Полная карта - это MapControl в UWP, а мини-карта - это просто элемент Границы над статическим изображением.

Я использую следующие формулы. Они работают, но не точно. Запас ошибок довольно заметен, особенно для больших масштабов.

Для расчета местоположения и размера красного прямоугольника:

var positions = MapControl.GetVisibleRegion(MapVisibleRegionKind.Near).Positions.ToArray();
var topLeft = positions[0];
var bottomLeft = positions[1];
var topRigt = positions[2];

//Transfering the Longitude system from [-180, 180] to [0, 360]
var centerX = (MapControl.Center.Position.Longitude + 180) * (SmallMapWidth / 360);

//Transfering the Latitude system from [-90, 90] to [0, 180]
var centerY = (-MapControl.Center.Position.Latitude + 90) * (SmallMapHeight / 180);

var topLeftX = topLeft.Longitude + 180;
var topRightX = topRigt.Longitude + 180;

//MapControl wraparound by default. In that case, the topRightX might be smaller than topLeftX, as it will start from the 'beginning'.   
var deltaX = Math.Abs(topLeftX - (topLeftX < topRightX ? topRightX : 360 - topRightX));

//The width of the red rectangle
SmallMapViewPortWidth = Math.Abs(deltaX) * (SmallMapWidth / 360);

//The height of the red rectangle
SmallMapViewPortHeight = Math.Abs(topLeft.Latitude - bottomLeft.Latitude) * (SmallMapHeight / 180);

//The center point of the red rectangle.
RedRectangleCenterPoint = (centerX - SmallMapViewPortWidth / 2, centerY - SmallMapViewPortHeight / 2);

Следующее предназначено для навигации MapControl к точке, которая была нажата на обзорной карте. X и Y - это точки, которые были нажаты относительно обзорной карты.

var lon = 360 * x / SmallMapWidth - 180;
var lat = 90 - 180 * y / SmallMapHeight;

Что не так с моими вычислениями? Почему довольно заметный запас погрешности?

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