Файлы проекции шейп-файлов

Я работаю с некоторыми открытыми данными, включая шейп-файлы, и мне удалось преобразовать данные в GeoJSON и извлечь координаты точек (вместе с другой информацией). Однако координаты не являются координатами широты / долготы:

[ 368667.2455000002, 5009510.4067 ]
[ 367885.47140000015, 5019804.3237 ]
[ 395852.80260000005, 5027699.9354 ]
[ 379358.1364000002, 5036798.5747 ]
[ 351968.9621000001, 5017404.8727 ]
[ 375123.64269999973, 5033338.467499999 ]
[ 378133.7736999998, 5032617.237500001 ]
[ 385791.0351, 5010557.9144 ]
[ 349796.77770000044, 5013571.1559999995 ]
[ 367271.0566999996, 5030212.897399999 ]
[ 378808.0292999996, 5013921.017100001 ]
[ 336650.69820000045, 5039983.886399999 ]
[ 364178.05599999987, 5015957.9625 ]
[ 362715.9132000003, 5023112.371200001 ]
[ 351321.0865000002, 5013763.298699999 ]
[ 373254.0789000001, 5026533.7453000005 ]
[ 355235.6211000001, 5016957.0644000005 ]
[ 327797.9938000003, 5036758.195699999 ]
[ 362836.86930000037, 5015895.811000001 ]
[ 375479.41530000046, 5001245.2017 ]

При дальнейших исследованиях я обнаружил, что мне нужно «спроецировать» эти координаты относительно данных в файле PRJ:

PROJCS["City of Ottawa",
    GEOGCS["GCS_North_American_1983",
        DATUM["D_North_American_1983",
            SPHEROID["GRS_1980", 6378137.0, 298.257222101]
        ],
        PRIMEM["Greenwich", 0.0],
        UNIT["Degree", 0.0174532925199433]
    ],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["False_Easting", 304800.0],
    PARAMETER["False_Northing", 0.0],
    PARAMETER["Central_Meridian", -76.5],
    PARAMETER["Scale_Factor", 0.9999],
    PARAMETER["Latitude_Of_Origin", 0.0],
    UNIT["Meter", 1.0]
]

Я уже прочитал Что представляет собой файл проекции esri? и впоследствии https://gis.stackexchange.com/questions/2383/does-re-projecting-an-esri-shapefile-only-update-the-content-of-the-prj-file/2386#2386 < / а>. Хотя они описывают, что файлы проекции делают / являются, нет обсуждения того, как выполняется преобразование.

В отличие от шейп-файлов, мне не удалось найти спецификацию файлов PRJ. Есть ли алгоритм, который используется для преобразования координат в координаты широта / долгота?

Я также открыт для использования библиотек, но они должны быть совместимы либо с Android (GeoTools не работает для меня), либо с JavaScript (Node).


person rink.attendant.6    schedule 13.08.2014    source источник
comment
есть ли у вас обновления по этому поводу после стольких лет? Как преобразовать эти координаты в координаты GPS (wgs84) с помощью этого файла проекции с помощью nodeJS или JS?   -  person João Pimentel Ferreira    schedule 25.04.2021


Ответы (3)


То, как на самом деле выполняется преобразование, может быть чрезвычайно сложным, особенно если вы переходите между датумами (такими как NAD83 в WGS84 и т. Д.). Существует масса инструментов, которые могут это сделать, но я не так хорошо знаком с мобильные вещи, но я знаю, что некоторые люди получили GDAL и OGR для создания на Android. См. http://trac.osgeo.org/gdal/wiki/BuildingForAndroid.

Вам нужно будет найти код EPSG для ваших данных. Судя по тому, что вы опубликовали, эти координаты находятся в EPSG: 32189 (MTM Zone 9). Чтобы найти это, я использовал веб-сайт http://prj2epsg.org, где вы можете загрузить файл .prj, и он найдет код EPSG для вас. Вы можете просмотреть дополнительную информацию об этой проекции на сайте spacereference.org. На этом сайте есть несколько полезных функций, таких как загружаемые файлы prj для каждой проекции и файл proj4 для библиотеки proj4, упомянутой выше.

Надеюсь это поможет.

person sovemp    schedule 14.08.2014
comment
Обычно NAD83 и WGS84 находятся в пределах одного метра друг от друга. Для практических целей их можно считать одинаковыми. - person LuisTavares; 29.04.2021

Согласно последней спецификации GeoJSON (RFC7946) CRS должен быть WGS84 (широта / долгота). . Такие инструменты, как набор GDAL, предполагают, что CRS вашего вывода находится в WGS84.

Тем не менее, шаг перепроецирования должен выполняться во время или до преобразования из шейп-файла в GeoJSON.

Например, с ogr2ogr из GDAL и при условии, что сопутствующий файл PRJ находится в том же каталоге, что и шейп-файл (система координат будет считана из файла PRJ без необходимости указывать входной код EPSG),

ogr2ogr -f GeoJSON output.json input.shp

Обратите внимание, что в последних версиях GDAL нет необходимости устанавливать в качестве выходной системы координат WGS84, как объясняется в первом абзаце. Предыдущий синтаксис был бы таким,

ogr2ogr -t_srs EPSG:4326 -f GeoJSON output.json input.shp

Вы можете использовать оболочку NodeJS для ogr2ogr

Например,

https://github.com/wavded/ogr2ogr

Соответствующий пакет NPM,

https://www.npmjs.com/package/ogr2ogr

РЕДАКТИРОВАТЬ 1:

В качестве альтернативы можно использовать сгенерированные SWIG привязки NodeJS для GDAL,

https://www.npmjs.com/package/gdal

РЕДАКТИРОВАТЬ 2:

Тем не менее, если OP действительно хочет преобразовать GeoJSON, все еще находящийся в EPSG: 32198, в GeoJSON в WGS84, это будет сделать работу:

ogr2ogr -t_srs EPSG:4326 -s_srs EPSG:32198 -f GeoJSON output.json input.json

Обратите внимание, что GDAL распространяется с базой данных EPSG, откуда будет прочитана следующая строка:

+proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 

Это соответствует файлу PRJ в вопросе.

person LuisTavares    schedule 26.04.2021

Используя Javascript, лучшее решение, которое я нашел и которое я реализовал (и оно работает), находится по использованию библиотеки proj4. Но я знаю, что эта библиотека существует и для Python.

В Javascript это будет:

var firstProjection = 'PROJCS["NAD83 / Massachusetts Mainland",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",42.68333333333333],PARAMETER["standard_parallel_2",41.71666666666667],PARAMETER["latitude_of_origin",41],PARAMETER["central_meridian",-71.5],PARAMETER["false_easting",200000],PARAMETER["false_northing",750000],AUTHORITY["EPSG","26986"],AXIS["X",EAST],AXIS["Y",NORTH]]';
var secondProjection = "+proj=gnom +lat_0=90 +lon_0=0 +x_0=6300000 +y_0=6300000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs";
//I'm not going to redefine those two in latter examples.
proj4(firstProjection,secondProjection,[2,5]);
// [-2690666.2977344505, 3662659.885459918]

Если дан только 1 прогноз, то предполагается, что он проецируется из WGS84 (стандарт GPS).

proj4(firstProjection,[-71,41]);
// [242075.00535055372, 750123.32090043]
person João Pimentel Ferreira    schedule 01.05.2021
comment
GDAL использует PROJ под деревом. Существует несколько привязок PROJ, сгенерированных SWIG, одна из которых - PyProj (привязки python). Proj4js - частичное переписывание PROJ на JavaScript. - person LuisTavares; 01.05.2021