Calcular comprimentos de linha com Python no QGIS

Respostas:

15

Nos Documentos QGIS: Tratamento de geometria , você pode usar o seguinte código para obter o comprimento de qualquer linha selecionada:

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

Espero que isto ajude!

Joseph
fonte
1
Beated por segundos ... :-)
Alexandre Neto
@AlexandreNeto - Haha sorry! Foi pura coincidência porque eu também estava usando este código exato para minhas camadas apenas momentos atrás :)
Joseph
@gustavgans - Mais de amigos bem-vindos :)
José
@ Joseph, como posso ajustá-lo para calculá-lo para todos os atributos em todas as camadas de um projeto, e não apenas os selecionados? Eu experimentei um pouco, mas meu código não está executando o truque: layer = layer em QgsMapLayerRegistry.instance (). MapLayers (). Values ​​() features = layer.allFeatures () for f in features: geom = f.geometry ( ) print "Length:", geom.length ()
Hannes Ledegen 5/17/17
1
@HannesLedegen - Você está perto! Tente for layer in QgsMapLayerRegistry.instance().mapLayers().values(): features = layer.getFeatures() for f in features:...
Joseph
2

Ótimo código, no entanto, isso funciona apenas para a camada selecionada e somente a imprime. Com alguma ajuda de outros posts e Joseph, eu o transformei em um código que adiciona um atributo a todas as camadas do seu projeto com o comprimento.

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
fonte