PyQGISで名前でレイヤーを取得していますか?


14

距離があれば、都市のリストのバッファーを見つけるプラグインがあります。州と都市の名前は属性テーブルから取得され、それに応じてフィルタリングされます。私が欲しいのは、私のプラグインは、キャンバスに存在する他のレイヤーに関係なく、キャンバスのレイヤー名またはレイヤーの順序を識別し、そのレイヤーから対応する属性にアクセスする必要があるということです。

また、コード内の特定のレイヤー名を指すと、他のレイヤーがいくつか存在するにもかかわらず、反復でエラーが発生するのではないかと思っています。

以下は私のコードです。どこで変更を加える必要があり、何が変更されるのか教えてください。

    if dist and centerCity:
        #QMessageBox.information(self.dlg, "info", "both True")
        st = '"name" = \'' + centerCity + '\''
        exp = QgsExpression(st)
    else:
        QMessageBox.warning(self.dlg, "Enter the distance","Enter the distance and try again.")        
        return          #terminate the function

    layer = self.iface.activeLayer() 
    it = layer.getFeatures(QgsFeatureRequest(exp))
    feature = it.next()
    mbuf = feature.geometry().buffer(dist, 2)       

    iterFeat = layer.getFeatures()

    for f in iterFeat:
        geom2 = f.geometry()
        valTest = QgsGeometry.within(geom2, mbuf)

回答:


38

更新:10.04.2018

使用3.xのQGISあなたが使用することができますmapLayersByNameからメソッドをQgsProjectこのようにクラスを:

layers = QgsProject.instance().mapLayersByName('my layer name')

レイヤーパネルで同じ名前の複数のレイヤーをQGISに持つことができるため、上記の方法は一致するレイヤーのリストを提供します。


QGIS 2.xの

レイヤーには、他のレイヤーと区別できる名前を付ける必要があります。の代わりにlayer = self.iface.activeLayer()

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "YOUR_LAYER_NAME":
        layer = lyr
        break

レイヤー名が信頼できない場合(結局、ユーザーがいつでも変更できます)、レイヤーソースを確認してみてください。レイヤーがシェープファイルの場合、次の方法でシェープファイルへのパスを確認できます。

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.source() == "/path/to/shapefile.shp":
        layer = lyr
        break

編集:@Jakobがコメントで指摘したように、最初のブロックを1行で書くことができます:

layerList = QgsMapLayerRegistry.instance().mapLayersByName("YOUR_LAYER_NAME")

または:

layerList = [lyr for lyr in QgsMapLayerRegistry.instance().mapLayers().values() if lyr.name() == "YOUR_LAYER_NAME"]

とにかく、layerList最初の要素にアクセスする前に空でないことを確認する必要があります。

if layerList: 
    layer = layerList[0]

2
印刷[lyr.name()== "LAND"] [0] .name()の場合、QgsMapLayerRegistry.instance()。mapLayers()。values()のlyrのlyr
Jakob

7
layer = QgsMapLayerRegistry.instance()。mapLayersByName( "mylayername")[0]
ヤコブ

なぜlayer = noneあなたはコードの始めに設定しているのですか?これは、関数の中で、特にその場合、不要と思われる
user32882

1
forの中にifがあるため、これはデフォルト値です。ifが満たされない場合、forの後、レイヤーはまったく存在しません。そのため、後でレイヤー変数を読み取れるようにするためです。
ゲルマンカリージョ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.