Zarządzanie Danymi Przestrzennymi

Ćwiczenie 3 - PostGIS - dane z pliku csv, konwersja współrzędnych, indeksy, proste zapytania

Dane z pliku csv

Jednym ze sposóbów wprowadzania danych do bazy przestrzennej jest wykorzystanie pliku tekstowego (csv), w którym jedna lub więcej kolumn przechowuje współrzędne geograficzne. Najprostszy przypadek to taki, gdzie każdy rząd bazy reprezentuje pojedynczy obiekt np. punkt, tak jak ma to miejsce w przypadku bazy nazw geograficznych z serwisu Geonames z jaką mieliśmy do czynienia na pierwszych zajęciach.

Sposób postępowania w takim wypadku jest podobne do tworzenia nowej tabeli - nalezy dodać jedną lub więcej kolumn geometrii. Następnym krokiem jest wpisanie do kolumny geometrii danych geograficznych. Przykładow, mając kolumny ze współrzędnymi 'longitude' i 'latitude', możemy sobie wyobrazić punkt w notacji WKT jako:

POINT('longitude' 'latitude')

Polecenie przekształcające punkt do formatu kolumny geometrii jest identyczne jak w poprzednim ćwiczeniu:

ST_GeomFromText('POINT('longitude' 'latitude')',SRID)

Tak przygotowane polecenie może być użyte do aktualizacji kolumny (UPDATE), przy czym nalezy zwrócić uwagę na konieczne modyfikacje skladni polecenia w postaci znaków konkatenacji ("II"):

UPDATE tabela SET kolumna=ST_GeomFromText('POINT('||longitude||' '||latitude||')',SRID);

Należy pamietać, iż w przypadku geometrii wszelkie operacje winny być dokonywane na współrzędnych płaskich. Dokonywanie transformacji "w locie" jest jak najbardziej możliwe ale nieefektywne. Takiej transformacji można dokonać juz na etapie wprowadzania danych. Do konwersji służy funkcja:

ST_Transform(obiekt,SRID)

Nie obligatoryjną, ale wskazaną czynnością po stworzeniu bazy jest zadbanie o odpowiednie indeksy przestrzenne. Co do zasad ich konstrukcji i zasadności istnienia, należy stosować te same wytyczne jak w przypadku zwykłych danych. Indeksacja kolumn przestrzennych odbywa sie przy pomocy GIST (Generalized Search Tree), przy pomocy polecenia:

CREATE INDEX nazwa_indeksu ON nazwa_tabeli USING gist(kolumna_przestrzenna)

ZADANIE 3.1: W bazie danych "gis_baza" utwórz tabelę "nazwy_pl" i wczytaj do niej dane z serwisu Geonames (plik PL.csv). Wykorzystując dane z tabeli utwórz kolumnę z obiektami punktowymi dla każdej nazwy. Zadbaj o to aby posiadały współrzędne w układzie 1992. Utwórz indeks przestrzenny dla odpowiedniej kolumny.

Proste zapytania przestrzenne

Mając dane w postaci tabeli przestrzennej można zastować całą gamę funkcji wykorzystujących informacje lokalizacyjną. Przykładowo, zakres przestrzenny danych pozwala określić funkcja:

ST_Extent(geometria)

Niektóre inne funkcje:

ST_Contains(geom1,geom2)
zwraca prawdę, jeśli geometria "geom1" zawiera wewnątrz gemoetrię "geom2"
ST_Distance(geom1,geom2)
zwraca najkrótszy dystans
ST_Area(geom1)
zwraca najkrótszy dystans
ST_DWithin(geom1,geom2,dystans)
przybiera wartość prawdy, jeśli geometrie znajdują się bliżej siebie niż określony dystans
ST_Touches(geom1,geom2)
przybiera wartość prawdy, jeśli geometrie są styczne przestrzennie

Oprócz funkcji PostGIS przyjmuje też operatory (patrz niżej). Są one wygodne i szybsze niż analogiczne funkcje, gdyż porównują Bounding Box obiektów przestrzennych. Jednak powoduje to, iż nie da się przy ich pomocy dokonywać dokładnych operacji na obiektach. Przykładowe operatory to:

A && B
A pokrywa się z B
A @ B
A zawiera się całkowicie w B
A ~= B
oba obiekty są identyczne
A >> B
A leży na prawo od B

Przydatny spis funkcji i operatorów można znaleźć pod linkiem: http://www.bostongis.com/postgis_quickguide.bqg.


ZADANIE 3.2:
1. Ściagnij plik shapefile zawierający poligony województw http://earthisflat.net/download/dydaktyka/POL_adm_92.tar.gz. Umieść go w bazie danych "gis_baza".
2. Porównaj zasięg przestrzenny obiektów punktowych przydzielonych do województwa wielkopolskiego (admin1_code=86) w tabeli "nazwy_pl", z zasięgiem przestrzennym poligonu z pliku shapefile. Skąd biorą się różnice?
3. Wydziel wszystkie punkty z tabeli "nazwy_pl" znajdujące się obrębie Bounding Box województwa wielkopolskiego.
4. Znajdź i wydziel wszystkie województwa sąsiadujące z Wielkopolskim. 4. Znajdź i wydziel wszystkie nazwy geograficzne w promieniu 10 km od miasta Poznań (Wlkp).

Autor: Michał Rzeszewski, Instytut Geokologii i Geoinformacji, UAM Poznań, mail: mrzeszewski@gmail.com
Creative Commons License
Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Na tych samych warunkach 2.5 Polska.