首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空间连接的PyQGIS

空间连接的PyQGIS
EN

Stack Overflow用户
提问于 2014-05-06 23:44:08
回答 1查看 2.4K关注 0票数 0

对于QGIS2.0/2.2和Python2.7插件,我尝试基于几何函数QgsGeometry.intersects()将一个层的字段属性更新为另一个层的字段属性。我的第一层是点层,第二层是包含方位测量的矢量多线层的缓冲器。我想更新点层,以包括它相交的缓冲区多边形的方位信息(基本上是一个空间连接)。它是自动化的过程所描述的这里。目前,只有我的点层的轴承字段的第一个功能是更新后提交更改(我预期所有的功能将被更新)。

代码语言:javascript
复制
rotateBUFF = my buffer polygon layer
pointLayer = my point layer to obtain azimuth data

rotate_IDX = rotateBUFF.fieldNameIndex('bearing')
point_IDX = pointLayer.fieldNameIndex('bearing')
rotate_pr = rotateBUFF.dataProvider()
point_pr = pointLayer.dataProvider()
rotate_caps = rotate_pr.capabilities()
point_caps = point_pr.capabilities()
pointFeatures = pointLayer.getFeatures()
rotateFeatures = rotateBUFF.getFeatures()

for rotatefeat in rotateFeatures:
    for pointfeat in pointFeatures:
        if pointfeat.geometry().intersects(rotatefeat.geometry()) == True:
            pointID = pointfeat.id()
            if point_caps & QgsVectorDataProvider.ChangeAttributeValues:
                bearing = rotatefeat.attributes()[rotate_IDX]
                attrs = {point_IDX : bearing}
                point_pr.changeAttributesValues({pointID : attrs})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-08 05:18:39

将迭代器移动到循环中可以完成以下任务:

代码语言:javascript
复制
for rotatefeat in rotateBUFF.getFeatures():
  for pointfeat in pointLayer.getFeatures():

此外,如果您在数据提供程序上工作,则不需要提交更改。有两种编辑数据的方法:

  1. 在该层上使用它的编辑缓冲器,但您必须首先启用编辑。编辑完成后,必须提交更改。
  2. 在您需要的数据提供程序上。不需要提交更改,它们在使用changeAttributeValues时直接应用。

通常,建议在层上进行编辑,以防止对不处于编辑模式的层进行修改。对于插件来说尤其如此。但是,如果这段代码是严格针对您的,那么使用数据提供程序可能会更容易。编辑缓冲区的一个优点是可以立即提交更改,如果在循环中发生了错误,则放弃这些更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23506358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档