【问题标题】:Error on geotiff coordinate transformationgeotiff坐标变换错误
【发布时间】:2020-04-11 22:37:43
【问题描述】:

在使用 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):

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

错误 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):

  • 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 吗?

【问题讨论】:

    标签: c++ qt gdal coordinate-transformation geotiff


    【解决方案1】:

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

    1. 卸载以下所有最新版本:libspatialite、geotiff、libproj19、gdal。
    2. 安装 libproj15 例如从这个 repo home:rogeroberholtzer
    3. 我们自己根据已安装的libproj15 从src.rpm 重建libspatialite 和geotiff 库:

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

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

    4. 安装构建包:rpm -Uvh *

    5. 从science repo 安装gdal2-2.4.2 rpm。

    一切正常!享受! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2016-09-16
      • 2010-11-28
      • 2014-08-11
      • 2021-02-02
      • 1970-01-01
      相关资源
      最近更新 更多