geotiff 坐标转换错误

Error on geotiff coordinate transformation

在使用 GDAL 从 GeoTiff 图像中提取纬度和经度的应用程序中出现错误和 崩溃 运行 它在 openSUSE 中,而在 [=76= 中工作正常] 为我的同事们。 gdal-v3 和 gdal-v2 版本的错误不同,但似乎问题出在 OGRCreateCoordinateTransformation 对象创建中:returns 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):

ERROR 1: PROJ: proj_create_from_database: Cannot find proj.db ERROR 1: PROJ: proj_create: unrecognized format / unknown name ERROR 6: Cannot find coordinate operations from 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):

ERROR 6: Unable to load PROJ.4 library (libproj.so.15), creation of OGRCoordinateTransformation failed.


Ubuntu 18.03 LTS(工作正常):


所以寻求可能的解决方案:

  1. 错误原因可能是:
    • 错误的库版本;
    • openSUSE 上的错误构建标志?
  2. 可以用其他方式提取 GeoTiff 吗?

问题出在所用的 PROJ 库版本中。对于GDAL v2需要使用libproj v6。但是,在 openSUSE Tumbleweed 中需要 libgeotiff5libspatialite 针对 libproj19 (proj v7) 构建。所以需要

  1. 卸载所有最新版本:libspatialitegeotifflibproj19gdal
  2. 安装 libproj15 例如从这个 repo home:rogeroberholtzer
  3. 根据 libproj15 我们自己安装的 libproj15src.rpm 重建 libspatialitegeotiff 库:

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

    例如,这些包可以从 science 仓库中获取。

  4. 安装内置包:rpm -Uvh *

  5. science 存储库安装 gdal2-2.4.2 rpm。

一切正常!享受! :)