PyQGIS'te adlarıyla katman mı alıyorsunuz?


15

Mesafe sağlanan şehirler listesi için tampon bulan bir eklentim var. Eyalet ve şehir adları özellik tablosundan alınır ve buna göre filtrelenir. Benim eklentim, tuvalde bulunan diğer katmanlardan bağımsız olarak, tuvaldeki katmanın adını veya sırasını tanımlamalı ve bu katmandaki ilgili niteliklere erişmelidir.

Ben de sadece belirli bir katman adını kodunda işaret diğer bazı katmanları mevcut olsa da yineleme herhangi bir hataya neden olup olmadığını merak ediyorum?

Kodum aşağıda lütfen nerede değişiklik yapmam gerektiğini söyleyin ve değişiklik ne olurdu?

    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)

Yanıtlar:


41

GÜNCELLEME: 10.04.2018

Kullanılması 3.x QGIS kullanabilirsiniz mapLayersByNamegelen yöntem QgsProjectbu şekilde sınıfa:

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

QGIS'de katmanlar panelinde aynı ada sahip birkaç katmanınız olabileceğinden, yukarıdaki yöntem size eşleşen katmanların bir listesini verir.


For QGIS 2.x :

Katmanınızın diğerlerinden ayırt edebileceğiniz bir adı olduğundan emin olmanız gerekir. Bunun yerine layer = self.iface.activeLayer()şunları yapın:

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

Katman adına güvenmiyorsanız (sonuçta kullanıcı tarafından herhangi bir zamanda değiştirilebilir), katman kaynağını kontrol etmeyi deneyebilirsiniz. Katmanınız bir Shapefile ise, Shapefile yolunu şu şekilde kontrol edebilirsiniz:

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

EDIT: @ Jakob yorumlarda belirttiği gibi, ilk bloğu bir satırda yazabilirsiniz:

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

Veya:

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

Her neyse, layerListilk öğesine erişmeden önce boş olmadığını kontrol etmeniz gerekir :

if layerList: 
    layer = layerList[0]

2
qgsMapLayerRegistry.instance (). maprayers (). değerleri () lyr.name () == "LAND"] [0] .name ()
Jakob

7
layer = QgsMapLayerRegistry.instance (). mapLayersByName ("mylayername") [0]
Jakob

neden layer = nonekodunuzun başında ayarlıyorsunuz ? Özellikle onun bir işlevi varsa gereksiz görünüyor
user32882 12:09

1
Bu varsayılan bir değerdir, çünkü for içinde bir if vardır. Eğer if hiç karşılanmazsa, for'dan sonra katman hiç mevcut olmaz. Böylece, daha sonra katman değişkenini okuyabildiğinizden emin olmak için.
Germán Carrillo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.