Tôi có một Shapefile với các tính năng chồng chéo. Có một cách dễ dàng để hợp nhất chúng với geopandas?
Tôi đã tìm thấy một cách với hình dạng, nhưng tôi muốn làm điều đó với geopandas trực tiếp.
Tôi có một Shapefile với các tính năng chồng chéo. Có một cách dễ dàng để hợp nhất chúng với geopandas?
Tôi đã tìm thấy một cách với hình dạng, nhưng tôi muốn làm điều đó với geopandas trực tiếp.
Câu trả lời:
GeoDataFrame
import geopandas as gpd
g1 = gpd.GeoDataFrame.from_file("poly_intersect.shp")
g1.shape
(4, 3)
1) Bạn có thể sử dụng mô-đun itertools
a) Nếu bạn muốn hợp nhất các giao điểm của đa giác chồng chéo
import itertools
geoms = g1['geometry'].tolist()
intersection_iter = gpd.GeoDataFrame(gpd.GeoSeries([poly[0].intersection(poly[1]) for poly in itertools.combinations(geoms, 2) if poly[0].intersects(poly[1])]), columns=['geometry'])
intersection_iter.to_file("intersection_iter.shp")
liên hiệp
union_iter = intersection_iter.unary_union
b) Nếu bạn muốn hợp nhất các đa giác giao nhau thay đổi intersection
theo union
(tất cả các đa giác trùng nhau trong ví dụ của tôi)
2) Bạn có thể sử dụng Lớp phủ GeoPandas
a)
auto_inter = gpd.overlay(g1, g1, how='intersection')
auto_inter.shape
(7,4)
Kết quả GeoDataframe
GeoPandas thêm hình học giao nhau vào hình học hiện có, do đó
intersection = auto_inter[4:7]
intersection.to_file("intersection.shp")
liên hiệp
union = intersection.unary_union
b) sử dụng gpd.overlay(g1, g1, how='union')
Nếu bạn muốn xuất một lớp đa giác chồng chéo riêng biệt và không chỉ là một đa giác đơn lẻ, thì sau khi sử dụng:
union = intersection.unary_union
bạn có thể chuyển đổi đa kết quả thành GeoSeries:
shapes_series = gpd.GeoSeries([polygon for polygon in union])
hoặc đến GeoDataFrame:
shapes_df = gpd.GeoDataFrame([polygon for polygon in union]).set_geometry(0)