QGIS Pythonでマップレイヤーを反復処理しますか?


30

マップレイヤーを反復処理する方法がわかりません。コンテンツウィンドウで現在強調表示されているレイヤーにアクセスできますiface.activeLayer()が、コードをすべてのレイヤーで動作させたいです。

この機能への簡単なアクセスを提供するAPIに何も表示されず、良いオンライン例が見つかりませんでしたが、何か見落としていたのかもしれません。


QgsMapLayerRegistryやQgsProjectをどのように使用しているかわかりません。QGIS 3.0.2では、これは機能しません。ただし、iface.mapCanvas()。layers()は行います。まあ、ちょっと。アクティブなレイヤー([レイヤー]ペインでチェックしたレイヤー)のみが表示されるようです。レイヤーペインでチェックされていないレイヤーも含め、すべてのレイヤーのリストを取得する方法を知っている人はいますか?また、プラグインビルダーを使用している場合は、プラグインのシェルが作成されます。run関数には「self」パラメーターがあり、ifaceを使用するために必要です。すなわち、self.iface.mapCanvas()。layers()、ちょうどfyi。
ajpieri

回答:


24

試してみてください...

# substitute 'self' with 'qgis.utils.iface' when run from Python console
# 'self.iface = iface' would usually precede this command in your class 
layers = self.iface.legendInterface().layers()

for layer in layers:
    layerType = layer.type()
    if layerType == QgsMapLayer.VectorLayer:
        # do some stuff here

抜粋consolidatethread.pyからQConsolidateプラグイン

legendInterface()から返されたQgsLegendInterfaceオブジェクトの説明。

編集:上記の「自己」に関する情報を追加しました。


ありがとう!それはトリックをしました。私は、凡例がマップレイアウトのオブジェクトであり、コンテンツウィンドウがレイヤーのリストを参照するESRIの世界にも慣れていると思います。
spencerrecneps

2
これと、Nathanが言及しているmapCanvas()テクニックの間に返されるものに違いがあることに注意してください。legendCanvas()オブジェクトは、マップキャンバスに表示されていない場合でもすべてのレイヤーを返しますが、mapCanvas()はキャンバスに表示されているレイヤーのみを返します。mapCanvas()を使用すると、表示されているレイヤーへの参照を取得する素晴らしく簡単な方法です。
dakcarto

1
別の注意として、QGISの最新バージョン(> = 1.8)では、凡例にリストされている順序とは別に、レイヤーのレンダリング順序を定義できます(非常に素晴らしい!)。legendInterface()およびmapCanvas()メソッドは、それぞれのレイヤーの順序を返します。
dakcarto

19

他にも2つの方法があります。

layers = self.iface.mapCanvas().layers()

レイヤーのリストが表示されます

または

layers = QgsMapLayerRegistry.instance().mapLayers()

for name, layer in layers.iteritems():
     print name, layer.type()

この答えは2.16以上では機能しないようです
ラファエル

10

QGIS 2.6の場合、各レイヤーを識別してグループ化するコードは次のとおりです。

#make the desired groups for layers
toc = self.iface.legendInterface()
root = QgsProject.instance().layerTreeRoot()
group1 = root.insertGroup(0, "Group Point")
group2 = root.insertGroup(1, "Group Line")
group3 = root.insertGroup(2, "Group Polygon")
#get the list of layers  from registry
layers = QgsMapLayerRegistry.instance().mapLayers()
#segregate layers into groups 
for name, layer in layers.iteritems():
    # check the layer geometry type 
    if layer.geometryType() == QGis.Point:
        toc.moveLayer(layer, 0)

    if layer.geometryType() == QGis.Line:
        toc.moveLayer(layer, 1)

    if layer.geometryType() == QGis.Polygon:
        toc.moveLayer(layer, 2)

注:グループ化した後、重複したレイヤーを削除する必要があるため、を使用しましたroot.removeLayer(lyr)


9

QGIS 3 QgsMapLayerRegistryの機能はに移動しましたQgsProject

したがって、マップレイヤーを反復処理するには、その構造を使用する必要があります。

layers = QgsProject.instance().mapLayers()

.mapLayers()として構造化された辞書を返します{layer_x_id: layer_x, layer_y_id: layer_y, ....}。その後、次のようにレイヤーを反復処理できます。

for layer_id, layer in layers.items():
    print(layer.name())

.mapLayers()辞書(dict)を返すため、その場合はレイヤーを含む.values()を返す辞書のメソッドを使用することもできますlist。その後、次のようにレイヤーを反復処理できます。

layers = QgsProject.instance().mapLayers().values()

for layer in layers:
    print(layer.name())

必要に応じて、次の方法で繰り返すことができます。

layers = QgsProject.instance().mapLayers() # dictionary

for layer in layers.values():
    print(layer.name())

こんにちは!共有してくれてありがとう。レイヤーの名前を印刷するのはうまくいきますが、辞書のキーを印刷することはできません。それで私を助けてもらえますか?
caio villaca

1
for layer in layers: print(layer)スクリプトを使用してキーを印刷できます。または、ループprint(layers.keys())なしで使用しforます。
カディールŞahbaz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.