Dapatkan grafik ganda dari QGIS?

8

Saya memiliki file .shp, dan saya perlu mendapatkan grafik ganda dari file ini (artinya, setiap poligon centroid harus menjadi simpul, dan dua simpul dihubungkan jika poligon yang terkait berdekatan).

Saya berhasil mendapatkan centroid dari poligon file saya.

Bagaimana saya bisa menambahkan garis antara simpul yang memang harus dihubungkan?

Alexandre
sumber
Apakah Anda mencari alat di luar kotak di QGIS atau skrip?
whyzar
Pada titik ini, setiap solusi adalah solusi yang baik untuk saya.
Alexandre
Saya benar-benar dapat memahami bahwa, alat di luar kotak di QGIS mungkin tidak tersedia. Jika Anda menginginkan skrip, Anda harus setidaknya menunjukkan upaya membuat skrip yang dapat dibantu.
Whyzar
Apa bentuk garis yang Anda inginkan? Sebagai seperangkat fitur garis dengan sedikit tautan kembali ke poligon asli?
Spacedman

Jawaban:

12

Anda dapat menggunakan hanya Python (versi 2.7.x dan 3.x) tanpa QGIS:

masukkan deskripsi gambar di sini

1) Dengan Fiona , rupawan dan 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}})

masukkan deskripsi gambar di sini

2) dengan GeoPandas , rupawan dan 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) Saya kira Anda dapat melakukan hal yang sama dengan PyQgis dan itertools (Python 2.7 untuk versi 2.x dan 3.x untuk versi 3.x)

gen
sumber
Kode pertama berfungsi dengan baik! Saya mungkin hanya menambahkan bahwa itu harus "sebagai e:" bukan "sebagai e ::", dan bahwa dalam kasus saya (saya tidak ingin tepi antara poligon hanya berbagi satu titik) saya menambahkan kondisi "(poly1.intersection (poly2)). geom_type! = "Point" "ke loop if.
Alexandre