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

10

У меня есть карта отсюда . Я хочу иметь возможность просто конвертировать произвольную пару 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 (пара lon / lat) в географическую проекцию (не они ли?). Мне кажется, что они на самом деле одинаковы, но радиус сферы в приведенной выше информации о проекции составляет 6370997 и отличается от страницы, которую я нашел для проекции Plate Carree. В любом случае, я обнаружил, что библиотека DotSpatial.Projection может сделать это для меня с помощью следующего кода:

    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);

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

изображение википедии

Но, похоже, что в мире есть градусы, а не метры, и я не знаю, что с ними делать. Вообще, я делаю правильные вещи? Или есть более простой способ, учитывая мои данные?

Дмитрий Марчук
источник
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.02222222222222, -0.02222222222222

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

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

две вышеупомянутые псевдофункции сообщают нам геолокацию (geox, geoy) для данной позиции пикселя и, я думаю, это то, о чем вы просили, позицию пикселя для данной геолокации. Это возможно только потому, что «пластина Carree» обрабатывает географические градусы с долготой и широтой как метрические координаты на плоскости (в прямоугольной системе координат). Если бы вы нарисовали сетку Земли, вы бы получили квадраты одинакового размера (и именно так выглядит ваша карта). После редактирования моих ошибок, теперь я получаю с lon / lat (50.4546600, 30.5238000), я получаю (10370.459803704598, 2676.42902676429). Приведите его к целому числу, если вам нужен пиксельный индекс.

Андреас Мюллер
источник
px = (geox + xOff) / xsizeдля вашего примера будет (50.4546600 + (-180)) / 0.02222222222222отрицательным и примерно равен 5830. Которого нет 2113.3936363636362. Пожалуйста, объясните дальше или исправьте ответ.
Дмитрий Марчук
Исходный код был в javascript с некоторыми зависимостями, я проверю ...
Андреас Мюллер
Я изменил код и текст выше, потому что у меня была ошибка при копировании из JavaScript.
Андреас Мюллер