¿Obtener un gráfico dual de QGIS?

8

Tengo un archivo .shp y necesito obtener el gráfico dual de este archivo (es decir, cada centroide de polígono debe convertirse en un vértice y dos vértices están vinculados si sus polígonos asociados son adyacentes).

Logré obtener los centroides de los polígonos de mi archivo.

¿Cómo puedo agregar líneas entre los vértices que de hecho deberían estar conectados?

Alexandre
fuente
¿Está buscando una herramienta lista para usar en QGIS o un script?
whyzar
En este punto, cada solución es una buena solución para mí.
Alexandre
Sin embargo, puedo entender totalmente que una herramienta lista para usar en QGIS puede no estar disponible. Si desea una secuencia de comandos, deberá, como mínimo, mostrar un intento de crear una secuencia de comandos con la que pueda ayudar.
whyzar
¿De qué forma quieres las líneas? ¿Como un conjunto de características de línea con un pequeño enlace a los polígonos originales?
Spacedman el

Respuestas:

12

Solo puede usar Python (versiones 2.7.xy 3.x) sin QGIS:

ingrese la descripción de la imagen aquí

1) Con Fiona , bien proporcionado e itertools

import fiona
from shapely.geometry import MuliPolygon, LineString, mapping
Multi = MultiPolygon([shape(poly['geometry']) for poly in fiona.open("polygons.shp")])
# creation of the dual graph shapefile
import itertools
# schema of the dual graph shapefile
schema = {'geometry': 'LineString','properties': {'test': 'int'}}
with fiona.open('dual_graph.shp','w','ESRI Shapefile', schema) as e:
   for poly1,poly2 in  itertools.combinations(Multi, 2):
       if poly1.touches(poly2):
           e.write({'geometry':mapping(LineString([poly1.centroid, poly2.centroid])), 'properties':{'test':1}})

ingrese la descripción de la imagen aquí

2) con GeoPandas , bien formados e itertools

import geopandas as gpd 
polygon = gpd.GeoDataFrame.from_file("polygons.shp")
geoms = polygon['geometry'].tolist()
dual = gpd.GeoDataFrame(gpd.GeoSeries([LineString([poly1.centroid, poly2.centroid]) for poly1,poly2 in  itertools.combinations(geoms, 2) if poly1.touches(poly2)]),columns=['geometry'])
dual.to_file("dual_graph2.shp")

3) Supongo que puede hacer lo mismo con PyQgis e itertools (Python 2.7 para versiones 2.xy 3.x para versiones 3.x)

gene
fuente
¡El primer código funciona bien! Podría agregar que debería ser "como e:" en lugar de "como e ::", y que en mi caso (no quería que los bordes entre los polígonos compartieran solo un punto) agregué la condición "(poly1.intersection (poly2)). geom_type! = "Punto" "al bucle if.
Alexandre