Apa implikasi dari geometri yang tidak valid

15

Saya telah mengimpor beberapa data dalam database Postgis dan beberapa geometri dilaporkan tidak valid (ST_IsValidReason melaporkan persimpangan-diri atau persimpangan-sendiri cincin).

Kueri yang saya lakukan tampaknya tidak terpengaruh oleh aspek yang tidak valid dari geometri ini (saya hanya menggunakan kueri ST_Distance).

Apa saja hal-hal yang memecah ketika geometri tidak valid?

Apakah memperbaiki geometri ini "secara otomatis" (buffer (geom, 0) atau ST_SimplifyPreserveTopology (geom, 0,0001)) merupakan opsi?

diciu
sumber

Jawaban:

19

Menjaga data yang cacat adalah ide yang buruk, karena Anda tidak pernah dapat memprediksi kapan dan di mana kegagalan akan terjadi. Selain itu, data yang cacat dapat menyebabkan Heisenbugs , jenis bug yang paling ganas dan ilusif.

Saya pikir agak tidak ada gunanya membahas kemungkinan hasil penyimpanan geometri yang tidak valid. Karena itu, Konsekuensinya dapat mencakup:

  • Hasil yang salah (yaitu, ST_Distanceakan mengembalikan angka yang salah atau jelas)
  • Masalah kinerja basis data: Menjaga data yang rusak dapat serius merusak kinerja basis data dan membuat file log besar, karena setiap panggilan fungsi akan menulis kesalahan pada log dan mengganggu pekerjaan basis data biasa.
  • Database lumpuh.
  • Aplikasi lumpuh - baik disebabkan oleh menerima data yang salah dari database, atau dengan menerima hasil yang tidak masuk akal (misalnya, jarak negatif).
  • Perilaku hantu (lihat tautan di atas). Ini adalah konsekuensi terburuk dari semuanya. Anda akan mengalami hal-hal aneh. Perlambatan, kehilangan data, kerusakan, hasil tidak masuk akal, jeda lama, tidak ada responsif dan banyak kutukan lainnya. Anda mungkin tidak dapat menemukan atau mereproduksi mereka, karena semuanya termasuk dalam kategori "tidak ditentukan" dalam setiap dokumentasi.

Saran saya - jika buffer kecil tidak secara signifikan merusak konsistensi data Anda, gunakan itu untuk mencegah hal-hal di atas terjadi. Simpan data Anda valid.

Adam Matan
sumber
Bisakah Anda menguraikan sedikit tentang menggunakan buffer kecil? Bagaimana aku melakukan itu?
diciu
1
ST_Buffer(the_geom, 0.0000001)mungkin melakukan trik untuk persimpangan diri. Gunakan hanya jika konsekuensi dari geometri yang sedikit lebih besar tidak parah.
Adam Matan
1
Pengalaman saya adalah bahwa mengoreksi data yang cacat cukup investigasi. Tetapi meskipun itu memakan waktu, biasanya sepadan dengan usaha. The ST_Buffer(the_geom, 0.0000001)trick pasti membantu banyak.
Chau
Masalahnya adalah ST_Buffer perbaikan geometri tapi hasilnya tidak benar-benar apa yang saya harapkan - polygon tidak valid ini di sini ( openstreetmap.org/browse/way/51954364 ) ST_Buffer hanya mengembalikan kiri atas persegi panjang. ST_SimplifyPreserveTopology tampaknya lebih dekat dengan apa yang saya butuhkan (geometri yang valid tetapi sedekat mungkin dengan aslinya yang tidak valid). Adakah kerugian dalam menggunakan ST_SimplifyPreserveTopology?
diciu
Geometri itu harus diproses sebagai MULTIPOLYGONdua Poligon, bukan sebagai tunggal POLYGON. Cobalah untuk mendapatkan WKT asli jika memungkinkan.
Adam Matan
13

Anda dapat mencegah geometri yang tidak valid memasuki basis data Anda. Untuk pengguna PostgreSQL / PostGIS, ini mudah dilakukan dengan memeriksa kendala . Misalnya, pertimbangkan tabel public.my_valid_tabledengan kolom geometri poligon geom, gunakan SQL / DDL berikut:

ALTER TABLE public.my_valid_table
  ADD CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom));

Catatan: tabel ini harus memiliki poligon yang valid sebelum menegakkan batasan.

Jika Anda kemudian mencoba memasukkan / menambah geometri yang tidak valid, Anda akan melihat kesalahan:

ERROR:  new row for relation "my_valid_table" violates check constraint "enforce_valid_geom"
Mike T
sumber