Calcular longitudes de línea con Python en QGIS

Respuestas:

15

De los Documentos QGIS: Manejo de Geometría , puede usar el siguiente código para obtener la longitud de cualquier línea seleccionada:

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

¡Espero que esto ayude!

José
fuente
1
Vencido por segundos ... :-)
Alexandre Neto
@AlexandreNeto - ¡Jaja lo siento! Fue pura coincidencia porque también estaba usando este código exacto para mis capas hace solo unos momentos :)
Joseph
@gustavgans - Muy bienvenido amigo :)
Joseph
@Joseph, ¿cómo puedo ajustarlo para que lo calcule para todos los atributos en todas las capas de un proyecto en lugar de solo los seleccionados? He experimentado un poco, pero mi código no está haciendo el truco: layer = layer en QgsMapLayerRegistry.instance (). MapLayers (). Values ​​() features = layer.allFeatures () para f en las características: geom = f.geometry ( ) imprimir "Longitud:", geom.length ()
Hannes Ledegen
1
@HannesLedegen - ¡Estás cerca! Intenta for layer in QgsMapLayerRegistry.instance().mapLayers().values(): features = layer.getFeatures() for f in features:...
Joseph
2

Gran código, sin embargo, esto solo funciona para la capa seleccionada y solo la imprime. Con algo de ayuda de otras publicaciones y Joseph lo convertí en un código que agrega un atributo a todas las capas en su proyecto con la longitud.

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
fuente