Nieprawidłowa geometria zoo

9

Wiele razy i często spędziłem godziny walcząc z dziwnymi błędami wynikającymi z nieprawidłowej geometrii . Objawy różnią się znacznie, w tym:

  • Spowolnienia bazy danych
  • Niepoprawne \ Null wyniki zapytania
  • Pliki dziennika są przeciążone błędami i ostrzeżeniami
  • Niespójny wynik z operatorami geometrycznymi (np. Przecięcie)

Chciałbym kategoryzować typy nieprawidłowych geometrii, aby pomóc wszystkim tutaj w odkażaniu ich danych.

Proszę odpowiedzieć swoim ulubionym typem nieprawidłowej geometrii (jeden typ na odpowiedź). Zrzuty ekranu, opisy i rozwiązania są mile widziane - ale staraj się, aby Twoja odpowiedź była krótka.

Adam Matan
źródło

Odpowiedzi:

3

Segmenty o zerowej długości

Przykład:

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

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

Problemy: Przechowywanie segmentu o zerowej długości może powodować błędy podczas obliczania współczynników długości (dzielenie przez zero) lub podczas próby obliczenia azymutów i funkcji trygonometrycznych.

Wykrywanie: w PostGIS za pomocą można wykryć segmenty o zerowej długości isValid().

Rozwiązania: Staraj się utrzymywać segmenty o zerowej długości jako punkty.

Adam Matan
źródło
3

Wieloboki samoblokujące

wprowadź opis zdjęcia tutaj

Przykład:

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)

Problemy: błędne obliczenia, na przykład area():

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

Może to powodować błędy zerowego podziału funkcji wywoływania.

Wykrywanie: W PostGIS można przecinać segmenty przecinające się za pomocą isValid().

Rozwiązanie: Konwersja na MULTIPOLYGON(patrz komentarz).

Adam Matan
źródło
Ten sam kształt jest równoważny obowiązującemu: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: Poprawnie, przejście na MULTIPOLYGON jest dobrym rozwiązaniem.
Adam Matan