QGIS Python'da harita katmanları üzerinde yineleme mi yapıyorsunuz?


30

Harita katmanlarını nasıl yineleyeceğinizi bulmakta güçlük çekiyorum. Şu anda vurgulanan katmana içindekiler tablosundan erişebilirim iface.activeLayer()ancak kodumun tüm katmanlarda çalışmasını istiyorum.

API’de bu işleve kolay erişim sağlayan ve iyi bir çevrimiçi örnek bulamadığım hiçbir şey göremiyorum ama belki bir şey özledim?


Nasıl QgsMapLayerRegistry veya QgsProject kullanıyorsunuz anlamıyorum. QGIS 3.0.2'de bu çalışmıyor. Ancak, iface.mapCanvas (). Layers () yapar. Şey, bir nevi. Size yalnızca aktif katmanları (Katmanlar bölmesinde kontrol ettiğinizler) veriyor gibi görünüyor. Katmanlar bölmesinde denetlenmeyenler bile dahil tüm Katmanların listesini nasıl bulacağınızı bilen var mı? Ayrıca, Plugin Builder kullanıyorsanız, eklentinizin kabuğunu sizin için yaratır. Run işlevi, iface kullanmak için gereken bir "self" parametresine sahiptir. yani, self.iface.mapCanvas (). katmanları (), sadece değişken.
ajpieri

Yanıtlar:


24

Deneyin...

# 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

İtlaf consolidatethread.py gelen QConsolidate eklentisi .

QgsLegendInterface nesnesinin açıklaması legendInterface () öğesinden döndürüldü.

Düzenleme : yukarıdaki 'öz' ile ilgili bilgi eklendi.


Teşekkürler! Hile yaptı. Efsanenin harita düzenindeki nesne olduğu ve içindekiler tablosunun katman listesine atıfta bulunduğu ESRI dünyasına da alıştığımı tahmin ediyorum.
spencerrecneps

2
Nathan'ın bahsettiği mapCanvas () tekniği ile bunun arasında döndürülenler arasında bir fark olduğuna dikkat edin. LegendInterface () nesnesi, harita tuvalinde gösterilmese bile tüm katmanları döndürür, mapCanvas () yalnızca tuvalde gösterilenleri döndürür. MapCanvas () kullanmak, görünür katmanlara referans almak için güzel ve hızlı bir yoldur.
dakcarto

1
Başka bir notta, QGIS'in son sürümleri (> = 1.8), kullanıcının açıklama katmanında listelenen sıradan ayrı olarak bir katman oluşturma sırasını tanımlamasını sağlar (çok hoş!). LegendInterface () ve mapCanvas () yöntemleri, her biri için sırasıyla katman sırasını döndürür.
dakcarto

19

Başka iki yol daha var:

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

size katmanların bir listesini verecek

veya

layers = QgsMapLayerRegistry.instance().mapLayers()

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

Bu cevap içinde 2.16ve üstünde çalışmıyor gibi görünüyor
raphael

10

QGIS 2.6 için, burada her katmanı tanımlayan ve gruplayan kod:

#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)

Not: Gruplama işleminden sonra, kullandığım kopya katmanı kaldırmam gerekiyor root.removeLayer(lyr).


9

QGIS 3 için, QgsMapLayerRegistryişlevselliği taşındı QgsProject.

Bu nedenle, harita katmanlarını yinelemek için bu yapıyı kullanmalısınız:

layers = QgsProject.instance().mapLayers()

.mapLayers()olarak yapılandırılmış bir sözlük döndürür {layer_x_id: layer_x, layer_y_id: layer_y, ....}. Sonra aşağıdaki gibi katmanları yineleyebilirsiniz:

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

Çünkü .mapLayers()getiriler bir sözlük ( dict), ayrıca kullanabilirsiniz .values()sadece bir sözlük olan getiri yöntemi listbu durumda katmanları içeren. Sonra aşağıdaki gibi katmanları yineleyebilirsiniz:

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

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

İsterseniz, bu şekilde yineleyebilirsiniz:

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

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

Merhaba! Paylaştığın için teşekkürler. Katmanların isimlerini yazdırmak iyi çalışıyor ... ama sözlüğün anahtarlarını yazdıramıyorum. Bana bununla yardım edebilir misin?
caio villaca

1
for layer in layers: print(layer)Anahtarları yazdırmak için betiği kullanabilirsiniz. Ya da sadece döngü print(layers.keys())olmadan kullanın for.
Kadir Şahbaz
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.