答:感谢@尼尔斯-Werner和@goyo指着我在正确的方向:我需要通过Move iterTwo = layerTwo.getFeatures() right before for feat in iterTwo :
这样:如何迭代两个不同的qgis图层的特征?
layerOne = QgsVectorLayer('~/FirstLayer.shp', 'layerOne', 'ogr')
layerTwo = QgsVectorLayer('~/SecondLayer.shp', 'layerTwo', 'ogr')
iterOne = layerOne.getFeatures()
for feature in iterOne:
layerOneId = feature.attributes()[0]
print layerOneId
iterTwo = layerTwo.getFeatures()
for feat in iterTwo :
layerTwoId = feat.attributes()[0]
print "LayerOneId",LayerOneId, "LayerTwoId", LayerTwoId"
# do something if LayerOneId == LayerTwoId
我有两层,我想比较:
layerOne = QgsVectorLayer('~/FirstLayer.shp', 'layerOne', 'ogr')
layerTwo = QgsVectorLayer('~/SecondLayer.shp', 'layerTwo', 'ogr')
iterOne = layerOne.getFeatures()
iterTwo = layerTwo.getFeatures()
for feature in iterOne:
layerOneId = feature.attributes()[0]
print layerOneId
for feat in iterTwo :
layerTwoId = feat.attributes()[0]
print "LayerOneId",LayerOneId, "LayerTwoId", LayerTwoId"
# do something if LayerOneId == LayerTwoId
该代码在LayerOne的第一次迭代中正确运行,但只在第一层迭代而不检查第二层。结果看起来像这样:
LayerOneId, 0
LayerOneId, 0, LayerTwoId, 0
LayerOneId, 0, LayerTwoId, 1
...
LayerOneId, 0, LayerTwoId, n
LayerOneId, 1
LayerOneId, 2
...
LayerOneId, n
为什么我的函数只是迭代我的第一层的第一个特性?
更确切地说,我在寻找这样它在Python控制台工作的结果:
arrayOne = [1,2]
arrayTwo = [1,2]
for a in arrayOne :
for b in arrayTwo:
print a,b
>>> 1,1
>>> 1,2
>>> 2,1
>>> 2,2
也许'layerTwo.getFeatures()'返回将一次运行后排出的迭代符。你有没有尝试过使用'list(layerTwo.getFeatures())'将它转换成列表?或者,您可以尝试'在layerTwo.getFeatures()'中使用壮举。 –
是这样做的,因为每次迭代iterOne只需要'print layerOneId'一次 –
第二次迭代器在外循环的第一次迭代中耗尽,您将需要在每次迭代中重新创建它。将iterTwo = layerTwo.getFeatures()放在'之前移动iterTwo:' – Goyo