Menggabungkan fitur yang tumpang tindih menggunakan Geopandas?

8

Saya memiliki Shapefile dengan fitur yang tumpang tindih. Apakah ada cara mudah untuk menggabungkannya dengan geopanda?

Saya menemukan cara dengan rupawan, tetapi saya ingin melakukannya dengan geopanda secara langsung.

Mehdi.Sqalli
sumber

Jawaban:

10

GeoDataFrame

import geopandas as gpd
g1 = gpd.GeoDataFrame.from_file("poly_intersect.shp")
g1.shape
(4, 3)

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

1) Anda dapat menggunakan modul itertools

a) Jika Anda ingin menggabungkan persimpangan poligon yang tumpang tindih

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

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Persatuan

union_iter = intersection_iter.unary_union

b) Jika Anda ingin menggabungkan perubahan poligon berpotongan intersectiondengan union(semua poligon tumpang tindih dalam contoh saya)

masukkan deskripsi gambar di sini

2) Anda dapat menggunakan GeoPandas Overlay

Sebuah)

auto_inter = gpd.overlay(g1, g1, how='intersection')
auto_inter.shape
(7,4)

GeoDataframe yang dihasilkan

masukkan deskripsi gambar di sini

GeoPandas menambahkan geometri persimpangan ke geometri yang ada, oleh karena itu

intersection = auto_inter[4:7]
intersection.to_file("intersection.shp") 

masukkan deskripsi gambar di sini

Persatuan

union = intersection.unary_union

b) gunakan gpd.overlay(g1, g1, how='union')

gen
sumber
1

Jika Anda ingin menampilkan lapisan poligon tumpang tindih yang berbeda dan bukan hanya satu multi-poligon, maka setelah menggunakan:

union = intersection.unary_union

Anda bisa mengonversi multi-poli yang dihasilkan menjadi GeoSeries:

shapes_series = gpd.GeoSeries([polygon for polygon in union])

atau ke GeoDataFrame:

shapes_df = gpd.GeoDataFrame([polygon for polygon in union]).set_geometry(0)
Pawel Kranzberg
sumber
Ini mungkin seharusnya merupakan suntingan untuk jawaban pertama dan bukan jawaban di dalamnya sendiri
nmtoken
Terima kasih atas tipnya, tetapi akhirnya saya akan mengerjakan ulang jawaban gen, dan itu tidak sepadan dengan usaha. Saya tidak bisa menambahkan komentar karena perwakilan saya di bawah 50.
Pawel Kranzberg