Начертайте познат пиксел (x,y) от оригиналното изображение с помощта на персонализирани WPF плочки на Bing Maps

Опитвам се да използвам контролата на Bing Maps WPF, за да изобразя персонализирани плочки на картата от изображение на измислена карта на света на играта, но също така трябва да начертая X,Y стойности на картата от оригиналното изображение на света (нещо като ин- световен GPS).

Изображението е 5720x5720 и вече имам работеща (в друго приложение) функция, която ръчно изрязва, мащабира и преначертава секции от изображението и начертава координатите pixelX и pixelY в PictureBox. Бих искал да накарам същата функционалност да работи с помощта на контролата на картата.

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

Проблемът е, че знам стойностите на X, Y за начертаване от оригиналното изображение, но не съм съвсем сигурен как да изчисля Lat/Long за чертане на точка в персонализираната система за плочки.

<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 показва персонализираните ви плочки на картата без изкривяване, изглежда очевидно, че вашата карта също използва трансформация на Mercator. Няма нужда да използвате нищо друго освен вградените координатни трансформации.   -  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) от дължина = -180..180 и широчина = -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) Картографирайте вашата карта на играта към изкуствения свят с координати Lat/Lon

В този случай вие ще нанесете световните координати на вашите пикселни координати. Плочките трябва да бъдат подготвени по правилен начин, като тези за реални карти на света.

За да създадете плочки с MapTiler, трябва да изпълните следните стъпки:

  1. Изберете "Плочки Меркатор" в първата стъпка
  2. Пуснете вашия файл с изображение
  3. Изберете "Web mercator (EPSG:3857)" от падащото меню в диалоговия прозорец "Координатна система" - това е квадратно изображение на целия свят и не искате да го деформирате.
  4. Изберете „Ограничаващо поле (запад, югоизток, север)“ в диалоговия прозорец „Географско местоположение“ и копирайте и поставете във входните координати на света: „-20037508.342789244 -20037508.342789244 20037508.342789244 20037508.342789244“
  5. Изобразете плочките

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

B) Останете в растерни координати

Различен подход - където създавате плочките на картата в оригиналните растерни координати на входния файл. Не са включени Lat/Lon, координатната система е в пиксели и можете да рисувате маркери и полигони и в пикселни координати. MapTiler ви дава примерен инструмент за преглед на JavaScript в Leaflet и в OpenLayers. Други зрители, които трябва да закърпите сами за използване с пикселни координати. За да генерирате плочките, просто изберете „Растерни плочки“ – както в този урок: http://youtu.be/9iYKmRsGoxg?list=PLGHe6Moaz52PiQd1mO-S9QrCjqSn1v-ay Очаквам плочките, направени с вашия Photoshop плъгин, да бъдат подобни на растерните координати, направени с MapTiler.

person Klokan Technologies    schedule 02.02.2015