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}
关键修改点说明
- 替换获取输入的方法:用
parameterAsSource()替代parameterAsVectorLayer(),这样无论用户选择完整图层还是选中要素,都能正确获取到要素源对象。 - 添加输出参数:使用
QgsProcessingParameterFeatureSink创建输出图层,将选中要素写入其中,确保返回有效的结果。 - 直接处理要素源:通过
source.getFeatures()迭代要素,无需依赖完整图层对象。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

