9 votos

Cálculo de longitudes de líneas con PyQGIS

Encontré este artículo que describe la "forma de QGIS GUI" para calcular las longitudes de las líneas http://www.qgistutorials.com/en/docs/calculating_line_lengths.html

¿Cómo puedo calcular la longitud de una línea (característica) en una capa vectorial con código Python?

Por ejemplo, quiero saber la longitud de la línea amarilla.

enter image description here

17voto

Mue Puntos 2469

Desde el Documentos QGIS: Manejo de la geometría puede utilizar 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()

0 votos

@Joseph, ¿cómo puedo modificarlo para que lo calcule para todos los atritos de todas las capas de un proyecto en lugar de sólo los seleccionados? He experimentado un poco pero mi código no funciona: layer = layer in QgsMapLayerRegistry.instance().mapLayers().values() features = layer.allFeatures() for f in features: geom = f.geometry() print "Length:", geom.length()

1 votos

@HannesLedegen - ¡Estás cerca! Prueba con for layer in QgsMapLayerRegistry.instance().mapLayers().values(): features = layer.getFeatures() for f in features: ...

0 votos

@Joseph he aclarado un poco en mi respuesta de abajo para guardarlo en un atributo en lugar de mostrarlo. Siento que hay principalmente un problema de sangría todavía, pero debo decir que no soy tan goot con python.

3voto

Hannes Ledegen Puntos 21

Gran código, sin embargo, esto sólo funciona para la capa seleccionada y sólo la imprime. Con algo de ayuda de otros posts y de @Joseph lo convertí en un código que añade un atributo a todas las capas de tu 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)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X