Постройте известный пиксель (x, y) из исходного изображения с помощью пользовательских плиток Bing Maps WPF

Я пытаюсь использовать элемент управления WPF Bing Maps для рендеринга пользовательских фрагментов карты из изображения вымышленной карты игрового мира, но мне также нужно нанести значения X, Y на карту из исходного изображения мира (вроде как in- мировой GPS).

Размер изображения 5720x5720, и у меня уже есть работающая (в другом приложении) функция, которая вручную обрезает, масштабирует и перерисовывает разделы изображения и строит координаты pixelX и pixelY в PictureBox. Я хотел бы, чтобы такая же функциональность работала с использованием элемента управления картой.

Я использовал этот плагин Photoshop, чтобы вырезать плитки из исходного пользовательского изображения (работает как maptiler для карт Google) https://github.com/bramus/photoshop-google-maps-tile-cutter/

Проблема в том, что я знаю значения X, Y для построения графика из исходного изображения, но я не совсем уверен, как рассчитать Широту / Долготу для рисования точки в пользовательской системе тайлов.

<m:Map Name="Map">
        <m:Map.Mode>
            <!-- set empty map mode, i.e. remove default map layer -->
            <m:MercatorMode/>
        </m:Map.Mode>
        <local:MyTileLayer UriFormat="file:///C:/map_tiles/{z}_{x}_{y}.jpg"/>
</m:Map>

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

https://msdn.microsoft.com/en-us/library/bb259689.aspx

Мои пользовательские фрагменты карты на самом деле предназначены для вымышленной карты для игры, поэтому я не верю, что в моей ситуации нужны вычисления проекции и кривизны Земли.

Как я могу точно построить точку в элементе управления WPF Bing Maps, если я знаю только координаты X, Y пикселей из исходного необработанного изображения?


person Josh    schedule 01.02.2015    source источник
comment
Когда элемент управления Bing Maps отображает ваши пользовательские фрагменты карты без искажения, кажется очевидным, что ваша карта также использует преобразование Меркатора. Нет необходимости использовать ничего, кроме встроенных преобразований координат.   -  person Clemens    schedule 01.02.2015
comment
Я также пробовал использовать ArielMode и Road, но все они дают неправильную точку, в которой я знаю, что пиксель X, Y находится на исходном изображении. Я пробовал каждый режим как с Map.ViewportPointToLocation, так и с TileSystem.PixelXYToLatLong. TileSystem.PixelXYToLatLong по крайней мере рисует точку, которая находится на карте (хотя все еще неверно), Map.ViewPortPointToLocation даже не указывает координаты местоположения на карте.   -  person Josh    schedule 02.02.2015


Ответы (2)


Учитывая, что ваше изображение карты 5720x5720 пикселей покрывает стандартный диапазон координат Bing Maps (или Google Maps или OpenStreetMap): longitude = -180..180 и latitude = -85.0511..85.0511 , следующий метод преобразует пиксельные координаты изображения в широту / долготу в соответствии с проекцией Меркатора:

public static void PixelXYToLatLon(
    double pixelX, double pixelY, out double latitude, out double longitude)
{
    var imageSize = 5720d;
    var maxLatitude = 85.05112878; // = Math.Atan(Math.Sinh(Math.PI)) / Math.PI * 180d;
    var y = (0.5 - pixelY / imageSize) * (2d * maxLatitude);
    latitude = Math.Atan(Math.Sinh(y * Math.PI / 180d)) / Math.PI * 180d;
    longitude = (pixelX / imageSize - 0.5) * 360d;
}

Переменная imageSize, конечно, также может быть параметром метода.

person Clemens    schedule 01.02.2015

Если вы используете MapTiler (http://www.maptiler.com) для создания листов, у вас есть два способа достичь желаемого:

A) Сопоставьте свою игровую карту с искусственным миром с координатами широты и долготы.

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

Чтобы создать тайлы с помощью MapTiler, вы должны выполнить следующие шаги:

  1. Выберите "плитки Меркатора" на первом этапе.
  2. Перетащите свой файл изображения
  3. Выберите «Web mercator (EPSG: 3857)» в раскрывающемся списке диалогового окна «Система координат» - это квадратное изображение всего мира, и вы не хотите его деформировать.
  4. Выберите «Граничная рамка (запад, юго-восток, север)» в диалоговом окне «Географическое положение» и скопируйте и вставьте во входные данные мировые координаты: «-20037508.342789244 -20037508.342789244 20037508.342789244 20037508.342789244»
  5. Рендеринг плитки

При таком подходе вы можете загружать плитки в элемент управления WPF Bing Maps и размещать маркеры или другие данные, используя координаты широты и долготы. Точка [0,0] будет центром изображения, и вы можете соответствующим образом вычислить другие координаты широты и долготы. См. Эту страницу и исходный код внизу на странице: http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/ Код globalmaptiles.py, встроенный в страницу, доступен на разных языках, включая C # (.cs), если вам это нужно. Он был перенесен другими людьми из нашего кода.

Б) Оставайтесь в растровых координатах

Другой подход - когда вы создаете листы карты в исходных растровых координатах входного файла. Широта / долгота не используются, система координат - в пикселях, и вы также можете рисовать маркеры и многоугольники в пиксельных координатах. MapTiler предоставляет образец средства просмотра JavaScript в Leaflet и OpenLayers. Другие программы просмотра, которые вы должны использовать самостоятельно, с пиксельными координатами. Чтобы сгенерировать плитки, просто выберите «Растровые плитки» - как в этом руководстве: http://youtu.be/9iYKmRsGoxg?list=PLGHe6Moaz52PiQd1mO-S9QrCjqSn1v-ay Я ожидаю, что плитки, созданные с помощью вашего плагина Photoshop, будут похожи на координаты растра, созданные с помощью MapTiler.

person Klokan Technologies    schedule 02.02.2015