Ponieważ powiedziałeś, że masz grupę przecinających się wielokątów dla każdego interesującego cię wielokąta, możesz chcieć stworzyć coś, co nazywa się „nakładką wielokątów”.
To nie jest dokładnie to, co robi rozwiązanie Adama. Aby zobaczyć różnicę, spójrz na to zdjęcie skrzyżowania ABC:
Wierzę, że rozwiązanie Adama stworzy wielokąt „AB” obejmujący zarówno obszar „AB! C” i „ABC”, jak i wielokąt „AC” obejmujący „AC! B” i „ABC” oraz „ Wielokąt BC, czyli „BC! A” i „ABC”. Tak więc wielokąty wyjściowe „AB”, „AC” i „BC” nakładałyby się na obszar „ABC”.
Nakładka wielokąta wytwarza wielokątów, więc AB! C byłby jednym wielokątem, a ABC byłby jednym wielokątem.
Tworzenie nakładki wielokątów w PostGIS jest w rzeczywistości dość proste.
Istnieją w zasadzie trzy kroki.
Krok 1 to wyodrębnienie szkicu [Zauważ, że używam zewnętrznego pierścienia wielokąta, robi się to trochę bardziej skomplikowane, jeśli chcesz poprawnie obsługiwać otwory]:
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
Krok 2 polega na „węzłowaniu” linii (tworzenie węzła na każdym skrzyżowaniu). Niektóre biblioteki, takie jak JTS, mają klasy „Noder”, których możesz użyć, ale w PostGIS funkcja ST_Union robi to za Ciebie:
SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines
Krok 3 polega na utworzeniu wszystkich możliwych nienakładających się wielokątów, które mogą pochodzić ze wszystkich tych linii, wykonanych przez funkcję ST_Polygonize :
SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)
Możesz zapisać dane wyjściowe każdego z tych kroków w tabeli tymczasowej lub połączyć je wszystkie w jedną instrukcję:
CREATE TABLE my_poly_overlay AS
SELECT geom FROM ST_Dump((
SELECT ST_Polygonize(the_geom) AS the_geom FROM (
SELECT ST_Union(the_geom) AS the_geom FROM (
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
) AS noded_lines
)
)
Używam ST_Dump, ponieważ dane wyjściowe ST_Polygonize są kolekcją geometrii i (zazwyczaj) wygodniej jest mieć tabelę, w której każdy wiersz jest jednym z wielokątów tworzących nakładkę wieloboku.