Перетворіть на карті довготу / широту в пікселі


11

У мене є карта від тут . Я хочу мати можливість просто перетворити довільну пару lon / lat у пікселі (також можливість зробити зворотне перетворення). Карти мають інформацію про файл .tfw та інформацію про проекцію, ось він:

0.02222222222222 
0.00000000000000 
0.00000000000000 
-0.02222222222222 
-180.00000000000000 
90.00000000000000

та прогнозована інформація:

Projection: Plate Carree aka Geographic or "LatLong"
Earth ellipsoid: Sphere, radius 6370997 m
Datum: WGS84
Extent: 180 West to 180 East, 90 North to 90 South
Size: 16,200 height samples wide x 8,100 high
Resolution: 2.47 km/pixel

Я абсолютно новачок, пов'язаний з картографією, і, наскільки я зрозумів, спершу я повинен зробити перетворення з WGS84 (пара лон / лат) в географічну проекцію (чи не вони однакові?). Мені здається, що вони насправді однакові, але радіус сфери в інформації про проекцію вище 6370997 і відрізняється від сторінки простореференції.com, яку я знайшов для проекції Plate Carree. У будь-якому випадку, я знайшов, що бібліотека DotSpatial.Projections може це зробити для мене, з таким кодом:

    var kievCoordinates = new[] { 50.4546600, 30.5238000 };
    var z = new[] { 1.0 };

    var wgs84 = KnownCoordinateSystems.Geographic.World.WGS1984;
    var dest = new ProjectionInfo();
    dest.ParseEsriString(
        "PROJCS[\"WGS 84 / Plate Carree (deprecated)\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Equidistant_Cylindrical\"],PARAMETER[\"central_meridian\",0],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1]]");

    Reproject.ReprojectPoints(kievCoordinates, z, wgs84, dest, 0, 1);

І тоді я повинен перевести отримані координати в пікселі на карті за допомогою файлу world. Мені відомо наступна формула:

Вікіпедія зображення

Але здається, що у світовому файлі є градуси не метри, і я не знаю, що з ними робити. Взагалі, чи я роблю правильно? Або є більш простий спосіб, враховуючи мої дані?


1
Спираючись на світовий файл, растр використовує широту-довготу та градуси як одиниці. Розмір клітини 0,0222 градуса. Це іноді відоме як псевдоплати Керрі. Plate Carree міг би масштабувати та перетворювати значення в метри. Також поєднання даних називається WGS84, але згадується сфера з радіусом = 6370997. Спроба використання WKID: 4326.
mkennedy

@mkennedy Я думаю, що вищезазначена формула, застосована до світового файлу, не призвела б до чогось значущого, оскільки вона була розроблена для лічильників? Я також не знаю і гуглю без жодного результату, що означає WKID: 4326.
Дмитро Марчук

Відповіді:


6

Між координатами, а не в положення пікселів, немає трансформації, як це: ми вважаємо, що px, py - це піксельна позиція на вашій карті, тоді як geox та geoy - це координати реального світу. У нас також є xOff, yOff, взяті з tfw, з -180, 90 плюс xsize та ysize, з 0,0222222222222222, -0,022222222222222

pix2coord(px,py)
    geox = xOff + (px * xsize)
    geoy = yOff + (py * ysize)

coord2pix(geox, geoy)
    px = (geox - xOff) / xsize 
    py = (geoy - yOff) / ysize

вищевказані дві псевдофункції повідомляють нам про геолокацію (geox, geoy) для заданої позиції пікселів, і, я думаю, це те, що ви просили, положення пікселів для даного геолокації. Це можливо лише тому, що "плита Карі" розглядає географічні градуси з довготою та широтою як метричні координати на площині (в межах прямокутної системи координат). Якби ви намалювали сітку землі, ви отримали б однакові за розмірами квадрати (І саме так виглядає ваше зображення карти). Після редагування моїх помилок тепер я отримую з lon / lat (50.4546600, 30.5238000) я отримую (10370.459803704598, 2676.42902676429). Передайте це ціле число, якщо вам потрібні пікселі.


px = (geox + xOff) / xsize, для вашого прикладу було б (50.4546600 + (-180)) / 0.02222222222222негативне значення і приблизно дорівнює 5830. Що ні 2113.3936363636362. Будь ласка, поясніть далі чи виправте відповідь.
Дмитро Марчук

Оригінальний код був у javascript з деякими залежностями, я перевірю ...
Андреас Мюллер

Я змінив код і Текст вище, тому що сталася помилка при його копіюванні з JavaScript.
Андреас Мюллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.