Calculer des longueurs de ligne avec Python dans QGIS

9

J'ai trouvé cet article qui décrit la «méthode de l'interface graphique QGIS» pour calculer les longueurs de ligne. http://www.qgistutorials.com/en/docs/calculating_line_lengths.html

Comment puis-je calculer la longueur d'une ligne (entité) dans une couche vectorielle avec du code Python?

À titre d'exemple, je veux connaître la longueur de la ligne jaune.

entrez la description de l'image ici

gustavgans
la source

Réponses:

15

À partir des documents QGIS: gestion de la géométrie , vous pouvez utiliser le code suivant pour obtenir la longueur de toute ligne sélectionnée:

layer = qgis.utils.iface.activeLayer()
features = layer.selectedFeatures()
for f in features:
    geom = f.geometry()
    print "Length:", geom.length()

J'espère que cela t'aides!

Joseph
la source
1
Battu par secondes ... :-)
Alexandre Neto
@AlexandreNeto - Haha désolé! Était-ce une pure coïncidence parce que j'utilisais également ce code exact pour mes couches il y a quelques instants :)
Joseph
@gustavgans - Copain le plus bienvenu :)
Joseph
@Joseph, comment puis-je le modifier pour qu'il le calcule pour tous les attributs de tous les calques d'un projet plutôt que seulement ceux sélectionnés? J'ai un peu expérimenté mais mon code ne fait pas l'affaire: couche = couche dans QgsMapLayerRegistry.instance (). MapLayers (). Values ​​() features = layer.allFeatures () for f in features: geom = f.geometry ( ) imprimer "Longueur:", geom.length ()
Hannes Ledegen
1
@HannesLedegen - Vous êtes proche! Essayez for layer in QgsMapLayerRegistry.instance().mapLayers().values(): features = layer.getFeatures() for f in features:...
Joseph
2

Excellent code, mais cela ne fonctionne que pour le calque sélectionné et l'imprime uniquement. Avec l'aide d'autres publications et de Joseph, je l'ai transformé en un code qui ajoute un attribut à toutes les couches de votre projet avec la longueur.

from PyQt4.QtCore import QVariant
for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    features = layer.getFeatures()
    for f in features:
        geom = f.geometry()
        leng = geom.length()
        res = layer.dataProvider().addAttributes([QgsField("Length", QVariant.Int)])
        layer.updateFields()
        fieldIndex = layer.dataProvider().fieldNameIndex( "Length" )
        attrFeatMap = {}
        attrMap = { fieldIndex : leng }
        for feature in layer.getFeatures():
            attrFeatMap[ feature.id() ] = attrMap
        layer.dataProvider().changeAttributeValues( attrFeatMap )
Hannes Ledegen
la source