GDAL 3.x调用gdalwarp获取SRS失败,程序崩溃求助
GDAL 3.x(3.5.2/3.6.0)合并栅格导出GeoTIFF时因
proj_create_from_database返回空指针崩溃 问题详情
从GDAL 2.4.0升级到3.5.2/3.6.0版本后,依赖GDAL的应用在合并多栅格并导出GeoTIFF时持续崩溃。经调试定位,崩溃根源为获取EPSG:4326投影时,proj_create_from_database函数返回空指针。
已尝试的GDAL构建方式均出现相同问题:
- vcpkg构建的GDAL 3.6.0(搭配PROJ 9.1.0)
- 自行编译的GDAL 3.x版本
- conda-forge提供的GDAL 3.x版本
排查与修复方向
1. 验证PROJ数据库完整性
GDAL 3.x对PROJ数据库依赖极强,数据库缺失或损坏会直接导致EPSG编码解析失败:
- 检查环境变量
PROJ_LIB是否指向包含proj.db文件的有效PROJ数据库目录 - 执行命令
projinfo EPSG:4326,若返回错误或空结果,说明数据库损坏,需重新安装或修复PROJ数据库
2. 确认GDAL与PROJ版本兼容性
GDAL 3.x对PROJ版本有明确适配要求,版本不匹配可能引发底层调用异常:
- GDAL 3.5.x建议搭配PROJ 8.1.x~9.0.x,GDAL 3.6.x建议搭配PROJ 8.2.x~9.1.x
- 自行编译GDAL时,确保编译脚本正确指定PROJ的头文件和库路径,避免链接到系统中残留的旧版本PROJ
3. 适配GDAL 3.x投影API逻辑
GDAL 3.x重构了投影处理模块,从2.4.x升级时需调整代码逻辑:
- 优先使用GDAL封装的投影接口(如
OSRNewSpatialReferenceFromEPSG),避免直接调用PROJ底层API - 确认代码中已正确初始化GDAL和PROJ环境:调用
GDALAllRegister(),并正确配置PROJ上下文(GDAL 3.x中PROJ上下文需显式初始化或绑定)
4. 检查输入栅格的投影元数据
部分栅格文件的投影元数据损坏,可能导致合并时GDAL触发EPSG解析逻辑出错:
- 用
gdalinfo逐个检查待合并栅格的投影信息,确认元数据格式合法 - 尝试在导出时手动指定输出投影为EPSG:4326,而非依赖输入栅格的投影自动推导
5. 捕获PROJ错误细节
若以上步骤无效,可添加调试日志定位具体问题:
- 在调用
proj_create_from_database前,打印PROJ上下文的数据库加载状态 - 调用
proj_errno获取错误码,结合PROJ错误码表解析具体故障原因
内容的提问来源于stack exchange,提问作者Joseph T. Richardson
相关产品推荐
相关产品推荐

