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

PyQGIS自定义处理算法:仅处理选中要素时返回None的问题

问题原因与解决方法

你遇到的问题根源在于:当勾选“仅处理选中要素”时,输入的是QgsFeatureSource对象(仅包含选中要素的子集),而parameterAsVectorLayer()方法只能解析完整的矢量图层对象,无法处理要素源子集,所以返回None。

正确的处理方式

应该使用parameterAsSource()方法获取要素源,然后直接对要素源中的要素进行处理。如果确实需要将选中要素转换为矢量图层,可以通过要素源创建临时图层。

修改后的完整代码

from qgis.PyQt.QtCore import QCoreApplication
from qgis.core import (
    QgsProcessing,
    QgsProcessingAlgorithm,
    QgsProcessingParameterFeatureSource,
    QgsFeatureSink,
    QgsProcessingParameterFeatureSink
)

name = "selectedonly"
display_name = "Selected features only example"
group = "Test"
group_id = "test"
short_help_string = "Minimal working example code for showing my problem."

class ExampleProcessingAlgorithm(QgsProcessingAlgorithm):
    def tr(self, string):
        return QCoreApplication.translate('Processing', string)

    def createInstance(self):
        return ExampleProcessingAlgorithm()

    def name(self):
        return name

    def displayName(self):
        return self.tr(display_name)

    def group(self):
        return self.tr(group)

    def groupId(self):
        return group_id

    def shortHelpString(self):
        return self.tr(short_help_string)

    def initAlgorithm(self, config=None):
        self.addParameter(
            QgsProcessingParameterFeatureSource(
                'INPUT',
                self.tr('Some point vector layer.'),
                types=[QgsProcessing.TypeVectorPoint]
            )
        )
        # 添加输出参数,用于返回处理后的选中要素图层
        self.addParameter(
            QgsProcessingParameterFeatureSink(
                'OUTPUT',
                self.tr('Output Selected Features')
            )
        )

    def processAlgorithm(self, parameters, context, feedback):
        # 获取要素源(支持完整图层或选中要素子集)
        source = self.parameterAsSource(parameters, 'INPUT', context)
        
        # 创建输出图层并写入选中要素
        (sink, dest_id) = self.parameterAsSink(
            parameters,
            'OUTPUT',
            context,
            source.fields(),
            source.wkbType(),
            source.sourceCrs()
        )
        
        total = source.featureCount()
        for current, feature in enumerate(source.getFeatures()):
            if feedback.isCanceled():
                break
            sink.addFeature(feature, QgsFeatureSink.FastInsert)
            feedback.setProgress(int(current / total * 100))
        
        return {"OUTPUT": dest_id}

关键修改点说明

  1. 替换获取输入的方法:用parameterAsSource()替代parameterAsVectorLayer(),这样无论用户选择完整图层还是选中要素,都能正确获取到要素源对象。
  2. 添加输出参数:使用QgsProcessingParameterFeatureSink创建输出图层,将选中要素写入其中,确保返回有效的结果。
  3. 直接处理要素源:通过source.getFeatures()迭代要素,无需依赖完整图层对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:31:17