Kebun binatang geometri tidak valid

9

Banyak waktu dan seringkali saya menghabiskan berjam-jam berjuang dengan bug aneh yang dihasilkan dari geometri yang tidak valid . Gejala-gejalanya sangat bervariasi, termasuk:

  • Pelambatan basis data
  • Hasil kueri \ Null salah
  • File log dipenuhi dengan kesalahan dan peringatan
  • Hasil tidak konsisten dengan operator geometris (mis. Persimpangan)

Saya ingin mengelompokkan jenis-jenis geometri yang tidak valid, untuk membantu semua orang di sini membersihkan data mereka.

Harap jawab dengan jenis geometri favorit Anda yang tidak valid (satu jenis per jawaban). Tangkapan layar, deskripsi, dan solusi dipersilakan - tetapi usahakan agar jawaban Anda singkat.

Adam Matan
sumber

Jawaban:

3

Segmen nol panjang

Contoh:

SELECT geomFromEWKT('LINESTRING(1 1, 1 1)');

                                    geomfromewkt                                    
------------------------------------------------------------------------------------
 0102000000020000000000000000000840000000000000104000000000000008400000000000001040

Masalah: Menyimpan segmen panjang nol dapat menyebabkan bug saat menghitung rasio panjang (pembagian dengan nol) atau ketika mencoba menghitung fungsi azimuth dan trigonometri.

Deteksi: di PostGIS, segmen dengan panjang nol dapat dideteksi menggunakan isValid().

Solusi: Cobalah untuk menjaga segmen nol panjang sebagai poin.

Adam Matan
sumber
3

Poligon yang berpotongan sendiri

masukkan deskripsi gambar di sini

Contoh:

SELECT isValid(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
NOTICE:  Self-intersection at or near point 0.5 0.5
 isvalid 
---------
 f
(1 row)

Masalah: Perhitungan salah, Misalnya area():

SELECT area(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
 area 
------
    0
(1 row)

Ini dapat menyebabkan bug divisi nol dengan fungsi panggilan.

Deteksi: Di PostGIS, segmen yang memotong sendiri dapat dideteksi menggunakan isValid().

Solusi: Konversi ke MULTIPOLYGON(lihat komentar).

Adam Matan
sumber
Bentuk yang sama itu setara dengan valid:MULTIPOLYGON(((0 0, 0 1, 0.5 0.5, 0 0)),((1 1, 1 0, 0.5 0.5, 1 1)))
Mike T
@Mike Toews: Benar, mengonversi ke MULTIPOLYGON adalah solusi yang baik.
Adam Matan