Vairāk

Programmiski grupēt vairākus slāņus atsevišķās grupās, izmantojot QGIS?

Programmiski grupēt vairākus slāņus atsevišķās grupās, izmantojot QGIS?


Mēģinu sagrupēt lielu skaitu slāņu, pamatojoties uz kopīgu nosaukuma virknes daļu. Tie ir daudzstūru un punktu sajaukums. Es gribētu izveidot atsevišķas grupas, izmantojot daļu slāņa nosaukuma. Kādam ir idejas? Es gribēju izveidot spraudni, bet es to nespēju (savu kodēšanas spēju dēļ).

Es pievienoju attēlu, lai parādītu to, ko meklēju kā gala rezultātu. Man ir projekti ar lielu informācijas daudzumu, kas jāgrupē.


To var izdarīt trīs darbībās: iegūstiet grupu nosaukumus, izveidojiet grupas un pārvietojiet slāņus.

Pārbaudes nolūkos esmu atkārtojis jūsu scenārija paraugu:

QGIS Python konsolē palaidiet šo koda fragmentu:

# 1. Iegūstiet grupas nosaukumus un slāņu ID sarakstu root = QgsProject.instance (). LayerTreeRoot () dictGroups = {} slānim root.findLayers (): ja QgsLayerTree.isLayer (slānis): prefikss = "Vietne" + slānis .layerName (). split ("_") [0] # Pielāgojiet to atbilstoši savām vajadzībām, ja ne prefikss dictGroups: dictGroups [prefix] = [] dictGroups [prefix] .append (layer.layerId ()) # 2. Izveidojiet grupas atslēgai dictGroups: root.addGroup (atslēga) # 3. Pārvietojiet atslēgas slāņus dictGroups: parent = root.findGroup (atslēga) ID dictGroups [atslēga]: layer = root.findLayer (id) clone = layer .clone () parent.insertChildNode (0, clone) root.removeChildNode (slānis)

Jums vajadzētu iegūt kaut ko līdzīgu šim:


Es šeit pievienoju tikai nedaudz papildu bet es ceru, ka izpēte var palīdzēt citiem.

Es ilgi pavadīju galvu ap mezgliem pret slāņiem.

Šķiet, ka slāņi ir "smagā svara" pamatā esošie objekti, un mezglus izmanto, lai attēlotu izkārtojumu kokā. (https://qgis.org/api/classQgsLayerTreeNode.html#details)

Es piedāvāju šo kodu ar pāris priekšrocībām salīdzinājumā ar pieņemto amatu (un es nebūtu šeit nokļuvis bez pieņemtās atbildes, tāpēc PALDIES Germānam Carrillo):

  1. Tas manipulē ar koks nevis kādi slāņi. (Patiesībā, tikai divreiz pārbaudiet dokumentus - findLayer faktiski atgriež LayerTreeNode (kā LayerTreeLayer), tāpēc paliek “mezglu” sfērā. Dažreiz vārdu saīsināšana var izraisīt nepareizu novirzīšanu ...)
  2. Tas iegūst atlasītos mezglus un veido tos tikai apakšgrupā. (Šis bija mans personīgais lietojums, ne vienmēr tas, ko pieprasīja DP.)
  3. Saglabā objektu (mezglu) atsauces, nevis vāc un pārskata QGIS slāņa ID.
  4. IzmantoaddChildNodenevisinsertChildNode (0,…, lai saglabātu mezglu kārtību jaunajā grupā.
  5. Apzināti izmantojot papildu cilpu, lai es varētu pārbaudīt pareizu darbību pirms sākotnējo mezglu dzēšanas. (Pēdējās trīs cilpas faktiski var apvienot.)

#

v = iface.layerTreeView () # v.collapseAllNodes () mezgli = v.selectedNodes () vecāks = mezgli [0] .parent () grupas = {} n mezglos: atslēga = n.nosaukums () [: 1] ja nav atslēga grupās: grupas [atslēga] = [] grupas [atslēga]. pievienot (n) jaunas_grupas = {} atslēgai grupās: grp_nosaukums = atslēga + '00 'grp = vecāks.addGroup (grp_nosaukums) jaunas_grupas [atslēga] = grp atslēgai grupās: new_group = new_groups [atslēga] n grupās [atslēga]: clone = n.clone () new_group.addChildNode (klons) atslēgai grupās: n grupās [atslēga]: parent.removeChildNode ( n)

Skatīties video: QGIS 3 # 4. Add online maps to map.