2017-07-18 88 views
0

答:感谢@尼尔斯-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 
+3

也许'layerTwo.getFeatures()'返回将一次运行后排出的迭代符。你有没有尝试过使用'list(layerTwo.getFeatures())'将它转换成列表?或者,您可以尝试'在layerTwo.getFeatures()'中使用壮举。 –

+0

是这样做的,因为每次迭代iterOne只需要'print layerOneId'一次 –

+1

第二次迭代器在外循环的第一次迭代中耗尽,您将需要在每次迭代中重新创建它。将iterTwo = layerTwo.getFeatures()放在'之前移动iterTwo:' – Goyo

回答

0

ANSWER访问与ID的元组:感谢@尼尔斯-Werner和@goyo指着我在正确的方向:我需要到正确的服务feat in iterTwo :之前通过Move iterTwo = layerTwo.getFeatures()这样:

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 
1

我会用itertools.product遍历这两个功能

import itertools 

layerOne = QgsVectorLayer('~/FirstLayer.shp', 'layerOne', 'ogr') 
layerTwo = QgsVectorLayer('~/SecondLayer.shp', 'layerTwo', 'ogr') 

for features in itertools.product(layerOne.getFeatures(), layerTwo.getFeatures()): 

    id = tuple(feat.attributes()[0] for feat in features) 

    print "LayerOneId" ,id[0] , "LayerTwoId", id[1] 

    if id[0] == id[1]: 
     pass 
     # code if both id's match 

features是一个元组与两个层的功能。如果需要,除了ID更多的功能,你可以用类似zipped_attributes = zip(*feat.attributes() for feat in features)这些移调与id = zipped_attributes[0]

相关问题