Docker环境运行含GDAL/pyproj的Python脚本报crs not found错误求助
问题根因
报错核心触发逻辑是dem.GetProjection()在Docker环境返回空字符串,导致osr.SpatialReference读取EPSG编码时返回None,最终拼接出无效的EPSG:None投影标识触发pyproj报错。GDAL无法读取GeoTIFF投影信息的本质是Docker环境内GDAL/PROJ依赖的坐标系统数据库缺失或路径配置错误。
解决方案
1. 补全PROJ坐标系统数据库
GDAL 3.0+版本依赖PROJ库的坐标系统数据库完成投影解析,多数极简Docker镜像默认不会安装完整的proj-data数据包,需要在Dockerfile中显式安装:
# 以Debian/Ubuntu基础镜像为例 RUN apt update && apt install -y --no-install-recommends \ gdal-bin \ libgdal-dev \ proj-bin \ proj-data \ && rm -rf /var/lib/apt/lists/*
2. 显式配置环境变量
Docker环境下需要手动指定PROJ和GDAL的配置文件路径,避免程序找不到数据库,在Dockerfile中添加如下配置:
# 路径根据实际安装位置调整,Debian系默认路径如下 ENV PROJ_LIB=/usr/share/proj ENV GDAL_DATA=/usr/share/gdal
3. 代码适配与容错优化
pyproj 3.0+版本已废弃init=参数的写法,同时建议添加空值判断避免异常:
import glob from osgeo import gdal, osr from pyproj import Proj, CRS for file in glob.glob("*.tif"): dem = gdal.Open(file) if not dem: continue # 读取投影并判空 proj_wkt = dem.GetProjection() if not proj_wkt: print(f"文件{file}投影信息读取失败,跳过") continue # 解析EPSG编码,拿不到时直接用WKT创建投影 sr = osr.SpatialReference(proj_wkt) epsg_code = sr.GetAttrValue("PROJCS|AUTHORITY", 1) if epsg_code: P3857 = Proj(f"EPSG:{epsg_code}") else: P3857 = Proj(CRS.from_wkt(proj_wkt)) P4326 = Proj("EPSG:4326")
4. 环境校验
进入运行中的Docker容器,执行以下命令验证GDAL配置是否正常:
# 验证GTiff驱动是否存在 gdalinfo --formats | grep GTiff # 验证TIFF投影读取是否正常 gdalinfo 你的测试tif文件路径
如果gdalinfo可以正常输出投影信息,说明环境配置完成,代码即可正常运行。
内容的提问来源于stack exchange,提问作者mdl518
相关产品推荐
相关产品推荐

