首页 > 解决方案 > geotiff坐标变换错误

问题描述

在使用 GDAL 从在 openSUSE 中运行的 GeoTiff 图像中提取纬度和经度的应用程序中出现错误和崩溃,而对于我的同事来说,它在 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):

错误 1:PROJ:proj_create_from_database:找不到 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):

错误 6:无法加载 PROJ.4 库 (libproj.so.15),创建 OGRCoordinateTransformation 失败。


Ubuntu 18.03 LTS(工作正常):


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

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

标签: c++qtgdalcoordinate-transformationgeotiff

解决方案


问题出在使用的PROJ库版本中。为GDAL v2需要使用libproj v6。但是在 openSUSE Tumbleweed 中需要libgeotiff5并针对( )libspatialite构建。所以需要libproj19proj v7

  1. 卸载所有最新版本:libspatialite, geotiff, libproj19, gdal.
  2. libproj15例如从这个 repo home安装:rogeroberholtzer
  3. 以此为基础的重建libspatialitegeotiff库是我们自己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.2rpm 。

一切正常!享受!:)


推荐阅读