Bagaimana saya menulis SQL (untuk PostGIS di PostgreSQL) untuk menghapus sliver polygons (termasuk sliver sempit panjang dan beberapa poligon tidak beraturan kecil yang keliru 'celah' dalam dataset asli) dari dataset saya dengan menggabungkan dengan poligon yang berdekatan dengan tepi terpanjang?
Saya memiliki dataset (tablename: "Vegetation" yang mengandung beberapa ribu poligon yang diidentifikasi sebagai sliver atau poligon 'nyata' dalam kolom deskripsi (nama kolom: "desc") sebagai "sliver" atau "main". [Edit: Sebelumnya untuk mengimpor dataset saya ke PostGIS, saya membersihkannya dengan mengimpor ke GRASS (yang juga merupakan cara saya mengubah semua celah menjadi poligon kecil, yang kemudian saya gabungkan dengan dataset utama. Saya menemukan jika saya meningkatkan toleransi gertakan dan area minimum melewati ' 1 'pada impor GRASS, saya mulai kehilangan fitur yang diinginkan.]
Pemahaman saya adalah bahwa saya mungkin perlu langkah-langkah berikut:
- Identifikasi poligon (Vegetation.desc = "main") yang berdampingan dengan masing-masing sliver (Vegetation.desc = "sliver") yang berbagi tepi terpanjang.
- Identifikasi tepi antara masing-masing sliver dan itu bersebelahan dengan poligon utama yang memiliki tepi terpanjang yang diidentifikasi pada Langkah 1. (Mungkin menggunakan ST_Relate)
- Hapus tepi antara masing-masing sliver dan itu berdekatan poligon utama berbagi tepi terpanjang menggunakan pengidentifikasi tepi yang dikembalikan pada Langkah 2. (Mungkin menggunakan ST_RemEdgeModFace)
Saya hanya memiliki pemahaman yang sangat mendasar tentang SQL dan proses di atas berada di luar kemampuan saya.
sumber
Jawaban:
Saya menggunakan ini ketika menggabungkan bentuk dari dataset GADM2 di SQL Server:
The
reduce()
membersihkan keluar artefak diperpanjang dan kecepatan segalanya dengan faktor 100x - agak kasar, tapi baik untuk perkiraan.sumber