Не удается получить EPSG из шейп-файла с помощью OGR/GDAL

В данный момент я работаю с козырьком шейп-файла на C++ и QT и использую библиотеку GDAL/OGR. У меня есть этот метод, чтобы получить EPSG моих шейп-файлов:

OGRLayer layer = dataset->GetLayer(0);
OGRSpatialReference *spatialRef = layer->GetSpatialRef();

При этом я получаю номер EPSG с:

atoi(spatialRef->GetAuthorityCode(NULL));

Это отлично работает во всех моих шейп-файлах, кроме одного. В этом случае метод всегда возвращает ноль.

Я пытаюсь использовать:

spatialRef->GetAuthorityCode("PROJCS");
spatialRef->GetAuthorityCode("GEOGCS");
spatialRef->GetAuthorityName("GEOGCS");

И весь этот метод возвращает "".

Я проверяю этот шейп-файл в программе gis, так как QGIS и QGIS автоматически определили, что его EPSG равен 25830.

Мой вопрос таков: может ли проекционная информация быть прочитана другим методом, чем то, что я делаю?

Жду ваших предложений.

Большое спасибо.

ИЗМЕНИТЬ

Это содержимое файла .prj:

PROJCS["ETRS89_UTM_zone_30N",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519],PROJECTION ["поперечный_меркатор"],ПАРАМЕТР["широта_начала",0],ПАРАМЕТР["центральный_меридиан",-3],ПАРАМЕТР["коэффициент_масштаба",0,9996],ПАРАМЕТР["ложное_восток",500000],ПАРАМЕТР["ложное_северное",0 ],UNIT["Метр",1]]


person Zharios    schedule 07.03.2018    source источник
comment
Вы звонили spatialRef->AutoIdentifyEPSG()?   -  person RA.    schedule 10.03.2018
comment
@РА. если я использую этот метод, программа вылетает при открытии файла формы: S   -  person Zharios    schedule 12.03.2018
comment
попробуйте этот const char *c = OSRGetAuthorityCode(layer->GetSpatialRef(), DATUM ); если (c && c[0]) вернуть atoi(c);   -  person Andrey Semenov    schedule 12.03.2018
comment
@AndreySemenov, я стараюсь использовать это, и значение c всегда получается.   -  person Zharios    schedule 12.03.2018


Ответы (1)


Что-то вроде этого должно работать:

OGRLayer  * layer = dataset->GetLayer(0);
layer->ResetReading();
OGRFeature * feat= layer->GetNextFeature(); 
OGRGeometry * geom = feat->GetGeometryRef(); 
OGRSpatialReference * spatRef = geom->getSpatialReference(); 
int EPSG =  spatRef->GetEPSGGeogCS(); 

Надеюсь, поможет!

person Streamsoup    schedule 14.03.2018
comment
Я использую ваш метод и отлично работаю со всеми моими фигурами, кроме упомянутых в этом посте. В этом случае все EPSG из геометрии возвращают -1. - person Zharios; 15.03.2018
comment
Что-то определенно не так с этим конкретным EPSG в OGR, либо в базовых определениях PROJ4, либо в OGR/GEOS. И GetEPSGGeogCS(), и AutoIdentifyEPSG() возвращают неверные значения (-1/7) при вызове для spatRef, даже если система пространственной привязки инициализирована с параметрами proj4, найденными на spatialreference.org/ref/epsg/etrs89-utm-zone-30n или с помощью SetWellKnownGeogCS(EPSG:25830). - person Streamsoup; 15.03.2018