Jest to kontynuacja poprzedniego pytania . Zobaczysz, że jestem nowym użytkownikiem PostGIS.
Sprawdziłem ważność topologii w moich danych i znalazłem około 1700 problemów z topologią w zestawie danych pokrycia terenu (wielokąta). Są to „Ring Self_intersection”.
Korzystając z użytecznych informacji w tej prezentacji Paula Ramsaya (strona 20), próbowałem odpowiednio buforować moje dane:
UPDATE schema.data SET the_geom = bufor (the_geom, 0.0) GDZIE isvalid (the_geom) = false i isvalid (buffer (the_geom, 0.0)) = true;
Ale dostaję odpowiedź:
POUCZENIE: Pierścień Własne przecięcie w punkcie lub w pobliżu (edytowane) BŁĄD: nowy wiersz dla relacji „sgm_buffer” narusza ograniczenie sprawdzania „enforce_geotype_the_geom”
********** Błąd **********
BŁĄD: nowy wiersz dla relacji „sgm_buffer” narusza ograniczenie sprawdzania „enforce_geotype_the_geom” Stan SQL: 23514
Próbowałem też tylko:
AKTUALIZACJA csgn.sgm_buffer SET the_geom = buffer (the_geom, 0.0)
i dostać:
BŁĄD: nowy wiersz dla relacji „sgm_buffer” narusza ograniczenie sprawdzania „enforce_geotype_the_geom”
********** Błąd **********
BŁĄD: nowy wiersz dla relacji „sgm_buffer” narusza ograniczenie sprawdzania „enforce_geotype_the_geom” Stan SQL: 23514
Czy więc zakładam, że ta technika buforowania nie zadziała w moich problemach? Czy robię coś złego?
Pan Ramsay kontynuuje następnie w tym samym dokumencie, aby zasugerować dodatkową technikę radzenia sobie z wielokątami o „liczbie 8”. Nie do końca rozumiem, jak napisać to w całości w kodzie (lub co robi i czy mi to pomoże):
WYBIERZ ST_BuildArea (ST_Union („LINESTRING EMPTY”, ST_ExteriorRing („POLYGON ((...))”
Więc ... czy ktoś może pomóc? To jest prawdziwy koszmar z moimi ciasnymi ramami czasowymi i ograniczonymi umiejętnościami w PostGIS.
ST_Multi()
wymuszenie, aby wszystkie wielokąty byłyMULTIPOLYGON
s (to założenie)Odpowiedzi:
Wydaje mi się, że to, co się dzieje, polega na tym, że twoje samokreślące się wielokąty stają się MULTIPOLYGONS podczas buforowania.
masz dwie opcje:
1 usuń ograniczenie „enforce_geotype_the_geom”, możesz to zrobić w pgAdmin
2 umieść wynik w nowej tabeli zamiast aktualizować stary. jest to często dobry sposób na robienie rzeczy, ponieważ wtedy nie zmienia się niczego w oryginalnym stole. zapytanie może wyglądać mniej więcej tak:
oczywiście możesz przynieść więcej pól do nowego stołu.
spróbuj najpierw sztuczki buforowej. W drugim podejściu Paul może sobie powiedzieć, jaki wpływ ma pusty linestring. Nie pamiętam, jak ta magia się dzieje.
źródło
Te same problemy miałem kilka miesięcy temu. W mojej bazie danych miałem wielokąty z wieloma skrzyżowaniami. Użyłem metody Niklasa Avena, ale to nie zadziałało. Użyłem także innych metod.
Moja metoda polega na usunięciu przecięcia siebie z moich wielokątów. Oto zapytanie SQL, którego użyłem:
Obliczyłem powierzchnię wielokąta i samo-przecięcie i zachowam tylko wielokąty, które mają pole> 1.
1
to tolerancja, ponieważ obszar samo-przecięcia jest bardzo mały. Należy również pamiętać, że transformacja SRID na liczniki jest ważna, jeśli masz dane w stopniach.źródło