Obtendo gráfico duplo do QGIS?

8

Eu tenho um arquivo .shp e preciso obter o gráfico duplo desse arquivo (ou seja, cada centróide de polígono deve se tornar um vértice e dois vértices são vinculados se os polígonos associados forem adjacentes).

Consegui obter os centróides dos polígonos do meu arquivo.

Como posso adicionar linhas entre os vértices que realmente devem ser conectados?

Alexandre
fonte
Você está procurando uma ferramenta pronta para usar no QGIS ou um script?
whyzar
Neste ponto, toda solução é uma boa solução para mim.
Alexandre
Entendo perfeitamente que, no entanto, uma ferramenta pronta para uso no QGIS pode não estar disponível. Se você deseja um script, terá que, no mínimo, mostrar uma tentativa de criar um script que possa ser ajudado.
whyzar
De que forma você quer as linhas? Como um conjunto de recursos de linha com pouco link para os polígonos originais?
precisa saber é o seguinte

Respostas:

12

Você pode usar apenas Python (versões 2.7.xe 3.x) sem o QGIS:

insira a descrição da imagem aqui

1) Com Fiona , bem torneadas e iterais

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}})

insira a descrição da imagem aqui

2) com GeoPandas , bem torneados 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) Suponho que você possa fazer o mesmo com PyQgis e itertools (Python 2.7 para versões 2.x e 3.x para versões 3.x)

gene
fonte
O primeiro código funciona bem! Posso apenas acrescentar que deveria ser "como e:" em vez de "como e ::", e que, no meu caso (não queria bordas entre polígonos que compartilham apenas um ponto), adicionei a condição "(poly1.intersection (poly2)). geom_type! = "Aponte" "para o loop if.
Alexandre