You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PyQGIS循环删除满足条件的SHP图层要素?

修复SHP要素重叠删除逻辑的实现方案

需求回顾

删除SHP图层中满足以下两个条件的要素:

  • 该要素与其他要素存在重叠(重叠面积占自身面积比例超过30%);
  • 该要素的时间早于与之重叠的对比要素。

原代码的核心问题

  1. 删除对象逻辑完全错误:原代码把对比要素的ID加入删除列表,但实际应该删除的是时间更早的当前要素,而非对比的要素。
  2. 日期判断逻辑颠倒:注释标注“如果日期更早”,但代码用了fechainf_feat >= fechainf_f,实际是判断当前要素日期晚于/等于对比要素,和需求完全相反。
  3. 效率低下:直接遍历全图层要素,大数据量下计算量极大;删除列表会重复添加同一ID,存在冗余操作。
  4. 无异常防护:如果当前要素面积为0,会触发除以0的报错。

改进后的代码

from datetime import datetime
from qgis.core import QgsSpatialIndex

def superpuestos2(capa, fecha, geom, id_actual):
    # 用集合存储待删除ID,自动去重
    listaborrar = set()
    # 转换当前要素日期为可比较的datetime对象
    fechainf_actual = datetime.strptime(fecha, "%d/%m/%Y")
    geom_actual = geom
    
    # 创建空间索引,快速过滤可能重叠的要素,大幅提升效率
    spatial_index = QgsSpatialIndex(capa.getFeatures())
    # 获取与当前要素边界相交的候选要素ID
    candidate_ids = spatial_index.intersects(geom_actual.boundingBox())
    
    # 仅遍历候选要素,减少不必要的计算
    for f_id in candidate_ids:
        f = capa.getFeature(f_id)
        id_feat = f.attribute('id')
        
        # 跳过当前要素自身
        if id_actual != id_feat:
            fecha_f = f.attribute('fecha')
            fechainf_f = datetime.strptime(fecha_f, "%d/%m/%Y")
            
            f_geom = f.geometry()
            # 先判断要素是否相交,再计算重叠比例,进一步优化
            if f_geom.intersects(geom_actual):
                inters = f_geom.intersection(geom_actual)
                areageom = geom_actual.area()
                
                # 避免面积为0导致的除以0错误
                if areageom == 0:
                    continue
                    
                interarea = inters.area()
                fraccion = interarea / areageom
                
                # 满足重叠比例要求,且当前要素时间更早
                if fraccion > 0.3 and fechainf_actual < fechainf_f:
                    # 标记当前要素为待删除
                    listaborrar.add(id_actual)
                    # 找到一个符合条件的对比要素后直接停止检查
                    break
    
    # 执行删除操作
    if listaborrar:
        capa.dataProvider().deleteFeatures(list(listaborrar))

关键改进说明

  • 修正核心逻辑:将当前要素ID加入删除列表,完全匹配“时间更早的重叠要素被删除”的需求。
  • 空间索引优化:通过空间索引快速过滤出可能重叠的要素,避免遍历全图层,大数据量下效率提升显著。
  • 自动去重:用set()存储待删除ID,避免重复添加同一要素。
  • 前置边界判断:先判断要素边界是否相交,再计算重叠面积,减少不必要的几何计算开销。
  • 异常防护:处理了要素面积为0的情况,避免除以0报错。

内容的提问来源于stack exchange,提问作者waldemar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:55:21