Получить пиксельные координаты элемента на карте в UWP

Итак, у меня есть карта. На нем у меня есть некоторые элементы XAML, расположенные по геолокации. Мне нужно найти их координаты в пикселях, чтобы определить, когда они перекрывают друг друга (для целей группировки). Кажется, я не могу найти способ. Если я получаю MyMap.MapItems, я получаю только набор объектов, которые я привязал к карте. Любые идеи, как это сделать?


person Community    schedule 26.08.2016    source источник
comment
Если ваш вопрос касается MapControl UWP, у него есть GetOffsetFromLocation, который преобразует географическое положение в точку на карте. Не нужно делать никаких расчетов самостоятельно.   -  person Clemens    schedule 26.08.2016


Ответы (2)


Хороший вопрос. У меня на данный момент была такая проблема. Вот статья, которая описывает именно то, что вам нужно сделать. https://msdn.microsoft.com/en-us/library/bb259689.aspx?f=255&MSPPError=-2147217396

код, если у вас нет времени его читать:

    private const double EarthRadius = 6378137;
    private const double MinLatitude = -85.05112878;
    private const double MaxLatitude = 85.05112878;
    private const double MinLongitude = -180;
    private const double MaxLongitude = 180;

private static double Clip(double n, double minValue, double maxValue)
            {
                return Math.Min(Math.Max(n, minValue), maxValue);
            }

public static uint MapSize(int levelOfDetail)
        {
            return (uint) 256 << levelOfDetail;
        }
public static void LatLongToPixelXY(double latitude, double longitude, int levelOfDetail, out int pixelX, out int pixelY)
        {
            latitude = Clip(latitude, MinLatitude, MaxLatitude);
            longitude = Clip(longitude, MinLongitude, MaxLongitude);

            double x = (longitude + 180) / 360; 
            double sinLatitude = Math.Sin(latitude * Math.PI / 180);
            double y = 0.5 - Math.Log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI);

            uint mapSize = MapSize(levelOfDetail);
            pixelX = (int) Clip(x * mapSize + 0.5, 0, mapSize - 1);
            pixelY = (int) Clip(y * mapSize + 0.5, 0, mapSize - 1);
        }
person Alex    schedule 26.08.2016
comment
Ничего себе, много математики, вовлеченной в это. Спасибо. Дай мне попробовать - person ; 26.08.2016
comment
Это сработало как шарм. Кому интересно: он получает координаты пикселей относительно карты, а не фрейма приложения, что приятно. - person ; 26.08.2016
comment
Для пояснения, это реализует обратное преобразование проекции Меркатора, которая используется всеми распространенными картами. контроль, напр. MapControl UWP. - person Clemens; 26.08.2016

Почему бы не использовать предложение @Clemens относительно метод GetOffsetFromLocation?

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

person S. Matthews    schedule 08.09.2016