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):
- gdal - 3.0.4
- libgeotiff5 - 1.5.1
- libproj19-7.0.0
- libgeos - 3.8.0
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):
- gdal2 - 2.4.2
- libgeotiff5 - 1.5.1
- libproj19-7.0.0
- libgeos - 3.8.0
ERROR 6: Unable to load PROJ.4 library (libproj.so.15), creation of OGRCoordinateTransformation failed.
Ubuntu 18.03 LTS(工作正常):
- libgdal - 2.2.3
- libgeotiff - 1.4.2
- libproj12-4.9.3
所以寻求可能的解决方案:
- 错误原因可能是:
- 错误的库版本;
- openSUSE 上的错误构建标志?
- 可以用其他方式提取 GeoTiff 吗?
问题出在所用的 PROJ
库版本中。对于GDAL v2
需要使用libproj v6
。但是,在 openSUSE Tumbleweed 中需要 libgeotiff5
和 libspatialite
针对 libproj19
(proj v7
) 构建。所以需要
- 卸载所有最新版本:
libspatialite
、geotiff
、libproj19
、gdal
。
- 安装
libproj15
例如从这个 repo home:rogeroberholtzer
根据 libproj15
我们自己安装的 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 仓库中获取。
安装内置包:rpm -Uvh *
从 science 存储库安装 gdal2-2.4.2
rpm。
一切正常!享受! :)
在使用 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):
- gdal - 3.0.4
- libgeotiff5 - 1.5.1
- libproj19-7.0.0
- libgeos - 3.8.0
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):
- gdal2 - 2.4.2
- libgeotiff5 - 1.5.1
- libproj19-7.0.0
- libgeos - 3.8.0
ERROR 6: Unable to load PROJ.4 library (libproj.so.15), creation of OGRCoordinateTransformation failed.
Ubuntu 18.03 LTS(工作正常):
- libgdal - 2.2.3
- libgeotiff - 1.4.2
- libproj12-4.9.3
所以寻求可能的解决方案:
- 错误原因可能是:
- 错误的库版本;
- openSUSE 上的错误构建标志?
- 可以用其他方式提取 GeoTiff 吗?
问题出在所用的 PROJ
库版本中。对于GDAL v2
需要使用libproj v6
。但是,在 openSUSE Tumbleweed 中需要 libgeotiff5
和 libspatialite
针对 libproj19
(proj v7
) 构建。所以需要
- 卸载所有最新版本:
libspatialite
、geotiff
、libproj19
、gdal
。 - 安装
libproj15
例如从这个 repo home:rogeroberholtzer 根据
libproj15
我们自己安装的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 仓库中获取。
安装内置包:
rpm -Uvh *
从 science 存储库安装
gdal2-2.4.2
rpm。
一切正常!享受! :)