Ini adalah tindak lanjut dari pertanyaan sebelumnya . Anda akan melihat saya adalah pengguna PostGIS baru.
Saya telah melihat validitas topologi dalam data saya dan menemukan sekitar 1700 masalah topologi dalam dataset landcover (poligon). Ini semua "Ring Self_intersection".
Dengan menggunakan beberapa informasi yang berguna dalam presentasi ini oleh Paul Ramsay (halaman 20), saya telah berupaya untuk melakukan buffer data saya sesuai:
UPDATE schema.data SET the_geom = buffer (the_geom, 0.0) WHERE isvalid (the_geom) = false dan isvalid (buffer (the_geom, 0.0)) = true;
Tapi saya mendapat respons:
PEMBERITAHUAN: Ring Self-intersection at atau near point (diedit) ERROR: baris baru untuk relasi "sgm_buffer" melanggar batasan periksa "cementce_geotype_the_geom "
********** Kesalahan **********
GALAT: baris baru untuk hubungan "sgm_buffer" melanggar batasan periksa "menegakkan_geotype_the_geom" Keadaan SQL: 23514
Saya juga sudah mencoba:
UPDATE csgn.sgm_buffer SET the_geom = buffer (the_geom, 0.0)
dan dapatkan:
GALAT: baris baru untuk relasi "sgm_buffer" melanggar batasan periksa "cementce_geotype_the_geom "
********** Kesalahan **********
GALAT: baris baru untuk hubungan "sgm_buffer" melanggar batasan periksa "menegakkan_geotype_the_geom" Keadaan SQL: 23514
Jadi, apakah saya berasumsi bahwa teknik buffer ini tidak akan berfungsi pada masalah saya? Atau saya melakukan sesuatu yang salah?
Mr Ramsay kemudian melanjutkan dalam dokumen yang sama untuk menyarankan teknik tambahan untuk menangani "angka 8" poligon. Saya tidak sepenuhnya mengerti bagaimana menuliskan ini dalam kode lengkap (atau apa yang dilakukannya dan apakah itu akan membantu saya):
SELECT ST_BuildArea (ST_Union ('LINESTRING EMPTY', ST_ExteriorRing ('POLYGON ((...))'
Jadi .... adakah yang bisa membantu? Ini membuktikan mimpi buruk nyata dengan rentang waktu saya yang ketat dan keterampilan yang terbatas di PostGIS.
ST_Multi()
untuk memaksa semua poligon menjadiMULTIPOLYGON
s (ini asumsi)Jawaban:
Saya pikir apa yang terjadi adalah bahwa poligon berpotongan diri Anda menjadi MULTIPOLYGON saat buffering.
Anda memiliki dua opsi:
1 menghapus batasan "menegakkan_geotype_the_geom", Anda dapat melakukannya di pgAdmin
2 masukkan hasilnya dalam tabel baru alih-alih memperbarui yang lama. itu sering kali merupakan cara yang baik untuk melakukan sesuatu karena Anda tidak mengubah apa pun di tabel asli Anda. kueri dapat terlihat seperti:
tentu saja Anda mungkin ingin membawa lebih banyak bidang ke tabel baru Anda.
coba dulu trik penyangga. Dalam pendekatan kedua, Paul bisa mengatakan pada dirinya sendiri apa yang memengaruhi linestring kosong itu. Saya tidak ingat bagaimana keajaiban itu terjadi.
sumber
Saya memiliki masalah yang sama beberapa bulan yang lalu. Saya memiliki poligon di basis data saya dengan banyak persimpangan-sendiri. Saya menggunakan metode Niklas Aven, tetapi tidak berhasil. Saya juga menggunakan metode lain.
Metode saya adalah menghapus persimpangan diri dari poligon saya. Berikut adalah query SQL yang saya gunakan:
Saya menghitung luas poligon dan persimpangan-sendiri dan saya hanya akan menjaga poligon yang memiliki luas> 1.
1
adalah toleransi karena luas persimpangan-sendiri sangat kecil. Perhatikan juga bahwa transformasi SRID ke meter penting jika Anda memiliki data dalam derajat.sumber