geologyidea.com
Viac

Aktivácia vrstvy podľa jej názvu v PyQGIS

Aktivácia vrstvy podľa jej názvu v PyQGIS


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.


Píšem skript, ktorý vyžaduje fungovanie atribútov rôznych vrstiev, a chcel by som vedieť, ako nazvať vrstvu, ktorá nie je momentálne aktívna, a získať jej vlastnosti.

Mám napríklad tri vrstvy s názvom „Poláky“, „Čiary“ a „Zaťaženia“ a všetky funkcie vrstiev musím získať pomocoulayer.getFeatures ()a tieto funkcie uložiť do zoznamu pre každú vrstvu. Spravíme to iba pre jednu vrstvu:

Ak je moja aktívna vrstva „Poliaci“, napíšem:

layer = iface.activeLayer () poles = layer.getFeatures ()

A potom môžem robiť čokoľvek s „pólmi“, ale ako to môžem urobiť s ostatnými vrstvami, ktoré nie sú aktívne? Ak by som chcel urobiť to isté s vrstvou „Lines“, musel by som ju aktivovať „ručne“ kliknutím na ňu a opakovaním daného kódu.

Vyskúšal som túto metódu: Získanie vrstvy podľa názvu v PyQGIS?

A toto: Získanie vrstvy, ktorá nie je aktívna s PyQGIS

Vždy sa mi ale zobrazí toto chybové hlásenie, pretože neaktivujem vrstvu, iba vytváram zoznam názvov vrstiev.

Traceback (posledný posledný hovor): Súbor "", riadok 1, v  AttributeError: objekt 'list' nemá žiadny atribút 'getFeatures'

Ako môžem aktivovať vrstvu podľa názvu, aby som získal funkcie v nej?


TL; DR

Ak chcete získať všetky funkcie vrstvy podľa názvu vrstvy, nemusíte ju aktivovať. Stačí použiť

name = 'counties' layer = QgsProject.instance (). mapLayersByName (name) [0] poles = layer.getFeatures () pre pól v póloch: if is_north (pól): print ('je to severný pól')

Aktívna vrstva

V prvom rade sa nemusíte starať o aktívna vrstva. The aktívna vrstva je vrstva, ktorá je momentálne vybraná v strome vrstiev, a preto je vhodná pre dve veci

  1. umožňuje používateľovi zvoliť vrstvu, na ktorej bude pracovať
  2. výber vrstvy na rýchle testovanie kódu z konzoly python

Druhá je užitočná pri vývoji, prvá je základom toho, na čom sú založené všetky maptools: aktuálne vybraná vrstva ( aktívny jeden) je upravený, vybraný, vymazaný ...

Metódy prístupu k vrstvám

Zdá sa však, že chcete získať prístup k vrstvám nie na základe vstupu používateľa, ale na základe niečoho iného.

Identifikácia vrstiev

Všetky vrstvy majú

  • An id to musí byť jedinečné
  • A názov nie je nevyhnutne (ale často) jedinečný a môže byť zmenený používateľom
  • A odkaz (tiež často označované ako ukazovateľ ale v pythone sú tieto dva pojmy zameniteľné), ktorý je jedinečný a stabilný po celú dobu životnosti vrstvy počas behu aplikácie a dá sa priradiť k premennej (napr.vlayerje odkaz na aktuálne aktívnu vrstvu vo vašom príklade).
  • Vlastnosti ako URI (názov tabuľky atď.)

Ak už máte odkaz na vrstvu (pretože ste ju vytvorili / pridali do svojho pluginu), použite túto.

Ak to neurobíte, zamyslite sa nad tým, akú vlastnosť chcete použiť na získanie prístupu do vrstvy. S najväčšou pravdepodobnosťou niečo, čo je stabilné (ID vrstvy je veľmi stabilné počas celej životnosti projektu, ale vždy sa líši pre rôzne projekty), názov je nastaviteľný používateľom, tabuľka môže závisieť od zdroja údajov.

Prístup k vrstvám

Existuje register mapových vrstiev, ktorý vám umožňuje prístup k vrstvám. Spravuje odkazy na všetky vrstvy. Predtým sa to nazývalo QgsMapLayerRegistry, ale to už v QGIS 3 nie je k dispozícii, takže sa dá namiesto toho použiť QgsProject.

register = QgsProject.instance ()

Ak máte ID vrstvy, choďte s

layer = registry.mapLayer (id)

Ak máte názov vrstvy

layer = registry.mapLayersByName (name) [0] # Metóda vráti zoznam, pretože môže byť nejednoznačný, 0 vyberie prvý záznam v zozname

Ak máte niečo iné, musíte napísať svoj vlastný kód:

pre lyr v registry.mapLayers (). values ​​(): if lyr.dataProvider (). dataSourceUri (). table () == 'mytable': layer = lyr break

Alebo skratka, ktorá robí to isté a spôsobuje, že sa cítite hackerskejšie, ale spôsobí, že ľudia, ktorí si budú musieť tento kód neskôr udržiavať, budú musieť dešifrovať nejaký čas navyše:

layer = (l for l in registry.mapLayers (). values ​​() if l.dataProvider (). dataSourceUri (). table () == 'mytable'). next ()

Nie je to úplne podľa názvu, ale môžete ich tiež použiť QgsMapCanvas predmety. Ďalší kód:

mapcanvas = iface.mapCanvas () n = mapcanvas.layerCount () vrstvy = [mapcanvas.layer (i) pre i v rozsahu (n)] layer_names = [layer.name () pre vrstvu vo vrstvách] # skutočné názvy vektorových vrstiev print "Layers_names =", Layers_names póly = [pól pre pól vo vrstvách [0] .getFeatures ()] #testovanie iba jednej funkcie, ak sú póly [0] .geometry (). type () == QGis.Point: tlač "Je to bodová vrstva "lines = [line for line in layers [1] .getFeatures ()] #testing only one feature if lines [0] .geometry (). type () == QGis.Line: print" Je to líniová vrstva „

bolo použité s týmito vektorovými vrstvami na nasledujúcom obrázku:

Keď bol kód spustený v konzole Python, výsledok bol:

layer_names = [u'random_points ', u'line'] Je to bodová vrstva Je to líniová vrstva

Ak invertujete poradie vrstiev v legende mapy, vytlačí sa iba tento zoznam:

Layers_names = [u'line ', u'random_points']