Pierścieniowe skrzyżowania w PostGIS

10

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.

ESRIHelp
źródło
1
co zwraca „select geometry_type (the_geom) z sgm_buffer limit 1”? Czy w związku z 40-godzinnym czasem pracy wymienionym w innym pytaniu, czy na twoim stole są zdefiniowane indeksy przestrzenne?
diciu
Może być konieczne ST_Multi()wymuszenie, aby wszystkie wielokąty były MULTIPOLYGONs (to założenie)
Mike T
Dzięki za komentarze - myślę, że są indeksy, wydają się być widoczne w pgAdminIII, ale może muszę je odświeżyć? Mógłbym znaleźć rozwiązania przyspieszające zapytanie - nie wiem, jaki byłby rozsądny czas na jego uruchomienie? Landcover ma około 20 milionów funkcji.
ESRIHelp

Odpowiedzi:

12

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:

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

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.

Nicklas Avén
źródło
0

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:

     -- 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

Obliczyłem powierzchnię wielokąta i samo-przecięcie i zachowam tylko wielokąty, które mają pole> 1. 1to 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.

Abdillahi Abdi Mohamed
źródło