Lấy đồ thị kép từ QGIS?


8

Tôi có một tệp .shp và tôi cần lấy biểu đồ kép từ tệp này (nghĩa là, mỗi tâm đa giác sẽ trở thành một đỉnh và hai đỉnh được liên kết nếu đa giác liên kết của chúng liền kề nhau).

Tôi quản lý để có được các nhân từ các đa giác của tập tin của tôi.

Làm thế nào tôi có thể thêm các đường giữa các đỉnh thực sự nên được kết nối?


Bạn đang tìm kiếm một công cụ vượt trội trong QGIS hoặc một tập lệnh?
whyzar

Tại thời điểm này, mọi giải pháp là một giải pháp tốt cho tôi.
Alexandre

Tôi hoàn toàn có thể hiểu rằng tuy nhiên, một công cụ vượt trội trong QGIS có thể không khả dụng. Nếu bạn muốn có một kịch bản, ít nhất bạn sẽ phải thể hiện một nỗ lực tạo ra một kịch bản có thể được trợ giúp.
whyzar

Hình thức nào bạn muốn các dòng? Là một tập hợp các tính năng dòng với ít liên kết trở lại đa giác ban đầu?
Spacesman

Câu trả lời:


12

Bạn chỉ có thể sử dụng Python (phiên bản 2.7.x và 3.x) mà không cần QGIS:

nhập mô tả hình ảnh ở đây

1) Với Fiona , tạo hìnhitertools

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

nhập mô tả hình ảnh ở đây

2) với GeoPandas , tạo hìnhitertools

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) Tôi cho rằng bạn có thể làm điều tương tự với PyQgis và itertools (Python 2.7 cho phiên bản 2.x và 3.x cho phiên bản 3.x)


Mã đầu tiên hoạt động tốt! Tôi chỉ có thể thêm rằng nó phải là "as e:" thay vì "as e ::" và trong trường hợp của tôi (tôi không muốn các cạnh giữa đa giác chỉ chia sẻ một điểm) Tôi đã thêm điều kiện "(poly1.intersection (poly2)). geom_type! = "Điểm" "vào vòng lặp if.
Alexandre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.