Aggregate Polygons – generalizacja zabudowy w PostGIS

Wstęp

Jednym z bardziej istotnych problemów kartograficznych przy tworzeniu map w skali 1:50 000 i 1: 100 000 jest dokonanie generalizacji pojedynczych budynków do bardziej ogólnych obiektów – obszarów zabudowanych. Tradycyjnie dokonywano tego ręcznie, w oparciu o określone reguły, ale też i subiektywne odczucia kartografa. Obecnie jednak, gdy coraz częściej słyszymy o wielorozdzielczych i wieloreprezentacyjnych bazach danych, pojawia się problem automatycznej i powtarzalnej generalizacji.

Szwajcarska firma Kappasys opracowała dodatkowe funkcje do bazy PostGIS, dzięki którym możliwe stało się przeprowadzenie takiej generalizacji przy pomocy oprogramowania Open Source. Dostarczone są w postaci zwykłych skryptów w języku PL/SQL, dzięki czemu nie musimy nic kompilować ani instalować w systemie operacyjnym – wystarczy wykonać je w bazie, by uzyskać dostęp do funkcji.

Instalacja

Skrypty SQL dostępne są do pobrania ze strony Kappasys: http://www.kappasys.org/cms/index.php?id=65&L=5

Należy ściągnąć obydwa skrypty – cleanGeometry oraz aggregatePolygons. Następnie wykonujemy skrypty (użytkownik musi mieć prawa superużytkownika bazy, domyślnie jest to postgres):

psql -d <baza> -U  -h <serwer> -f cleanGeometry.sql
psql -d <baza> -U  -h <serwer> -f aggregatePolygons.sql

Postgres powinien odpowiedzieć „CREATE FUNCTION“ oraz „CREATE AGGREGATE“. Od tego momentu zyskujemy dostęp do funkcji.

Użycie 

Funkcja może być wywołana przy użyciu dowolnego interfejsu bazy danych, a więc linii komend, programu pgAdmin, wtyczki PostGIS Manager czy własnego programu.

Składnia funkcji jest następująca:

SELECT aggregatepolygons (<kolumna geometrii>,<odległość>,<kształt ortogonalny>) FROM 

Pierwszy argument jest to po prostu nazwa kolumny geometrii tabeli, w której znajdują się budynki, np. the_geom. Drugi – to maksymalna odległość między budynkami, poniżej której będą traktowane jako należące do jednego obszaru zabudowanego. Trzeci argument jest typu Boolean, czyli może mieć wartość true albo false i określa, czy wynikowe poligony mają mieć kształt geometryczny z dużą ilością kątów prostych, czy też dowolny. Przy wartości true wynik będzie bardziej zbliżony do reprezentacji na mapie topograficznej, zaś przy false będzie przypominał CORINE Land Cover. Poniżej przedstawiam przykładowe wyniki generalizacji dla różnych ustawień – z opcją ortogonalną i bez, przy różnych odległościach między budynkami.

Wyniki generalizacji za pomocą funkcji aggregatePolygons.

Jeżeli budynki mają przypisany atrybut określający ich wielkość, przeznaczenie itp. można dodać do zapytania klauzulę GROUP BY i otrzymać osobne poligony dla np. budynków przemysłowych i mieszkalnych lub jedno i wielorodzinnych.

[warning]Generalizacja tą metodą przebiega bardzo wolno i pożera dużą część zasobów procesora, dlatego stanowczo niewskazane jest używanie funkcji aggregatepolygons() w widokach albo dynamicznych Query Layers. [/warning]