Wrong number or type of arguments for overloaded function ‘CoordinateTransformation_TransformPoint‘

6 篇文章 0 订阅
6 篇文章 0 订阅

升级python环境时gdal出现缺少proj的问题

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没有正确安装。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
非常抱歉,我之前给出的示例代码中的`pylon.ImageEventHandler(image_callback)`在Pylon的Python绑定中是无效的。正确的方法是直接使用`image_callback`函数作为回调函数,而不需要使用`pylon.ImageEventHandler`。以下是修改后的示例代码: ```python from pypylon import pylon # 定义回调函数 def image_callback(camera, grab_result): if grab_result.GrabSucceeded(): # 处理图像数据 image = grab_result.Array # 在这里添加你的图像处理代码 # ... # 显示图像 cv2.imshow('Image', image) cv2.waitKey(1) # 等待1毫秒,以便图像显示更新 # 创建Pylon相机对象 camera = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice()) # 打开相机 camera.Open() # 注册回调函数 camera.RegisterImageEventHandler(image_callback) # 开始采集图像 camera.StartGrabbing() # 持续采集图像,直到按下键盘中断 while camera.IsGrabbing(): camera.RetrieveResult(5000, pylon.TimeoutHandling_ThrowException) # 停止采集图像 camera.StopGrabbing() # 关闭相机 camera.Close() # 关闭OpenCV窗口 cv2.destroyAllWindows() ``` 在修改后的代码中,我们直接将`image_callback`函数作为参数传递给`RegisterImageEventHandler`方法。在回调函数中,我们使用`GrabSucceeded`方法检查采集是否成功,并处理图像数据进行图像处理。请确保在运行之前已经安装了Pylon SDK和OpenCV,并按照正确的方式导入这些模块。 如果你仍然遇到问题,请确保你的Pylon版本与代码兼容,并参考相关文档或官方网站进行安装和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值