ROZBIJANIE MULTIPOLIGONÓW

ROZBIJANIE MULTIPOLIGONÓW

Dziś krótki wpis poświęcony rozbijaniu w PostGISie multiobiektów na części składowe. Na początek stworzyłem warstwę z jednym obiektem – multipoligonem prezentującym przedwojenny powiat świętochłowicki. Na tym przykładzie pokażę jak rozbić multipoligon na poligony składowe. Takie rozbijanie czasem się przydaje, gdyż nie każdą operację w postgisie można wykonać na multiobiektach. Np nie zamienimy multipoligonu na linie poleceniem st_exteriorring. 

Na początek, geometrię powiatu możecie pobrać stąd.
Upewniamy się czy nasz obiekt na pewno jest multipoligonem.

--jaki typ
select distinct st_geometrytype(geometria) from public.multi
--"ST_MultiPolygon"

Widzimy, że jest. Policzmy jego powierzchnię. Warstwa jest w układzie 92, więc zostaną zwrócone metry.

--powierzchnia
select st_area(geometria) from public.multi
--87714284.8452617

I teraz dochodzimy do sedna. Rozbijanie mulitiobiektu. Wykonuje się je poleceniem st_dump. Z jednym zastrzeżeniem – musimy je wziąć w nawias i dopisać po kropce klauzulę geom. Funkcja ta zwraca zestaw rekordów ze składowymi geometriami – stąd geom, oraz numerem składowej geometrii wewnątrz multiobiektu. Jeśli chcemy poznać numer obiektu wewnętrznego używamy klauzuli path. Razem wygląda to tak:

select (st_dump(geometria)).geom as geometria_dump, (st_dump(geometria)).path as geometria_path from public.multi
--"010300002084080000010000003500000066B4...";"{1}"
--"01030000208408000001000000790000005472...";"{2}"

Zapytanie zwróciło zestaw rekordów – geometrie i ich indeksy.

select (st_dump(geometria)).geom as geometria_dump from public.multi

Powyższe zapytanie zwróci nam dwa rekordy – powinny to być poligony.

--jaki typ
select st_geometrytype(t1.geometria_dump) from (select (st_dump(geometria)).geom as geometria_dump from public.multi) t1
--"ST_Polygon"
--"ST_Polygon"

Otrzymujemy dwa razy ST_Polygon. Czyli to, o co nam chodziło. Możemy teraz policzyć ich powierzchnie, razem powinny dawać powierzchnię jaką zwróciło nam zapytanie z początku wpisu.

--powierzchnie
select st_area(t1.geometria_dump) from (select (st_dump(geometria)).geom as geometria_dump from public.multi) t1
--35725469.5697573
--51988815.2755043

Jak widać rozbijanie multiobiektów nie jest trudniejsze od używania „zwykłych” funkcji postgisowych, a sama funkcja jest przydatna i warto ją znać.

Related Posts