QGIS3 Python脚本调用自定义函数缺失feature、parent参数解决方法
问题根源
你写的这个函数原本是QGIS表达式自定义函数的标准格式,QGIS表达式引擎运行这类函数时,会自动传入两个隐式参数:
feature:当前表达式计算绑定的目标要素,也就是你要统计相交线数量的网格要素parent:表达式计算的上下文对象,主要用于错误抛出、上下文传递,脱离表达式环境单独调用时基本用不上
你在控制台直接调用时只传了两个图层名称,缺了这两个必填参数才会报类型错误。直接删参数跑不通也很正常,毕竟函数核心的相交判断逻辑完全依赖feature传入的几何对象。
解决方案
方案1:改造为独立脚本可用的函数(推荐)
去掉对表达式隐式传参的依赖,直接在函数内部遍历网格要素批量统计,不需要额外传feature和parent:
def count_intersections(grid_layer_name, line_layer_name): grid_layer = QgsProject.instance().mapLayersByName(grid_layer_name)[0] line_layer = QgsProject.instance().mapLayersByName(line_layer_name)[0] res = {} for grid_feat in grid_layer.getFeatures(): count = 0 grid_geom = grid_feat.geometry() for line_feat in line_layer.getFeatures(): if grid_geom.intersects(line_feat.geometry()): count += 1 res[grid_feat.id()] = count return res # 调用示例 count_result = count_intersections('Grid', 'line') print(count_result)
如果只需要统计单个指定网格的相交线数量,可以把目标要素作为参数传入,直接去掉没用的parent参数即可:
def count_single_grid(grid_layer_name, line_layer_name, target_grid_feat): line_layer = QgsProject.instance().mapLayersByName(line_layer_name)[0] count = 0 target_geom = target_grid_feat.geometry() for line_feat in line_layer.getFeatures(): if target_geom.intersects(line_feat.geometry()): count += 1 return count # 调用示例:统计Grid图层第一个要素的相交线数 grid_layer = QgsProject.instance().mapLayersByName('Grid')[0] first_grid = next(grid_layer.getFeatures()) print(count_single_grid('Grid', 'line', first_grid))
方案2:保留原函数结构,手动补全参数调用
如果不想修改原有函数逻辑,调用时手动传入要统计的目标网格要素,parent参数直接传None就能正常运行:
# 原函数保持不变 def count_intersections(grid_layer_name, line_layer_name, feature, parent): grid_layer = QgsProject.instance().mapLayersByName( grid_layer_name )[0] line_layer = QgsProject.instance().mapLayersByName( line_layer_name )[0] count = 0 for line_feat in line_layer.getFeatures(): if feature.geometry().intersects(line_feat.geometry()): count = count + 1 return count # 调用示例 grid_layer = QgsProject.instance().mapLayersByName('Grid')[0] target_feat = next(grid_layer.getFeatures()) # 替换为你实际需要统计的网格要素 print(count_intersections('Grid', 'line', target_feat, None))
性能提示:如果你的线图层、网格图层要素量较大,全量遍历做相交判断速度会很慢,可以提前给线图层创建空间索引,能把计算速度提升数倍到数十倍。
内容的提问来源于stack exchange,提问作者MrKingsley
相关产品推荐
相关产品推荐

