Obtenir un double graphique de QGIS?

8

J'ai un fichier .shp, et j'ai besoin d'obtenir le double graphique de ce fichier (c'est-à-dire que chaque polygone centroïde devrait devenir un sommet, et deux sommets sont liés si leurs polygones associés sont adjacents).

J'ai réussi à obtenir les centroïdes des polygones de mon fichier.

Comment puis-je ajouter des lignes entre les sommets qui devraient en effet être connectés?

Alexandre
la source
Vous recherchez un outil prêt à l'emploi dans QGIS ou un script?
whyzar
À ce stade, chaque solution est une bonne solution pour moi.
Alexandre
Je peux totalement comprendre que, cependant, un outil prêt à l'emploi dans QGIS peut ne pas être disponible. Si vous voulez un script, vous devrez au moins montrer une tentative de création d'un script qui peut être aidé.
whyzar
Quelle forme voulez-vous des lignes? Comme un ensemble d'entités linéaires avec peu de lien vers les polygones d'origine?
Spacedman

Réponses:

12

Vous pouvez utiliser Python uniquement (versions 2.7.x et 3.x) sans QGIS:

entrez la description de l'image ici

1) Avec Fiona , bien fait et 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}})

entrez la description de l'image ici

2) avec GeoPandas , galbées et 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) Je suppose que vous pouvez faire la même chose avec PyQgis et itertools (Python 2.7 pour les versions 2.x et 3.x pour les versions 3.x)

gène
la source
Le premier code fonctionne bien! Je pourrais juste ajouter que ce devrait être "comme e:" au lieu de "comme e ::", et que dans mon cas (je ne voulais pas que les arêtes entre les polygones ne partagent qu'un seul point) j'ai ajouté la condition "(poly1.intersection (poly2)). geom_type! = "Point" "vers la boucle if.
Alexandre