Menghapus (didefinisikan) sliver poligon menggunakan PostGIS? [Tutup]

9

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:

  1. Identifikasi poligon (Vegetation.desc = "main") yang berdampingan dengan masing-masing sliver (Vegetation.desc = "sliver") yang berbagi tepi terpanjang.
  2. 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)
  3. 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.

DavidM
sumber
ekstensi "postgis topology", jika saya mengerti benar hanya membuat topologi dengan toleransi lebih besar daripada sliver rata Anda akan membersihkan geometri. tetapi saya belum melakukan hal seperti itu
simplexio
Saya percaya saya akan kehilangan banyak resolusi dengan membuat topologi dengan toleransi yang cukup besar karena ukuran beberapa 'sliver' (lihat klarifikasi dalam teks). Ini mungkin karena pemahaman saya yang terbatas, dan solusi yang lebih sederhana disambut dengan sangat baik!
DavidM
selamat datang di gis dan pembersihan data. Apakah Anda memiliki akses ke FME? yang satu memiliki cukup mudah digunakan dan memiliki beberapa opsi untuk menghapus sliver dari poligon. Alternatif untuk gis.stackexchange.com/questions/24365/… dan google tampaknya menemukan pl / pgsql jawaban untuk pertanyaan Anda (tidak tahu seberapa bagus mereka). Yang mengatakan, tidak ada cara super mudah untuk melakukannya yang saya tahu, membersihkannya dengan tangan adalah cara "termudah" untuk melakukannya tetapi saya dapat mengambil waktu looong
simplexio
Barang-barang perak meninggalkan lubang jika Anda membuat persatuan atau akan ada artefak intersecten atau keduanya jenis "kesalahan pembulatan"?
huckfinn
1
Saya telah menyelesaikan sementara masalah saya (untuk proyek saat ini) dengan menggunakan uji coba ARCGIS dan menerapkan fungsi eliminasi. Ini bekerja dengan baik. Saya masih tertarik untuk mencari solusi SQL menggunakan postgis.
DavidM

Jawaban:

3

Saya menggunakan ini ketika menggabungkan bentuk dari dataset GADM2 di SQL Server:

SET @g2 = @g1.STBuffer(1).Reduce(1).STBuffer(-1).Reduce(1)

The reduce()membersihkan keluar artefak diperpanjang dan kecepatan segalanya dengan faktor 100x - agak kasar, tapi baik untuk perkiraan.

Daniel
sumber