如何迭代两个不同qgis层的特性?

2024-10-03 17:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

答:感谢@nils werner和@goyo为我指出了正确的方向:我需要这样通过Move iterTwo = layerTwo.getFeatures() right before for feat in iterTwo :

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

我有两层,我想比较一下:

^{pr2}$

这段代码在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

Tags: inforfeatureprintfeatshpogrlayerone
2条回答

答:感谢@nils 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

我将使用^{}来迭代这两个特性

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]来访问具有id的元组

相关问题 更多 >