Ring Self-Intersections di PostGIS

10

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.

ESRIHelp
sumber
1
apa yang "pilih geometry_type (the_geom) dari sgm_buffer batas 1" kembali? Juga, terkait dengan runtime 40 jam yang disebutkan dalam pertanyaan lain, apakah ada indeks spasial yang didefinisikan pada tabel Anda?
diciu
Anda mungkin perlu ST_Multi()untuk memaksa semua poligon menjadi MULTIPOLYGONs (ini asumsi)
Mike T
Terima kasih atas komentar - diciu Saya pikir ada indeks, mereka tampaknya terlihat di pgAdminIII, tapi mungkin saya perlu menyegarkan mereka? Saya bisa lakukan dengan mencari solusi untuk mempercepat permintaan - saya tidak tahu apa yang akan menjadi waktu yang masuk akal untuk menjalankannya? Landcover memiliki sekitar 20 juta fitur.
ESRIHelp

Jawaban:

12

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:

CREATE TABLE new_buffered_table as
SELECT ST_Buffer(the_geom,0.0) as the_geom, gid FROM original_table;

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.

Nicklas Avén
sumber
0

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:

     -- Create the new polygons 

SELECT ST_GeomFromText(polygone) as geom

   from (

    SELECT st_astext(ST_MakePolygon(linear)) as polygone

        from (
              SELECT st_astext
                ((ST_dump
                   (st_boundary
                      (ST_MakeValid
                     (ST_Transform
                        (ST_SETSRID
                           (geometry,4326),32631))))).geom) 
                          as linear from tables_name)
        as query2)

  as query1

where ST_area(polygone) > 1

Saya menghitung luas poligon dan persimpangan-sendiri dan saya hanya akan menjaga poligon yang memiliki luas> 1. 1adalah toleransi karena luas persimpangan-sendiri sangat kecil. Perhatikan juga bahwa transformasi SRID ke meter penting jika Anda memiliki data dalam derajat.

Abdillahi Abdi Mohamed
sumber