Question interessante! Je ne connais pas d'autre moyen de réaliser ce que vous voulez, mais d'utiliser PyQGIS.
Lisez le code ci-dessous. Il a quelques textes en elle: 'lines'
, 'length'
, 'startX'
, 'startY'
, 'endX'
, 'endY'
. Vous pouvez ajuster ces noms dans le script pour qu'il fonctionne sur vos données. Le premier est votre nom de calque, tandis que le reste correspond aux noms de champ. Je suppose que votre couche de lignes contient ces champs (après tout, vous voulez que les valeurs y soient écrites).
Une fois que vous avez ajusté le nom de votre couche et les noms des champs que vous souhaitez mettre à jour automatiquement, copiez et collez le script dans la console QGIS Python.
Si tout se passe bien, vous devriez pouvoir voir que les valeurs des champs sont automatiquement mises à jour dans deux scénarios: 1) lorsque de nouvelles entités sont ajoutées et 2) lorsque des géométries sont modifiées.
# 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 )
Voilà comment cela fonctionne:
Si vous rencontrez des problèmes lors de l'exécution du script, ajoutez un commentaire sous cette réponse.
Il peut être utile que cette fonctionnalité soit déjà disponible lorsque vous ouvrez votre projet QGIS. Si c'est le cas, dites-moi, je pourrais poster des instructions pour le faire.
ÉDITER:
Pour que cette fonctionnalité soit disponible à chaque fois que vous ouvrez votre projet QGIS (c'est-à-dire un .qgs
fichier contenant, entre autres, votre couche de ligne), vous devez suivre ces étapes:
Allez dans QGIS->Project->Project Properties->Macros
, cochez l' Python macros
option et remplacez le code entier par celui-ci (ajustez les valeurs en indiquant les noms de vos calques et champs):
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
Assurez-vous d' activer les macros sur votre projet, de cette façon: Settings->Options->General->Enable macros: Always
.
Enregistrez votre projet QGIS.
Désormais, chaque fois que vous ouvrez le .qgs
fichier que vous venez d'enregistrer, les attributs de votre couche de ligne sont automatiquement mis à jour lorsque vous ajoutez une nouvelle entité ou modifiez une géométrie (c'est-à-dire, plus besoin de copier quoi que ce soit dans la console QGIS Python).
2e EDIT:
Je viens de publier un plugin appelé AutoFields pour aider les gens à résoudre ce genre de problèmes. J'ai même fait une vidéo montrant comment résoudre votre problème, vous pouvez le regarder sur:
https://vimeo.com/germap/autofields-geometric-properties
Documentation AutoFields: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis