
本文介绍如何在 PyQGIS 中精准地为当前选中的点要素(而非整个图层)创建缓冲区,避免默认对全部要素运行 native:buffer,核心是使用 QgsProcessingFeatureSourceDefinition 指定仅处理选中要素。
本文介绍如何在 pyqgis 中精准地为**当前选中的点要素**(而非整个图层)创建缓冲区,避免默认对全部要素运行 `native:buffer`,核心是使用 `qgsprocessingfeaturesourcedefinition` 指定仅处理选中要素。
在 PyQGIS 脚本中,调用 processing.run*() 系列算法时,若直接传入图层对象(如 pnts['OUTPUT']),算法默认作用于该图层的全部要素。即使你已通过 qgis:randomselection 选中了部分点,native:buffer 仍不会自动识别该选择状态——除非显式告知处理框架“仅使用选中要素”。
✅ 正确做法是:将图层 ID 封装为 QgsProcessingFeatureSourceDefinition,并设置 selectedFeaturesOnly=True。这相当于向处理引擎传递一个“带筛选条件的数据源”,无需额外创建内存层或导出临时文件。
以下为精简可靠的实现步骤:
# 1. 生成随机点(在 aoi 多边形内)
pnts_result = processing.runAndLoadResults(
"native:randompointsinpolygons",
{
'INPUT': aoi,
'POINTS_NUMBER': 10,
'MIN_DISTANCE': 0,
'MIN_DISTANCE_GLOBAL': 0,
'MAX_TRIES_PER_POINT': 10,
'SEED': None,
'INCLUDE_POLYGON_ATTRIBUTES': True,
'OUTPUT': 'memory:'
}
)
points_layer = QgsProject.instance().mapLayer(pnts_result['OUTPUT'])
# 2. 随机选择 1 个点(修改图层的选择状态)
processing.run(
"qgis:randomselection",
{'INPUT': points_layer, 'METHOD': 0, 'NUMBER': 1}
)
# 3. 构建「仅含选中要素」的数据源定义(关键!)
selected_source = QgsProcessingFeatureSourceDefinition(
points_layer.id(),
selectedFeaturesOnly=True,
featureLimit=-1,
geometryCheck=QgsFeatureRequest.GeometryAbortOnInvalid
)
# 4. 对选中要素执行缓冲区分析
buffer_result = processing.runAndLoadResults(
"native:buffer",
{
'INPUT': selected_source, # ← 此处传入的是定义,不是图层对象!
'DISTANCE': 3000,
'SEGMENTS': 6,
'END_CAP_STYLE': 0, # 圆形端点
'JOIN_STYLE': 1, # 斜接连接
'MITER_LIMIT': 3,
'DISSOLVE': True,
'SEPARATE_DISJOINT': False,
'OUTPUT': 'memory:'
}
)
⚠️ 注意事项:
- QgsProcessingFeatureSourceDefinition 是 PyQGIS 3.10+ 的标准方式,兼容性好且语义清晰;
- 不要误将 points_layer(图层对象)直接传给 'INPUT',而应传入 selected_source(数据源定义);
- 若后续需多次复用该逻辑(如批量选点缓冲),可封装为函数或类(如答案中 randomBufferedPoint 示例),提升可维护性;
- featureLimit=-1 表示不限制要素数量;geometryCheck 可按需设为 QgsFeatureRequest.GeometrySkipInvalid 以跳过无效几何。
通过这一方式,你既能保持工作流简洁(零中间图层),又能确保空间操作严格遵循用户交互意图——真正实现“所选即所得”的自动化 GIS 分析。










