Distancia entre el centroide y el punto más lejano de un polígono con PyQGIS

Encontrar la distancia entre el centroide y el punto más lejano de un polígono no es una tarea difícil con PyQGIS; aún si éste está constituido por numerosos features y el cálculo tiene que realizarse para todos. Para ello, se guardan sendas listas con los centroides y los polígonos y, usando un valor de prueba para la distancia máxima que inicialmente es cero, se determinan todas ellas para cada centroide y los puntos respectivos del polígono; seleccionando la mayor, el punto respectivo y su índice. Estos puntos, conjuntamente con el centroide, se usan para configurar una lista de QgsPoint con la sintaxis propia de polilíneas para ser conformadas como una memory layer.

El código usado fue el siguiente:

from math import sqrt

layer = iface.activeLayer()

feats = [ feat for feat in layer.getFeatures() ]

n = len(feats)

centroids = [ feat.geometry().centroid().asPoint() for feat in feats ]
polygons = [ feat.geometry().asPolygon()[0] for feat in feats ]

lengths = []

for i, pol in enumerate(polygons):
    max_dist = 0
    idx_j = 0
    for j, point in enumerate(pol):
        dist = sqrt(centroids[i].sqrDist(point))
        if dist > max_dist:
            max_dist = dist
            idx_j = j
    print i, idx_j, max_dist
    lengths.append([centroids[i], pol[idx_j]])

crs = layer.crs()
epsg = crs.postgisSrid()

uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'max_distance',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(n) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPolyline(lengths[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Al ser ejecutado en la Python Console de QGIS con el shapefile de la imagen siguiente, se obtuvieron los rasgos correspondientes a las distancias máximas como polilíneas.

maximum_distance2

A continuación se presenta una imagen de lo impreso en la Python Console de QGIS: el índice del rasgo, el índice del punto al cual le corresponde la distancia más alejada desde su centroide y, finalmente, la distancia máxima.

maximum_distance3

Esta entrada fue publicada en PyQGIS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s