Ich arbeite auf eine Weise, um hydrologische Projekte mit QGIS und einem Excel-Arbeitsblatt zu erstellen, das ich habe. Zu diesem Zweck möchte ich einige Informationen zu den Linien extrahieren, die in einer Vektorebene enthalten sind, die einen Rohrabschnitt darstellt.
Die Informationen, die ich extrahieren muss, sind:
- ID-Nummer
- Länge
- X-, Y-Start- und Endkoordinaten
Ich habe einen Weg gefunden, dieses Feld mit der "$ length" und einem anderen Algorithmus für die X- und Y-Koordinaten zu erfassen, aber dafür muss ich die Attributtabelle öffnen, die Ausdrücke in jede Attributspalte einfügen und klicken, um die Felder zu aktualisieren.
Gibt es eine Möglichkeit, beim Zeichnen einer Linie diese Felder automatisch auszufüllen? Das heißt, ich zeichne / bearbeite eine Linie (beginne mit der Bearbeitung oder beende den Knoten) und wenn ich die Attributtabelle öffne, werden die Längenfelder und Koordinaten X, Y gefüllt und aktualisiert.
quelle
Antworten:
Wenn Sie diese Felder nur in QGIS benötigen , können Sie virtuelle Felder verwenden. Diese ermöglichen die Verwendung eines Ausdrucks (wie
$length
), der von anderen Werten oder der Geometrie abhängt.Öffnen Sie den Feldrechner, fügen Sie ein neues Feld mit der Namenslänge hinzu, aktivieren Sie das Kontrollkästchen "Virtuelles Feld" und geben Sie es
$length
als Ausdruck (oder etwas anderes für die anderen Felder) ein.Diese werden jedoch nicht in der Excel-Datei gespeichert.
Wenn Sie eine Excel-Datei mit einer SHP-Datei für Geometrie synchron halten und abgeleitete Felder in die Excel-Datei aufnehmen möchten , gibt es ein Plugin namens ShpSync , das dieses Konzept kennt und Felder automatisch aktualisiert, wenn Features geändert, hinzugefügt oder gelöscht werden.
quelle
Interessante Frage! Mir ist keine andere Möglichkeit bekannt, das zu erreichen, was Sie wollen, als PyQGIS zu verwenden.
Lesen Sie den folgenden Code. Es hat einige Texte in ihm:
'lines'
,'length'
,'startX'
,'startY'
,'endX'
,'endY'
. Sie können diese Namen im Skript so anpassen, dass sie mit Ihren Daten funktionieren. Der erste ist Ihr Ebenenname, während der Rest Feldnamen entspricht. Ich gehe davon aus, dass Ihre Linienebene diese Felder enthält (schließlich möchten Sie, dass dort Werte geschrieben werden).Nachdem Sie Ihren Ebenennamen und die Namen der Felder angepasst haben, die automatisch aktualisiert werden sollen, kopieren Sie das Skript und fügen Sie es in die QGIS Python-Konsole ein.
Wenn alles gut geht, sollten Sie in zwei Szenarien sehen können, dass Feldwerte automatisch aktualisiert werden: 1) Wenn neue Features hinzugefügt werden und 2) Wenn Geometrien geändert werden.
So funktioniert es:
Wenn Sie beim Ausführen des Skripts Probleme haben, fügen Sie unter dieser Antwort einen Kommentar hinzu.
Es kann hilfreich sein, diese Funktion bereits beim Öffnen Ihres QGIS-Projekts verfügbar zu haben. Wenn das der Fall ist, sag mir, ich könnte Anweisungen dazu posten.
BEARBEITEN:
Damit diese Funktionalität jedes Mal verfügbar ist, wenn Sie Ihr QGIS-Projekt öffnen (dh eine
.qgs
Datei, die unter anderem Ihre Linienebene enthält), müssen Sie die folgenden Schritte ausführen:Gehen Sie zu
QGIS->Project->Project Properties->Macros
, aktivieren Sie diePython macros
Option und ersetzen Sie den gesamten Code durch diesen (passen Sie die Werte an, die Ihre Ebenen- und Feldnamen angeben):Stellen Sie sicher, dass Sie Makros in Ihrem Projekt folgendermaßen aktivieren :
Settings->Options->General->Enable macros: Always
.Speichern Sie Ihr QGIS-Projekt.
Jedes Mal, wenn Sie die
.qgs
gerade gespeicherte Datei öffnen , werden die Attribute Ihrer Linienebene automatisch aktualisiert, wenn Sie ein neues Feature hinzufügen oder eine Geometrie ändern (dh Sie müssen nichts mehr in die QGIS Python-Konsole kopieren).2. EDIT:
Ich habe gerade ein Plugin namens AutoFields veröffentlicht , um Menschen bei der Lösung dieser Art von Problemen zu helfen. Ich habe sogar ein Video gemacht, das zeigt, wie Sie Ihr Problem lösen können. Sie können es unter folgender Adresse ansehen:
https://vimeo.com/germap/autofields-geometric-properties
AutoFields-Dokumentation: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis
quelle
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'Tramo' )[0]
Wenn Sie wirklich an meinem zukünftigen Plugin interessiert sind, senden Sie mir bitte Ihre Vorschläge. Ich würde mich freuen . Sie können mich bei GeoTux kontaktieren .Für QGIS 3 gehen Sie zu
Layers Properties
=>Attributes Form
=> wählen Sie Ihr Feld mit Geometriewerten aus (im Beispielarea
) => geben Sie$area
dasDefaults value
Kontrollkästchen ein und aktivieren Sie esApply default value on update
. Dies könnte auch sein nützlich:$perimeter
,$y
,$x
,$id
quelle
Ich würde die Daten in eine Datenbank (PostGIS) stellen und die Daten mit einer (wahrscheinlich materialisierten) Ansicht in QGIS extrahieren.
quelle