domingo, 13 de agosto de 2017

Porcentaje de intersección de areas de polígonos mediante fiona y shapely con Python3 en Debian

Continuando con la ejecución de código compatible con Python3 en SIGs se va a considerar el porcentaje de intersección de áreas de polígonos empleando los módulos python fiona y shapely instalados mediante pip3. En este caso, la lógica del algoritmo sigue una sintaxis muy similar a la ejecutada en un sistema con PyQGIS.

La compatibilidad con Python 2.7.x se logra encerrando entre paréntesis el argumento de los 'print' correspondientes. No obstante, la primera ejecución arrojó el error siguiente:

1
fiona._err.CPLE_AppDefinedError: b'Recode from System to UTF-8 failed with the error: "Invalid argument".'

Investigando en Internet encontré que ello se debía a la presencia de archivos *.cpg (polygon8.shp lo presenta y puede ser eliminado sin problema porque sólo contiene la palabra System). Una vez eliminado dicho archivo la ejecución transcurrió sin errores. El código completo se presenta a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import fiona
from shapely.geometry import shape

path1 = u'/home/zeito/pyqgis_data/polygon1.shp'
path2 = u'/home/zeito/pyqgis_data/polygon8.shp'

polygon1 = fiona.open(path1)
polygon8 = fiona.open(path2)

geom_p1 = [ shape(feat["geometry"]) for feat in polygon1 ]
geom_p8 = [ shape(feat["geometry"]) for feat in polygon8 ]

for i, g1 in enumerate(geom_p1):
    for j, g8 in enumerate(geom_p8):
        if g1.intersects(g8):
            print (i, j, (g1.intersection(g8).area/g1.area)*100)

La ejecución en consola de bash produce el resultado que se presenta en la imagen a continuación:


En primer término se presenta el índice del rasgo único de polygon1.shp, el segundo valor corresponde al índice de los rasgos de polygon8.shp que producen intersección y, finalmente, se tiene el porcentaje de intersección con relación al área de polygon1.shp.

La visualización en QGIS de los shapefiles considerados anteriormente es la siguiente:


No hay comentarios: