Membagi tumpang tindih antara poligon dan menetapkan ke poligon terdekat menggunakan PostGIS?

8

Pertanyaan saya cukup terkait dengan Split tumpang tindih yang tidak terjawab antara poligon menjadi set terpisah kecuali saya tidak menggunakan shapely, saya menggunakan PostGIS 2.4 pada PostgreSQL 10.

Saya punya tabel berisi multi-satuan untuk unit administrasi. Geometri hanya mencakup area lahan. Tujuan saya adalah untuk memperpanjang jarak mereka ke air.

Untuk memperluas poligon saat ini ke dalam air, saya melakukan buffer diikuti dengan mengurangi semua geometri lain dalam tabel. Ini klip buffer mana geometri memiliki tetangga dan mempertahankan buffer di mana layer saat ini tidak memiliki apa-apa. Jadi, sesuatu seperti:

SELECT c1.name
     , ST_Difference( ST_Buffer( ST_Union(c1.geom), 250 )
                    , (SELECT ST_Union(c2.geom)
                         FROM foo.county AS c2
                        WHERE c2.name <> c1.name)
                    )
  FROM foo.county AS c1
 GROUP BY c1.name;

Namun, ini tentu saja memberi saya buffer yang tumpang tindih di mana dua poligon bertemu satu sama lain di tepi air, serta melintasi selat yang sempit:

peta

(Perhatikan bahwa sliver ungu kecil di sebelah kiri harus sepenuhnya ditetapkan ke poligon merah, karena tidak ada titik dalam geometri yang lebih dekat ke biru daripada merah karena semenanjung mirip-appendix.)

Di sinilah aku terjebak. Saya ingin memotong tumpang tindih (bagian ungu) menjadi dua poligon terpisah di sepanjang garis yang sama dengan poligon yang tidak dikonstruksikan, dan kemudian mengurangi irisan itu dari daerah buffer.

Saya tidak berpikir saya memiliki kasus tiga atau lebih buffer yang tumpang tindih. Saya akan menyeberangi jembatan itu jika dan ketika saya sampai di sana.

Baunya bagi saya seperti sesuatu yang mirip-tetapi-tidak-cukup-identik dengan menggunakan ST_VoronoiPolygonstetapi di sekitar poligon, bukan titik.

Apakah ini ada - idealnya - sebagai fungsi PostGIS, sebagai fungsi geoprosesing QGIS atau mungkin di beberapa pustaka python?

kthy
sumber
Pada gambar di atas, apakah bintik kecil perairan internasional yang tidak biru? atau apakah Anda mengisinya?
Evan Carroll
Yang bukan biru hanya di luar semua poligon - Saya hanya melakukan penyangga 250 meter sehingga masih menjadi perairan nasional. Untuk tujuan saya, saya hanya perlu buffer kecil untuk memastikan saya menangkap fitur "di selancar". Melihat lubang di selatan pulau cincin di tengah pasti membuat saya ingin melakukan dump ExteriorRing juga, tapi itu tidak relevan untuk pertanyaan ini. :)
kthy
Apakah Anda menemukan solusinya? Saya menghadapi masalah serupa dan ingin membagi beberapa poligon yang tumpang tindih dengan tetangga mereka.
DanielK
Sayangnya, belum ada solusi. Saya punya ide untuk maju menggunakan kombinasi ExteriorRingdan Intersectstetapi belum punya waktu untuk mengerjakannya selama liburan.
kthy
contoh Anda mungkin sudah sebagian terotomatisasi, tetapi fungsi st_difference berperilaku mengerikan ketika memotong, meninggalkan "kumis" di tepi luka, yang memaksa pengembang untuk mencari solusi, dan kasus penggabungan poligon bisa sederhana dan rumit, yang akan memerlukan revisi manual ... Anda masih menghadapi pekerjaan dengan contoh Anda?
Cyril Mikhalchenko

Jawaban:

5

Jika solusi untuk masalah ini relevan, dan saya memahaminya dengan benar, solusinya adalah sebagai berikut: (Data asli adalah abstrak, seperti yang saya pahami adalah berbatasan yang bersinggungan pada buffer dengan jumlah meter tertentu, dalam kasus saya 2 tabel : exper_list3 dan exper_list4 lihat gambar 1):

masukkan deskripsi gambar di sini 1) Di pgAdmin, jalankan kueri: create table exper_list5 as SELECT st_intersection (exper_list4.geom, exper_list3.geom) AS geom FROM exper_list4, exper_list3 WHERE st_intersects (exper_list4.geom, exper_list3.geom) = true; hasil: tabel exper_list5 lihat gambar 2;

masukkan deskripsi gambar di sini

2) Di pgAdmin, jalankan kueri: create table exper_list6 as SELECT (ST_Dumppoints (geom)). Geom FROM exper_list5; Hasilnya adalah tabel dengan titik-titik, tambahan pergi ke properti tabel, buat bidang gid dan tetapkan batasannya;

3) Di QGIS, jalankan alat Polygon Voronoi di atas meja (layer vektor) exper_list6 Hasilnya ditunjukkan pada Gambar 3.

masukkan deskripsi gambar di sini

4) Di pgAdmin, jalankan kueri: create table exper_list8 as SELECT (ST_Dumppoints (geom)).geom FROM exper_list7; Hasilnya ditunjukkan pada Gambar 4.

masukkan deskripsi gambar di sini

5) Pilih dari exper_list8 titik-titik yang memasukkan poligon exper_list5 Di pgAdmin, jalankan kueri: create table exper_list9 as SELECT st_intersection (exper_list8.geom, exper_list5.geom) AS geom FROM exper_list8, exper_list5 WHERE st_intersects (exper_list8.geom, exper_list5.geom) = true; dan salin titik-titik ini ke angka hasil tabel exper_list6 angka 5;

masukkan deskripsi gambar di sini

6) Di QGIS Pada tabel exper_list6 jalankan alat "Delaunay triangulation" dan dapatkan hasilnya exper_list10 lihat gambar 6

masukkan deskripsi gambar di sini

7) Dalam QGIS dalam mode pengeditan "Pensil" pada tabel exper_list10 pilih segitiga yang mengenai bidang yang diminati, gunakan alat "Vektor" - "Geoprosesing" - "Penyatuan menurut fitur" (centang "hanya objek yang dipilih" "Klasifikasi" - dengan semua tanda) hasil exper_list11 angka 7;

masukkan deskripsi gambar di sini

8) Dari exper_list6 memotong exper_list11 angka hasil 8 exper_list12;

masukkan deskripsi gambar di sini

9) Dari exper_list4 memotong exper_list11 angka hasil 9 exper_list13;

masukkan deskripsi gambar di sini

10) Tindakan serupa harus dilakukan dengan poligon kiri (dalam kasus saya, tabel exper_list4)

11) Hasil keseluruhan adalah dua tabel exper_list13 dan exper_list14 lihat gambar 10.

masukkan deskripsi gambar di sini

semoga sukses, milikmu dengan setia

Cyril Mikhalchenko
sumber
Ini terlihat seperti emas padat. Saya akan menandainya sebagai diterima begitu saya punya waktu untuk mengujinya minggu depan. Terima kasih!
kthy