在 Python QGIS 中查找相邻的多边形
Find neighbouring polygons in Python QGIS
我正在使用我找到的代码,并为我的目的稍作修改。问题是,它并没有完全按照我的意愿行事,我一直在想通过更改来修复它。
我正在搜索所有共享公共边界(一条线)的相邻多边形,而不是一个点
我的目标:135/12 与 319/2 135/4、317 相邻,但与 320/1 不相邻
在我 运行 我的脚本
之后,我在 QGIS table 中得到了什么
NEIGBOURS 是相邻的多边形,
SUM 是相邻多边形的数量
我使用的代码还包括 320/1 作为相邻多边形。如何解决?
from qgis.utils import iface
from PyQt4.QtCore import QVariant
_NAME_FIELD = 'Nr'
_SUM_FIELD = 'calc'
_NEW_NEIGHBORS_FIELD = 'NEIGHBORS'
_NEW_SUM_FIELD = 'SUM'
layer = iface.activeLayer()
layer.startEditing()
layer.dataProvider().addAttributes(
[QgsField(_NEW_NEIGHBORS_FIELD, QVariant.String),
QgsField(_NEW_SUM_FIELD, QVariant.Int)])
layer.updateFields()
feature_dict = {f.id(): f for f in layer.getFeatures()}
index = QgsSpatialIndex()
for f in feature_dict.values():
index.insertFeature(f)
for f in feature_dict.values():
print 'Working on %s' % f[_NAME_FIELD]
geom = f.geometry()
intersecting_ids = index.intersects(geom.boundingBox())
neighbors = []
neighbors_sum = 0
for intersecting_id in intersecting_ids:
intersecting_f = feature_dict[intersecting_id]
if (f != intersecting_f and
not intersecting_f.geometry().disjoint(geom)):
neighbors.append(intersecting_f[_NAME_FIELD])
neighbors_sum += intersecting_f[_SUM_FIELD]
f[_NEW_NEIGHBORS_FIELD] = ','.join(neighbors)
f[_NEW_SUM_FIELD] = neighbors_sum
layer.updateFeature(f)
layer.commitChanges()
print 'Processing complete.'
我找到了一些解决方法。在使用我的脚本之前,我在所有关节周围创建了一个小缓冲区(出于我的目的,0.01 米就足够了)。后来,我使用差异工具从我的主图层中删除缓冲区,从而删除不需要的相邻多边形。使用代码现在可以正常工作
我正在使用我找到的代码,并为我的目的稍作修改。问题是,它并没有完全按照我的意愿行事,我一直在想通过更改来修复它。
我正在搜索所有共享公共边界(一条线)的相邻多边形,而不是一个点
我的目标:135/12 与 319/2 135/4、317 相邻,但与 320/1 不相邻
在我 运行 我的脚本
之后,我在 QGIS table 中得到了什么NEIGBOURS 是相邻的多边形,
SUM 是相邻多边形的数量
我使用的代码还包括 320/1 作为相邻多边形。如何解决?
from qgis.utils import iface
from PyQt4.QtCore import QVariant
_NAME_FIELD = 'Nr'
_SUM_FIELD = 'calc'
_NEW_NEIGHBORS_FIELD = 'NEIGHBORS'
_NEW_SUM_FIELD = 'SUM'
layer = iface.activeLayer()
layer.startEditing()
layer.dataProvider().addAttributes(
[QgsField(_NEW_NEIGHBORS_FIELD, QVariant.String),
QgsField(_NEW_SUM_FIELD, QVariant.Int)])
layer.updateFields()
feature_dict = {f.id(): f for f in layer.getFeatures()}
index = QgsSpatialIndex()
for f in feature_dict.values():
index.insertFeature(f)
for f in feature_dict.values():
print 'Working on %s' % f[_NAME_FIELD]
geom = f.geometry()
intersecting_ids = index.intersects(geom.boundingBox())
neighbors = []
neighbors_sum = 0
for intersecting_id in intersecting_ids:
intersecting_f = feature_dict[intersecting_id]
if (f != intersecting_f and
not intersecting_f.geometry().disjoint(geom)):
neighbors.append(intersecting_f[_NAME_FIELD])
neighbors_sum += intersecting_f[_SUM_FIELD]
f[_NEW_NEIGHBORS_FIELD] = ','.join(neighbors)
f[_NEW_SUM_FIELD] = neighbors_sum
layer.updateFeature(f)
layer.commitChanges()
print 'Processing complete.'
我找到了一些解决方法。在使用我的脚本之前,我在所有关节周围创建了一个小缓冲区(出于我的目的,0.01 米就足够了)。后来,我使用差异工具从我的主图层中删除缓冲区,从而删除不需要的相邻多边形。使用代码现在可以正常工作