QGIS中提取面的中心坐标到属性表

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

参考:QGIS提取面的顶点坐标到属性表-CSDN博客

方案一:需要创建一个中心点图层,再把两个图层结合起来

第一步:提取面的中心点,生成质心图层,取名为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()

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值