У меня есть карта отсюда . Я хочу иметь возможность просто конвертировать произвольную пару 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);
И тогда я должен перевести полученные координаты в пиксели на карте, используя файл мира. Мне известна следующая формула:
Но, похоже, что в мире есть градусы, а не метры, и я не знаю, что с ними делать. Вообще, я делаю правильные вещи? Или есть более простой способ, учитывая мои данные?
источник
Ответы:
Преобразование между координатами не выполняется, а в / из положения пикселей, например: мы предполагаем, что px, py - это положение пикселей на вашей карте, а geox и geoy - координаты реального мира. У нас также есть xOff, yOff, взятые из tfw, с -180, 90 плюс xsize и ysize, с 0.02222222222222, -0.02222222222222
две вышеупомянутые псевдофункции сообщают нам геолокацию (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
. Пожалуйста, объясните дальше или исправьте ответ.