Mehr

Kopieren mehrerer Auswahlen (nach Attributen) in ein Ausgabe-Shapefile mit QGIS Python-Skripting?

Kopieren mehrerer Auswahlen (nach Attributen) in ein Ausgabe-Shapefile mit QGIS Python-Skripting?


EINLEITUNG

Der folgende Code trifft eine Auswahl und speichert dann jedes Mal durch die "FINAL ITERATION LOOP" in einer 'Output'-Datei (Shapefile?). Jede 'Output'-Datei enthält alle ausgewählten Bürgeradressenpunkte (aus dem "Input"-Shapefile) auf einer der dem Mitarbeiter Joe Blow zugewiesenen Straßen (die Straßen von Joe Blow stammen aus der CSV-Datei "FSS_Streets_Test_Sample" und werden an den "joeblow" angehängt) aufführen).


FRAGE

Aber was ist, wenn ich nur ein einzelnes Ausgabe-Shapefile (oder eine Ebene) haben möchte? Einer mit ALLEN Bürgeradresspunkten auf ALLEN Straßen in der 'Joeblow'-Liste?

Vielleicht besteht der Trick darin, als letzten Parameter "selectbyattribute" mehrere Straßennamen anzugeben? Ist das möglich? Wenn nicht, wie treffe ich mehrere Auswahlen und verkette sie im Wesentlichen nacheinander, bis alle (z) Bürgeradressen auf allen Straßen, die zu "Joe Blow" gehören (in der 'joeblow'-Liste) markiert sind, bevor sie dann gespeichert werden in ein (einzelnes) neues Shapefile?

  • Tipp - der Großteil des Skripts legt nur den Grundstein, wie Gebäudelisten (z. B. eine eindeutige Liste aller Straßen ("Straßen") und Straßen, die "Joe Blow" ("Joeblow") zugewiesen sind. Vielleicht bevorzugen Sie zum Ende zu springen, wo die beiden "qgis"-Tools ausgeführt werden.

CODE

aus PyQt4.QtCore importieren * aus qgis.core importieren * aus qgis.utils importieren iface-Importverarbeitung ##Input=vector ##Input_Field=field Input # .CSV der den Mitarbeitern zugewiesenen Straßen "FSS_Streets_Test_Sample" der Variablen 'vl' zuordnen vl = QgsMapLayerRegistry.instance().mapLayersByName('FSS_Streets_Test_Sample')[0] # Setze vl als "aktiven Layer" iface.setActiveLayer(vl) # Instanziiere 'streets' list street = [] # Get List of Unique Streets from ' STRNAME'-Spalte in 'vl' für f in vl.getFeatures(): wenn f['STRNAME'] nicht in Straßen: Straßen.append(f['STRNAME']) # Liste der Straßen instanziieren, die "Joe Blow" zugewiesen sind joeblow = [] # fülle diese Liste mit Straßen, die zu "Joe Blow" gehören, wie in 'vl' für f in vl.getFeatures() angegeben: if f['FSS'] == 'Joe Blow': joeblow.append(f[ 'STRNAME']) #Anzahl der Straßen zählen, die zu "Joe Blow" gehören z = len(joeblow) # FINAL ITERATION LOOP: Durchlaufen der Straßen, die zu "Joe Blow" gehören, jedes Mal, wenn aus dem Shapefile "Input" alle Felder ausgewählt werden ( bürgerliche Adressen) die Er ist das "Input_Field" (STRNAME), gleich ("0"), bestimmte Straße(n), die zu 'joeblow' gehören (Straße(n) innerhalb der 'joeblow'-Liste) für k im Bereich(0,z): Verarbeitung. runalg('qgis:selectbyattribute', Input, Input_Field, 0, joeblow[k]) processing.runalg('qgis:saveselectedfeatures', Input, 'Output') # Skript beenden

Anmerkungen:

Eingaben an die GUI, wenn das Skript ausgeführt wird…

Die 'Input'-Datei ist ein Shapefile von städtischen Adresspunkten (natürlich entlang von Straßen).

Das 'Input_Field' ist eine Spalte mit dem Namen "STRNAME" im 'Input'-Shapefile

Die CSV-Datei - "FSS_Streets_Test_Sample" befindet sich im Ebenen-Inhaltsverzeichnis meines Kartenprojekts. Es besteht im Wesentlichen aus 2 Spalten: Mitarbeitername ("FSS") und Straßenname (auch "STRNAME" genannt).


Übrigens, wenn das Skript die Ausführung beendet…

a) Bürgerliche Adressen, die sich auf die letzte Straße (aber nicht alle Straßen) in der "Joeblow"-Liste beziehen, werden jetzt auf der Shapefile-Ebene "Input" hervorgehoben.

b) Die GUI verschwindet ohne Fehlermeldungen im „Log“-Tab der GUI auszulösen (obwohl es in den verschiedenen Tabs des „Log Messages“-Fensters Meldungen gibt.

c) Aber… Ich sehe keine 'Ausgabe'-Dateien (Temp-Layer oder Shapefile), die vom Werkzeug "qgis.saveselectedfeatures" generiert wurden.


Die Lösung, die ich letztendlich verwendet habe, bestand darin, "selectbyattribute" durch "selectbyexpression" zu ersetzen und in einer Schleife zu platzieren, wobei ich jedes Mal durch meine Straßenliste iteriere und meinen "Ausdruck" entsprechend anpasse.

Processing.runalg('qgis:selectbyexpression', Eingabe, Ausdruck, 1)

Das Festlegen von "1" als drittes Attribut fügt der aktuellen Auswahl hinzu.


Schau das Video: TOP 10 Outlook Tips EVERY Professional NEEDS To Know in 2021