miércoles, 8 de febrero de 2017

Obtener promedios ponderados por área usando PyQGIS

En la situación que se tiene en la imagen siguiente se desea obtener el promedio ponderado por área del campo 'val', perteneciente al vectorial tipo polígono, cuando se intersecta con el buffer del vectorial tipo línea.




El código desarrollado, empleando clases de PyQGIS, se encuentra a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
registry = QgsMapLayerRegistry.instance()

line = registry.mapLayersByName('line_get_average')
buffer = registry.mapLayersByName('buffer_get_average')
polygon = registry.mapLayersByName('polygon_get_average')

feats_polygon = [ feat for feat in polygon[0].getFeatures() ]

feat_buffer = buffer[0].getFeatures().next()

area_buffer = feat_buffer.geometry().area()

weighting_average = 0 

for feat in feats_polygon:
    if feat.geometry().intersects(feat_buffer.geometry()):
        area_int_buff = feat.geometry().intersection(feat_buffer.geometry()).area()
        weight_factor = area_int_buff/area_buffer
        print weight_factor, feat.attribute('val')
        weighting_average += weight_factor*feat.attribute('val')

print "weighting_average: {:.2f}".format(weighting_average)

Después de ejecutado en la Python Console de QGIS se obtiene:


el cual corresponde al resultado esperado. La capa de color rosa (una de las tres posibles intersecciones) ha sido visualizada con el plugin QuickWKT de QGIS para corroborar la ejecución correcta del código.

No hay comentarios: