Je travaille d'une manière à faire des projets hydrologiques en utilisant QGIS et une feuille de calcul Excel que j'ai. Pour ce faire, je souhaite extraire des informations sur les lignes, incluses dans une couche vectorielle, qui représente une section de tuyau.
Les informations que je dois extraire sont:
- Numéro d'identification
- Longueur
- Coordonnées de début et de fin X, Y
J'ai trouvé un moyen de capturer ce champ en utilisant la "$ longueur" et un autre algorithme pour les coordonnées X et Y, mais pour cela, je dois ouvrir la table Attributs, mettre les expressions dans chaque colonne d'attribut et cliquer pour mettre à jour les champs.
Existe-t-il un moyen lorsque je trace une ligne ces champs sont remplis automatiquement? Autrement dit, je trace / modifie une ligne (début de modification ou nœud final) et lorsque j'ouvre la table des attributs, les champs de longueur et les coordonnées X, Y sont remplis et mis à jour.
la source
Réponses:
Si vous n'avez besoin que de ces champs dans QGIS , vous pouvez utiliser des champs virtuels. Celles-ci permettent d'utiliser une expression (comme
$length
) qui dépend d'autres valeurs ou de la géométrie.Ouvrez la calculatrice de champ, ajoutez un nouveau champ avec la longueur du nom, cochez la case "Champ virtuel" et entrez
$length
comme expression (ou autre chose pour les autres champs).Ceux-ci ne seront cependant pas enregistrés dans le fichier Excel.
Si vous souhaitez garder un fichier Excel synchronisé avec un fichier shp pour la géométrie et inclure des champs dérivés dans le fichier excel, il existe un plugin appelé ShpSync qui connaît ce concept et met à jour les champs automatiquement lorsque les fonctionnalités sont modifiées, ajoutées ou supprimées.
la source
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.
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):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
la source
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'Tramo' )[0]
Si vous êtes vraiment intéressé par mon futur plugin, veuillez m'envoyer vos suggestions, je vous en serais reconnaissant. Vous pouvez me contacter à GeoTux .Pour QGIS 3, allez dans
Layers Properties
=>Attributes Form
=> choisissez votre champ avec des valeurs de géométrie (dans l'exemple,area
) => tapez$area
dans laDefaults value
case et cochezApply default value on update
. Cela pourrait aussi être utile:$perimeter
,$y
,$x
,$id
la source
Je voudrais mettre les données dans une base de données (PostGIS) et extraire les données vers QGIS avec une vue (probablement matérialisée).
la source