Utwórz wielokąt z linii w PostGIS

13

Próbuję podzielić wielokąt na mniejsze wielokąty z linii, ale myślę, że nie mogę użyć funkcji st_split. Potrzebuję stworzyć małe wielokąty wewnątrz dużego, używając siatki linii.

Próbowałem na kilka sposobów, ale nie mogę uzyskać wyniku. Co próbowałem:

Podziel jeden wielokąt z LineString za pomocą st_split ()

Z wieloboku granicznego.

wprowadź opis zdjęcia tutaj

I Linestring table:

wprowadź opis zdjęcia tutaj

Potrzebowałbym następujących wielokątów:

wprowadź opis zdjęcia tutaj

Problem : Nie mogę rozdzielić wielokąta z kilku linii, ani wielokąta z multilinestingu.

Inną metodą, którą próbuję, jest utworzenie wielokątów z linii za pomocą st_polygonize (). Próbowałem SQL:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

Wyodrębniono z Tworzenie wielokątów z segmentów linii za pomocą PostgreSQL i PostGIS

Problem : Mogę uzyskać tylko jeden wielokąt (granicę).

Czy ktoś może mi powiedzieć, który byłby najlepszy sposób na wydobycie wielokątów z linestring, czy jeśli czegoś mi brakuje?

Uwaga: Tabele mają ten sam SRID, a geometrie są przyciągane do siatki. W QGIS potrafię perfekcyjnie uruchomić proces poligonizacji od linii do wielokąta.

Zgodnie z żądaniem Johna, oto stół z liniami. https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing

Pablo Pardo
źródło
1
Czy możesz gdzieś opublikować geometrie linii? ST_Polygonize wraz z ST_Dump powinny działać.
John Powell,
Pewnie. Zredagowałem post z linkiem do tabeli.
Pablo Pardo,
@ JohnPowellakaBarça czy możesz na to spojrzeć. To pytanie jest świetne. ST_Polygonize na swoim zestawie próbek zwraca pojedynczy wielokąt. Zasadniczo musimy rozłożyć jego bałagan na otwarte LINESTRINGS i znaleźć wszystkie, które mogą tworzyć prostokąty?
Evan Carroll
1
@EvanCarroll. Pewnie. Jestem szalenie zajęty bankomatem, więc prawdopodobnie nie przez kilka dni.
John Powell,
1
@ppardoz. Espero que esto te ayude. Zauważyłem, że wszystkie deficyty w tabeli były po hiszpańsku :-)
John Powell,

Odpowiedzi:

4

Zacząłem działać, używając najpierw ST_Node , w połączeniu ze ST_Collect , do przekształcenia linii w zestaw oznaczonych liniami linii w ciągu MultiLinestring .

Jak napisano w dokumentacji dla ST_Node :

W pełni węzeł zestawu linii przy użyciu najmniejszej możliwej liczby węzłów przy zachowaniu wszystkich wejściowych.

Oznacza to, że wszystkie linie łączone są we wszystkich możliwych kombinacjach, tak aby stanowiły odpowiednik zewnętrznego pierścienia wielokąta. Natomiast jeśli spróbujesz ST_Polygonize zestawu LineStrings, z których żaden sam nie opisuje wielokąta, po prostu odzyskasz LineStrings. To działa:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

Jeśli po prostu uruchomisz pierwszą część tego, tj. CTE multi, wynik wygląda następująco:

MULTILINESTRING ((204,5 69,9000000000004,204,5 69,9000000000004), (204,5 68,9,205,4 68,9), (204,5 69,204,5 69,204,5 69,1 204,5 69,2, 204,5 69,204,5 69,5, 204,5 69,5, 204,5 69, 66,204,5 69,5 204,5 69,9000000000004), (209,5 68,20 20,5 68,209,5,5 67,209,5 68,6,209,5 68,5,209,5 64,4,209,5 68,3,209,5 68,2,209,5 68,1 209,5 69,5 209,5 67,5 209,5 57,5 ​​68,209,5 67,209,5 57,5 ​​66,209,5 , 209,5 .......

Teraz, gdy teraz podajesz ten MultiLinestring do ST_Polygonize , działa on zgodnie z oczekiwaniami, np.

POLYGON ((205,4 68,9,204,5 68,9,204,5 69 204,5 69,1, 204,5 69,2, 204,5 69,34,54,5 64,204,5,54,5,5 204,5 69,204,5 69,7 204,5 68,84,59,5 69, 194,5 59,9000000000004,205,4 69,95,59 55,4

POLYGON ((204,5 69,9000000000004,204,5 70,204,5 70,1,204,5 70,2,204,5 70,3,204,5 70,4,206,8 70,4,209,5 70,4,209,5 70,3,209,5 70,2,209,5 70,1,209,5 70,209,5 69,9,205,4 6900)

POLYGON ((206,8 70,4,204,5 70,4,204,5 70,5,204,5 70,6,204,5 70,7,204,5 708,8,204,5 70,9,204,5 71 204,5 71,20,1,54,5,21,2204,5 71,3,204,5 71,4,206,8 71,206,8 8 70,4))

Oczywiście ST_AsText służy wyłącznie do ilustracji i będziesz musiał dostosować, jeśli chcesz również identyfikator ścieżki.

Kluczową kwestią jest to, że ST_Polygonize oczekuje linii, które już opisują obrys wielokąta , co jest tym, co ST_Node (ST_Collect (.... powyżej).

John Powell
źródło
To naprawdę fajne, mogę potwierdzić, że to rozwiązanie działa! Z drugiej strony, zastanawiam się, dlaczego ST_Polygonize()mówi, że bierze ciągów liniowych, lub co przypadek użycia jest, że bez wywoływania ST_Node()pierwszy
Evan Carroll
1
@EvanCarroll. Myślę, że odpowiedź brzmi, że ST_Polygonize pobiera linie liniowe, które są już w zestawie reprezentującym wielokąt, podczas gdy linie liniowe w tym pytaniu tworzyły wiele możliwych wielokątów. Rozumiem, że właśnie to robi ST_Node. Spróbuję przeprowadzić dalsze dochodzenie i zaktualizować odpowiedź.
John Powell,