gdal在做坐标转换时报出如此的错误。原系统的代码没有改变,为了更新sentinelhub包,将python环境由3.6升级至3.7。升级了python环境之后,所有相关的py包和第三方库重新进行安装。安装过程中基本没有遇到问题。但是在运行代码时gdal报出错误。
发生错误的代码:
src_osr = osr.SpatialReference()
src_osr.ImportFromWkt(src_proj)
dst_osr = osr.SpatialReference()
dst_osr.SetWellKnownGeogCS("WGS84")
ct = osr.CoordinateTransformation(src_osr, dst_osr)
print("ct:", src_proj)
coords_ul = ct.TransformPoint(x_min, y_max)
coords_ur = ct.TransformPoint(x_max, y_max)
coords_lr = ct.TransformPoint(x_max, y_min)
coords_ll = ct.TransformPoint(x_min, y_min)
lon_list = [coords_ul[0], coords_ur[0], coords_lr[0], coords_ll[0]]
lat_list = [coords_ul[1], coords_ur[1], coords_lr[1], coords_ll[1]]
lon_min = np.min(lon_list)
lon_max = np.max(lon_list)
lat_min = np.min(lat_list)
lat_max = np.max(lat_list)
lon_lat_extent = [lon_min, lon_max, lat_min, lat_max]
return lon_lat_extent
错误信息:
Traceback (most recent call last):
File "/opt/project/src/test.py", line 160, in <module>
ndvi.run()
File "/opt/project/src/cell_produce_task/tile_factory_v2.py", line 1529, in run
result = self.task_manager()
File "/opt/project/src/cell_produce_task/tile_factory_v2.py", line 532, in task_manager
geo_extension
File "/opt/project/src/cell_produce_task/tile_factory_v2.py", line 730, in produce_block
y_blk_num
File "/opt/project/src/cell_produce_task/tile_factory_v2.py", line 1073, in cell_block_task_by_lut
src_proj
File "/opt/project/src/cell_produce_task/tile_factory_v2.py", line 958, in proj_2_geo_extent
coords_ul = ct.TransformPoint(x_min, y_max)
File "/root/miniconda3/lib/python3.7/site-packages/osgeo/osr.py", line 1150, in TransformPoint
return _osr.CoordinateTransformation_TransformPoint(self, *args)
NotImplementedError: Wrong number or type of arguments for overloaded function 'CoordinateTransformation_TransformPoint'.
Possible C/C++ prototypes are:
OSRCoordinateTransformationShadow::TransformPoint(double [3])
OSRCoordinateTransformationShadow::TransformPoint(double [4])
OSRCoordinateTransformationShadow::TransformPoint(double [3],double,double,double)
OSRCoordinateTransformationShadow::TransformPoint(double [4],double,double,double,double)
为了解决这个问题,大体进行了如下几次尝试:
1. 一开始以为是gdal的问题,重新对gdal进行安装,结果问题依然存在;
2. 以为是GDAL_DATA没有设置的问题,查询gdal路径后,将该路径加入到环境变量。没有解决问题。
os.environ['GDAL_DATA']="/root/miniconda3/pkgs/libgdal-3.4.1-h05199a0_1/share/gdal"
3.怀疑是proj没有配置使得gdal找不到proj库。查询proj的路径,将该路径加入到环境变量。问题最终解决。
os.environ['PROJ_LIB'] = os.getenv('PROJ_LIB', '/root/miniconda3/pkgs/proj-6.2.1-h05a3930_0/share/proj')
由于proj有多个路径,可能是不同版本共存。在经过多个路径轮流试验后最终确定了一个有效的路径。
总结,对于此类问题,直接原因是gdal没有找到相应的proj路径,使得跟坐标转换相关的处理不能正常运行。解决的方法就是将proj的路径找到,并设置成环境变量。造成这个问题原因可能是多个proj的版本混乱造成的,也可能proj没有正确安装。