Berechnen Sie die Zeilenlängen mit Python in QGIS

Antworten:

15

In den QGIS-Dokumenten: Geometriebehandlung können Sie den folgenden Code verwenden, um die Länge aller ausgewählten Zeilen abzurufen:

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

Hoffe das hilft!

Joseph
quelle
1
Von Sekunden geschlagen ... :-)
Alexandre Neto
@AlexandreNeto - Haha sorry! War ein reiner Zufall, weil ich diesen exakten Code erst vor wenigen Augenblicken für meine Ebenen verwendet habe :)
Joseph
@gustavgans - Herzlich willkommen Kumpel :)
Joseph
@Joseph, wie kann ich es so optimieren, dass es für alle Attribute in allen Ebenen eines Projekts berechnet wird und nicht nur für die ausgewählten? Ich habe ein wenig experimentiert, aber mein Code macht nicht den Trick: layer = layer in QgsMapLayerRegistry.instance (). MapLayers (). Values ​​() features = layer.allFeatures () für f in features: geom = f.geometry ( ) print "Länge:", geom.length ()
Hannes Ledegen
1
@HannesLedegen - Du bist nah dran! Versuchen Sie for layer in QgsMapLayerRegistry.instance().mapLayers().values(): features = layer.getFeatures() for f in features:...
Joseph
2

Großartiger Code, dies funktioniert jedoch nur für die ausgewählte Ebene und druckt ihn nur. Mit etwas Hilfe von anderen Posts und Joseph habe ich daraus einen Code gemacht, der allen Ebenen in Ihrem Projekt ein Attribut mit der Länge hinzufügt.

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
quelle