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

将Python环境从3.6升级到3.7后,gdal在做坐标转换时出错。尝试重新安装gdal、设置GDAL_DATA环境变量均未解决问题。最终发现是gdal找不到proj库,将proj路径加入环境变量后问题解决,问题可能因proj版本混乱或未正确安装导致。

升级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 rec

<think>我们正在处理一个关于Maya API(OpenMaya)的问题。用户遇到了在调用`new_MItDependencyNodes`方法时参数数量或类型错误的问题。错误提示指出参数1应该是`MIteratorType &`类型,并给出了两个可能的C++原型。 根据引用内容,特别是引用[1]中关于迭代器的使用(`MItMeshVertex`),我们可以推断出在Maya API中,迭代器的构造通常需要特定的参数。错误信息中提到的两个原型是: 1. `MItDependencyNodes::MItDependencyNodes(MFn::Type, MStatus *)` 2. `MItDependencyNodes::MItDependencyNodes(MIteratorType &, MStatus *)` 用户提到错误是参数数量或类型错误,说明在调用`new_MItDependencyNodes`时传入的参数不符合上述任何一个原型。 在Python中,我们通常使用`OpenMaya.MItDependencyNodes`来创建依赖节点迭代器。根据Maya API文档,`MItDependencyNodes`的构造函数有两种形式: - 一种接受一个`MFn::Type`枚举值(表示要迭代的节点类型)和一个可选的`MStatus`对象。 - 另一种接受一个`MIteratorType`对象(这是一个自定义类型,但在Python中通常不直接使用)和一个可选的`MStatus`对象。 在Python中,我们通常使用第一种形式,即传入一个节点类型常量。 例如,迭代场景中所有的变换节点(transform nodes): ```python import maya.OpenMaya as OpenMaya # 创建一个迭代器,遍历所有transform节点 iterator = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kTransform) while not iterator.isDone(): node = iterator.thisNode() print node.apiTypeStr() iterator.next() ``` 但是,错误信息中提到了`new_MItDependencyNodes`,这可能是由于在Python中直接使用C++名称(在Python中,构造函数通常就是类名,而不是以`new_`开头)。实际上,在Python中我们直接使用类名来构造对象。 因此,我怀疑用户可能在代码中使用了类似`new_MItDependencyNodes`的函数,但实际上在OpenMaya Python API中,我们应该使用`OpenMaya.MItDependencyNodes`类来创建迭代器。 如果用户确实在代码中使用了`new_MItDependencyNodes`,那么可能是错误地使用了底层包装函数,而不是直接使用类构造。 在Python中,正确的迭代器创建方式就是直接调用`OpenMaya.MItDependencyNodes`并传入正确的参数。 所以,解决方案是: 1. 确保使用正确的类名:`OpenMaya.MItDependencyNodes`。 2. 传入正确的参数:第一个参数应为节点类型(`MFn::Type`枚举值,例如`OpenMaya.MFn.kTransform`),第二个参数是可选的`MStatus`(在Python中通常可以省略,因为状态可以通过返回值获取)。 如果用户需要传递`MIteratorType`,那么可能需要先创建一个`MIteratorType`对象。但是,在大多数情况下,我们只需要使用节点类型枚举值。 因此,我建议用户检查代码中迭代器的创建方式,确保按照以下示例编写: ```python import maya.OpenMaya as OpenMaya # 创建一个迭代器,遍历所有依赖节点(不指定类型则遍历所有节点) # 或者指定特定的节点类型 iterator = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kDagNode) # 例如,遍历所有DAG节点 status = OpenMaya.MStatus() iterator = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kDagNode, status) # 带状态检查 # 或者,如果不需要指定类型,可以传入OpenMaya.MFn.kInvalid(表示所有节点) iterator = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kInvalid) ``` 如果用户确实需要使用`MIteratorType`,那么需要先创建该类型的对象。但是,在Python API中,通常我们使用节点类型枚举值就足够了,而且`MIteratorType`在Python API中可能并不常用。 根据错误信息,用户可能在代码中使用了错误的参数数量或类型。例如,可能传入了字符串或者错误的参数个数。 总结解决方案: - 确认使用正确的构造函数:`OpenMaya.MItDependencyNodes` - 传入正确的参数:一个节点类型(如`OpenMaya.MFn.kTransform`)和可选的`MStatus`对象(通常可以省略)。 - 避免使用不存在的函数(如`new_MItDependencyNodes`),应该直接使用类名构造。 如果用户的问题仍然存在,请检查Maya API版本,并确认所使用的枚举值在对应版本的API中存在。 另外,参考引用[1]中迭代顶点的例子,它使用了`MItMeshVertex`,并且传入的参数是`MObject`,但注意`MItDependencyNodes`的构造参数与`MItMeshVertex`不同。每个迭代器类有自己的构造函数。 所以,核心是使用正确的参数调用`OpenMaya.MItDependencyNodes`。 </think> ### 解决 Maya OpenMaya 中 `new_MItDependencyNodes` 参数错误问题 您在调用 `MItDependencyNodes` 迭代器时遇到的参数类型错误,通常是由于参数传递不符合 C++ 原型要求导致的。以下是完整解决方案: #### 错误原因分析 1. **参数类型不匹配**:错误提示表明第一个参数需要 `MIteratorType &` 类型(即 `MFn::Type` 枚举值) 2. **构造函数原型**: ```cpp MItDependencyNodes(MFn::Type filter, MStatus* ReturnStatus = NULL); MItDependencyNodes(MIteratorType &filter, MStatus* ReturnStatus = NULL); ``` #### 正确调用方式(Python 示例) ```python import maya.OpenMaya as om # 正确构造迭代器 (示例:遍历所有灯光节点) light_type = om.MFn.kLight # 使用 MFn::Type 枚举值作为参数 status = om.MStatus() # 可选的状态对象 # 创建迭代器(两种等效方式) iterator = om.MItDependencyNodes(light_type) # 方式1:省略状态参数 iterator = om.MItDependencyNodes(light_type, status) # 方式2:包含状态参数 # 遍历节点 while not iterator.isDone(): node_obj = iterator.thisNode() print(f"找到节点: {node_obj.apiTypeStr()}") iterator.next() ``` #### 关键解决步骤: 1. **确认节点类型枚举值**: - 使用 `MFn::Type` 枚举常量指定要迭代的节点类型 - 常用类型:`kTransform`, `kMesh`, `kLight`, `kCamera`, `kInvalid`(所有节点) - 完整枚举列表见 [^1] 2. **避免常见错误**: ```python # 错误示例1:传入字符串 iterator = om.MItDependencyNodes("light") # TypeError # 错误示例2:参数顺序颠倒 iterator = om.MItDependencyNodes(om.MStatus(), om.MFn.kLight) # 参数类型不匹配 # 错误示例3:缺少必要参数 iterator = om.MItDependencyNodes() # 缺少必需的filter参数 ``` 3. **复杂场景解决方案**: ```python # 组合筛选条件(通过迭代器内部判断) iterator = om.MItDependencyNodes(om.MFn.kDagNode) while not iterator.isDone(): node = iterator.thisNode() if node.hasFn(om.MFn.kLight): # 处理灯光类型节点 pass iterator.next() ``` #### 参数类型参考表 | 参数位置 | 类型 | 必选 | 说明 | |----------|-------------------|------|-------------------------------| | 第1参数 | `MFn::Type` | 是 | Maya节点类型枚举值 (e.g. `MFn.kMesh`) | | 第2参数 | `MStatus*` | 否 | 用于接收操作状态(Python中可省略) | > **注意**:在Python API中,`MIteratorType &` 实际对应 `MFn::Type` 枚举值,直接传递整数枚举常量即可。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值