Ошибка при преобразовании геотифовой координаты - PullRequest
1 голос
/ 12 апреля 2020

Ошибка и cra sh в приложении, использующем GDAL для извлечения широты и долготы из образа GeoTiff, запускающего его в openSUSE, в то время как оно отлично работает в Ubuntu для моих коллег. Ошибки различаются для версий gdal-v3 и gdal-v2, однако, похоже, проблема в OGRCreateCoordinateTransformation создании объекта: возвращает NULL в обоих случаях. Подробности см. Ниже:


Код:

QGeoCoordinate toGeoCoordinate(double* adGeotransform, OGRSpatialReference& srcRef, int x, int y)
{
    double worldX = adGeotransform[0] + x * adGeotransform[1] + y * adGeotransform[2];
    double worldY = adGeotransform[3] + x * adGeotransform[4] + y * adGeotransform[5];

    OGRSpatialReference dstRef;
    dstRef.importFromEPSG(4326);
    QScopedPointer<OGRCoordinateTransformation> coordinateTransform(
                OGRCreateCoordinateTransformation(&srcRef, &dstRef));
    coordinateTransform->Transform(1, &worldX, &worldY);
    return QGeoCoordinate(worldY,   // lat
                          worldX);  // lon
}

QGeoRectangle extractCoordinate(const QString& path) 
{
    GDALAllRegister();
    GDALDataset *poDataset = (GDALDataset *) GDALOpen( path.toStdString().c_str(), GA_ReadOnly );
    _height = GDALGetRasterYSize(poDataset);
    _width = GDALGetRasterXSize(poDataset);

    double adGeotransform[6];
    poDataset->GetGeoTransform(adGeotransform);
    OGRSpatialReference srcRef(poDataset->GetProjectionRef());
    QGeoCoordinate _topLeft = toGeoCoordinate(adGeotransform, srcRef, 0, 0);
    QGeoCoordinate _bottomRight = toGeoCoordinate(adGeotransform, srcRef, _width, _height);

    return QGeoRectangle(_topLeft, _bottomRight);
}

GDAL 3 (openSUSE):

  • gdal - 3.0.4
  • libgeotiff5 - 1.5.1
  • libproj19 - 7.0.0
  • libgeos - 3.8.0

ОШИБКА 1: PROJ: proj_create_from_database: невозможно find proj.db ОШИБКА 1: PROJ: proj_create: нераспознанный формат / неизвестное имя ОШИБКА 6: Не удается найти операции с координатами из PROJCRS["WGS 84 / UTM zone 10N",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 10N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-123,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing",north,ORDER[2],LENGTHUNIT["metre",1]],ID["EPSG",32610]]' to '


GDAL 2 (openSUSE):

  • gdal2 - 2.4.2
  • libgeotiff5 - 1.5.1
  • libproj19 - 7.0.0
  • libgeos - 3.8.0

ОШИБКА 6: Невозможно загрузить библиотеку PROJ.4 (libproj.so.15), создание OGRCoordinateTransformation не удалось.


Ubuntu 18.03 LTS (работает нормально):

  • libgdal - 2.2.3
  • libgeotiff - 1.4.2
  • libproj12 - 4.9.3

Так что просьба о возможном решения:

  1. Что может быть причиной ошибки:
    • неправильно версии библиотек;
    • неправильные флаги сборки в openSUSE?
  2. GeoTiff можно извлечь другим способом?

1 Ответ

1 голос
/ 14 апреля 2020

Проблема в PROJ используемой версии библиотеки. Для GDAL v2 нужно использовать libproj v6. Однако требуется libgeotiff5 и libspatialite, построенные против libproj19 (proj v7) в openSUSE Tumbleweed. Поэтому необходимо

  1. Удалить все последние версии: libspatialite, geotiff, libproj19, gdal.
  2. Установить libproj15, например, из этого репозитория home: rogeroberholtzer
  3. Перестройка libspatialite & geotiff библиотек из src.rpm для этой установленной libproj15 нас самих:

    rpmbuild --rebuild --clean libspatialite-4.3.0a-15.19.src.rpm
    rpmbuild --rebuild --clean geotiff-1.5.1-31.13.src.rpm
    

    Эти пакеты могут Например,

  4. Установить встроенные пакеты: rpm -Uvh *

  5. Установить gdal2-2.4.2 об / мин от наука репо.

И все работает! Наслаждайтесь! :)

...