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.
# Initialize required variables
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
lengthField = myLayer.fieldNameIndex( 'length' )
startXField = myLayer.fieldNameIndex( 'startX' )
startYField = myLayer.fieldNameIndex( 'startY' )
endXField = myLayer.fieldNameIndex( 'endX' )
endYField = myLayer.fieldNameIndex( 'endY' )
# Slot, updates field values
def updateFeatureAttrs( fId, geom=None ):
f = myLayer.getFeatures( QgsFeatureRequest( fId ) ).next()
if not geom:
geom = f.geometry()
myLayer.changeAttributeValue( fId, lengthField, geom.length() )
myLayer.changeAttributeValue( fId, startXField, geom.vertexAt( 0 )[0] )
myLayer.changeAttributeValue( fId, startYField, geom.vertexAt( 0 )[1] )
myLayer.changeAttributeValue( fId, endXField, geom.asPolyline()[-1][0] )
myLayer.changeAttributeValue( fId, endYField, geom.asPolyline()[-1][1] )
# Update feature attributes when new features are added or geometry changes
myLayer.featureAdded.connect( updateFeatureAttrs )
myLayer.geometryChanged.connect( updateFeatureAttrs )
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 die Python macros
Option und ersetzen Sie den gesamten Code durch diesen (passen Sie die Werte an, die Ihre Ebenen- und Feldnamen angeben):
from qgis.core import QgsMapLayerRegistry, QgsFeatureRequest
def openProject():
# Initialize required variables
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
# Update feature attributes when new features are added or geometry changes
myLayer.featureAdded.connect( updateFeatureAttrs )
myLayer.geometryChanged.connect( updateFeatureAttrs )
# Slot, updates field values
def updateFeatureAttrs( fId, geom=None ):
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'lines' )[0]
lengthField = myLayer.fieldNameIndex( 'length' )
startXField = myLayer.fieldNameIndex( 'startX' )
startYField = myLayer.fieldNameIndex( 'startY' )
endXField = myLayer.fieldNameIndex( 'endX' )
endYField = myLayer.fieldNameIndex( 'endY' )
f = myLayer.getFeatures( QgsFeatureRequest( fId ) ).next()
if not geom:
geom = f.geometry()
myLayer.changeAttributeValue( fId, lengthField, geom.length() )
myLayer.changeAttributeValue( fId, startXField, geom.vertexAt( 0 )[0] )
myLayer.changeAttributeValue( fId, startYField, geom.vertexAt( 0 )[1] )
myLayer.changeAttributeValue( fId, endXField, geom.asPolyline()[-1][0] )
myLayer.changeAttributeValue( fId, endYField, geom.asPolyline()[-1][1] )
def saveProject():
pass
def closeProject():
pass
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