方案一:需要创建一个中心点图层,再把两个图层结合起来
第一步:提取面的中心点,生成质心图层,取名为point。
选择面图层polygon,选择矢量几何图形-质心-执行


运行之后结果如下,但是point是独立的图层,还需把point中每个点的坐标加入到面图层polygon的属性中。

另外提一下,如果需要提取面的顶点,可以执行择矢量几何图形-提取顶点-执行,运行之后会自动创建一个点图层

第二步:把point中每个点的坐标加入到面图层polygon的属性中。
需要并将polygon图层设置为编辑状态。



# 获取图层
point_layer = QgsProject.instance().mapLayersByName("point")[0]
polygon_layer = QgsProject.instance().mapLayersByName("polygon")[0]
# 进入编辑模式
polygon_layer.startEditing()
# 添加 "center" 字段用于存储点的坐标
polygon_layer.dataProvider().addAttributes([QgsField("center", QVariant.String, len=50)])
polygon_layer.updateFields()
# 创建面图层的空间索引以加快空间查询速度
spatial_index = QgsSpatialIndex(polygon_layer.getFeatures())
# 遍历点图层中的每个点
for point_feature in point_layer.getFeatures():
point_geom = point_feature.geometry()
point_x = round(point_geom.asPoint().x(), 8)
point_y = round(point_geom.asPoint().y(), 8)
center_value = f"[{point_x:.8f}, {point_y:.8f}]" # 保留8位小数
# 查找包含此点的多边形
intersecting_ids = spatial_index.intersects(point_geom.boundingBox())
for poly_id in intersecting_ids:
polygon_feature = polygon_layer.getFeature(poly_id)
if polygon_feature.geometry().contains(point_geom):
polygon_layer.changeAttributeValue(polygon_feature.id(),
polygon_layer.fields().indexFromName("center"), center_value)
break
# 保存并退出编辑模式
polygon_layer.commitChanges()
执行之后,polygon的属性表中就多了一个字段center,值为[90.90873336,26.43078741]形式。
注意:此段代码只能用于以下情况
- 确保点图层的每个点位于面图层的某个面内,否则无法找到对应的面。
- 如果点图层中存在多个点位于同一个面中,则此代码仅将找到的第一个点的坐标赋值给面图层。
方案二:不需要单独创建中心点图层,直接运行python
polygon_layer = QgsProject.instance().mapLayersByName("Polygon")[0]
polygon_layer.startEditing()
polygon_layer.dataProvider().addAttributes([QgsField("center", QVariant.String, len=50)])
polygon_layer.updateFields()
for polygon_feature in polygon_layer.getFeatures():
polygon_geom = polygon_feature.geometry()
centroid_geom = polygon_geom.centroid()
center_x = round(centroid_geom.asPoint().x(), 8)
center_y = round(centroid_geom.asPoint().y(), 8)
center_value = f"[{center_x:.8f}, {center_y:.8f}]"
polygon_layer.changeAttributeValue(polygon_feature.id(),
polygon_layer.fields().indexFromName("center"), center_value)
polygon_layer.commitChanges()


1万+

被折叠的 条评论
为什么被折叠?



