PyQGIS用于空间连接

时间:2014-05-06 23:44:08

标签: python qgis

对于QGIS 2.0 / 2.2和Python 2.7插件,我尝试使用基于几何函数QgsGeometry.intersects()的另一个图层的字段属性更新一个图层的字段属性。我的第一层是点层,第二层是包含方位角测量的矢量折线层的缓冲区。我想更新点图层以包括它相交的缓冲区多边形的方位角信息(基本上是空间连接)。它是自动化here描述的过程。目前,只有我的点图层轴承字段中的第一个特征在提交更改后更新(我希望所有要素都更新)。

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})

1 个答案:

答案 0 :(得分:1)

将迭代器移动到循环可以解决问题:

for rotatefeat in rotateBUFF.getFeatures():
  for pointfeat in pointLayer.getFeatures():

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

    使用edit buffer在图层上
  1. ,但您必须先启用编辑功能。编辑完成后,您必须提交更改。
  2. 根据需要在数据提供者上提供。无需提交更改,在使用changeAttributeValues时直接应用它们。
  3. 通常,建议在图层上进行编辑,以防止对未处于编辑模式的图层进行修改。插件尤其如此。但是,如果此代码严格适合您,则可能更容易使用数据提供程序。编辑缓冲区的一个优点是您可以一次提交更改,如果在循环期间出现问题,则放弃更改。