Vairāk

Slāņa aktivizēšana pēc nosaukuma PyQGIS

Slāņa aktivizēšana pēc nosaukuma PyQGIS


Es rakstu skriptu, kura darbībai nepieciešami dažādu slāņu atribūti, un es vēlētos uzzināt, kā izsaukt slāni, kas pašlaik nav aktīvs, un iegūt tā funkcijas.

Piemēram, man ir trīs slāņi ar nosaukumiem "Poles", "Lines" un "Loads", un man ir jāsaņem visas slāņu funkcijas arlayer.getFeatures ()un saglabājiet šīs funkcijas katra slāņa sarakstā. Tikai vienu slāni mēs parasti darām šādi:

Ja mans aktīvais slānis ir "Poļi", es rakstu:

slānis = iface.activeLayer () stabi = layer.getFeatures ()

Un tad es varu darīt jebko ar "stabiem", bet kā es varu to izdarīt ar citiem slāņiem, kas nav aktīvi? Ja es gribētu darīt to pašu ar slāni "Lines", man tas būtu jāaktivizē "manuāli", noklikšķinot uz tā un atkārtojot šo kodu.

Esmu mēģinājis izmantot šo metodi: iegūt PyQGIS slāni pēc nosaukuma?

Un šis: iegūt tādu slāni, kas nav aktīvs ar PyQGIS

Bet es vienmēr saņemu šo kļūdas ziņojumu, jo es neaktivizēju slāni, tikai izveidoju slāņu nosaukumu sarakstu.

Traceback (pēdējais zvans pēdējais): fails "", 1. rindiņa, iekš  AttributeError: objektam 'saraksts' nav atribūta 'getFeatures'

Kā es varu aktivizēt slāni pēc tā nosaukuma, lai iegūtu tajā esošās funkcijas?


TL; DR

Lai iegūtu visas slāņa funkcijas pēc slāņa nosaukuma, tas nav jāaktivizē. Vienkārši izmantojiet

nosaukums = 'apgabali' slānis = QgsProject.instance (). mapLayersByName (nosaukums) [0] stabi = layer.getFeatures () stabam polos: ja is_north (pole): print ('tas ir ziemeļpols')

Aktīvais slānis

Pirmkārt, jums nav jārūpējas par aktīvais slānis. The aktīvais slānis ir slānis, kas pašlaik ir izvēlēts slāņu kokā, un tāpēc tas ir piemērots divām lietām

  1. ļaujot lietotājam izvēlēties slāni, ar kuru darboties
  2. atlasot slāni koda ātrai pārbaudei no pitona konsoles

Otrais ir ērts, kad izstrādājat, pirmais ir tas, uz kura balstās visi kartes rīki: pašreiz izvēlētais slānis ( aktīvs viens) ir modificēts, atlasīts, izdzēsts ...

Metodes, kā piekļūt slāņiem

Tomēr šķiet, ka vēlaties piekļūt slāņiem, kas nav balstīti uz lietotāja ievadi, bet gan uz kaut ko citu.

Slāņu identificēšana

Visiem slāņiem ir

  • An id tam jābūt unikālam
  • A nosaukums tas nav obligāti (bet bieži) unikāls, un lietotājs to var mainīt
  • A atsauce (bieži dēvē arī par rādītājs bet pitonā abi termini ir savstarpēji aizvietojami), kas ir unikāls un stabils slāņa kalpošanas laikā lietojumprogrammas darbības laikā un ko var piešķirt mainīgajam (piemēram,vlayerir atsauce uz pašreiz aktīvo slāni jūsu piemērā).
  • Īpašības, piemēram, URI (tabulas nosaukums utt.)

Ja jums jau ir atsauce uz slāni (jo jūs to izveidojāt / pievienojāt spraudnī), vienkārši izmantojiet to.

Ja tā nav, padomājiet, kuru īpašumu vēlaties izmantot, lai piekļūtu slānim. Visticamāk kaut kas ir stabils (slāņa ID ir ļoti stabils visa projekta darbības laikā, bet vienmēr ir atšķirīgs dažādiem projektiem), nosaukums ir pielāgojams lietotājam, tabula var būt atkarīga no datu avota.

Piekļūšana slāņiem

Ir kartes slāņu reģistrs, kas ļauj piekļūt slāņiem. Tas pārvalda atsauces uz visiem slāņiem. Iepriekš to sauca par QgsMapLayerRegistry, taču tas vairs nav pieejams QGIS 3, tāpēc tā vietā var izmantot QgsProject.

register = QgsProject.instance ()

Ja jums ir slāņa ID, iet

layer = register.mapLayer (id)

Ja jums ir slāņa nosaukums

layer = register.mapLayersByName (name) [0] # Metode atgriež sarakstu, jo tas var būt neskaidrs, 0 atlasa pirmo saraksta ierakstu

Ja jums ir kas cits, jums ir jāraksta savs kods:

lyr reģistrā.mapLayers (). vērtības (): ja lyr.dataProvider (). dataSourceUri (). tabula () == 'mytable': slānis = lyr pārtraukums

Vai arī stenogramma, kas dara to pašu un liek justies hackerish, bet liks cilvēkiem, kuriem kods būs jāuztur vēlāk, atšifrēšanai būs vajadzīgs papildu laiks:

slānis = (l l reģistrā.mapLayers (). vērtības (), ja l.dataProvider (). dataSourceUri (). tabula () == 'mytable'). nākamais ()

Tas nav pilnībā nosaukts, bet jūs varat arī izmantot QgsMapCanvas objektiem. Nākamais kods:

mapcanvas = iface.mapCanvas () n = mapcanvas.layerCount () slāņi = [mapcanvas.layer (i) i diapazonā (n)] layer_names = [layer.name () slānim slāņos] # patiesi vektoru slāņu nosaukumi drukāt "layer_names =", layer_names poles = [pole pole slāņos [0] .getFeatures ()] #testējot tikai vienu funkciju, ja poles [0] .geometry (). type () == QGis.Point: print "Tas ir punktu slānis "līnijas = [līnija līnijai slāņos [1] .getFeatures ()] #testējot tikai vienu funkciju, ja līnijas [0] .geometry (). type () == QGis.Line: print" Tas ir līnijas slānis "

nākamajā attēlā tas tika izmantots kopā ar šiem vektoru slāņiem:

Kad kods tika palaists Python konsolē, rezultāts bija šāds:

layer_names = [u'random_points ', u'line'] Tas ir punktu slānis Tas ir līnijas slānis

Ja kartes leģendā apgriežat slāņu secību, tiek drukāts tikai šis saraksts:

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

Skatīties video: WFS einlesen in QGIS mit python pyQGIS