Reprojekcja warstw w PostGIS

W dzisiejszym poście zaprezentujemy Wam jak używać funkcji reprojekcji danych wektorowych w bazie PostgreSQL/PostGIS. Wykorzystamy do tego warstwę kolej z poprzednich postów, którą możecie pobrać tutaj. W przypadku gdy ten post jest Waszą pierwszą przygodą z PostgreSQL odsyłamy do naszych wcześniejszych wpisów, gdzie pokazujemy jak zainstalować bazę i wgrać do niej dane.

Po wgraniu warstwy do bazy w pierwszej kolejności sprawdzamy jaki układ został dla niej zdefiniowany. Służy do tego funkcja ST_SRID(), gdzie między nawiasami wstawiamy kolumnę z geometrią:

W wyniku zapytania otrzymujemy informację o układzie współrzędnych (kod EPSG) dopisanym do warstwy. W naszym przypadku jest to 2180, czyli układ PUWG 1992.

Dane dla układów współrzędnych w bazie PostgreSQL/PostGIS są przechowywane w tabeli spatial_ref_sys. Korzystając z zapytań SQL możemy przeglądać rekordy tabeli, np.:

w wyniku którego otrzymujemy rekord dotyczący PUWG 1992:

Zapis układu w standardzie proj4 jest przechowywany w kolumnie proj4text:

Wszystko jest w porządku do momentu, gdy układ jest przypisany poprawnie. Co zrobić, gdy nie mamy przypisanego układu (wartość 0) lub jest on błędny? Wiedząc jaki jest docelowy układ warstwy sprawa jest prosta, ale co zrobić jeśli nie wiemy nic o układzie naszych danych? Musimy skorzystać z kolumny geom gdzie zapisana jest geometria obiektów i na jej podstawie spróbować określić układ. Zapytanie SQL:

Zwraca nam jednak wartość obiektów geometryczny w postaci przechowywanej w bazie danych:

Czytelną wersję zapisu obiektu otrzymamy korzystając z komendy ST_AsText()

zwracającej obiekt geometryczny w formacie WKT (Well-known Text):

Wiedząc już w jakim układzie współrzędnych przedstawione są nasze dane możemy przypisać im kod EPSG korzystając z funkcji ST_SetSRID(). Funkcja ta jedynie zmienia przypisanie układu do warstwy, a nie przeprowadza reprojekcji geometrii. Widać to najlepiej gdy dodatkowo wywołamy funkcję ST_SRID():

SRID przypisany dla warstwy to 4326. Wywołując dodatkowo ST_AsText():

widzimy że w wyniku działania funkcji ST_SetSRID() mamy współrzędne w układzie PUWG 1992:

Do warstwy przypisany został tylko nowy SRID. Funkcja ta nadaje się tylko do poprawy błędnego przypisania układu. Chcąc przeprowadzić reprojekcję musimy skorzystać z funkcji ST_Transform():

Sprawdźmy jak będą wyglądały współrzędne obiektów warstwy po zastosowaniu dodatkowo funkcji ST_AsText():

Geometria została przetransformowana do nowego układu:

Funkcje ST_SetSRID() i ST_Tranform() stosujemy w jednym zapytaniu w przypadku, gdy chcielibyśmy przeprowadzić reprojekcję warstwy dla której nie mamy zdefiniowanego SRID:

Dla słabo zaznajomionych ze składnią języka SQL niezrozumiałym na pewno jest występujące często na końcu zapytania wyrażenie LIMIT 1. Używamy go do zwrotu przez zapytanie tylko jednego wyniku. Liczba 1 określa liczbę zwracanych wyników.

W poście zapoznaliście się z czterema nowymi funkcjami z których możecie skorzystać w PostgreSQL/PostGIS:

ST_SRID(geometry geom) – zwraca układ w postaci kodu EPSG przypisany do geometrii warstwy

ST_SetSRID(geometry geom, integer srid) – przypisuje nowy układ (srid) do geometrii warstwy

ST_Transform(geometry geom, integer srid) – zwraca nową geometrię z współrzędnymi transformowany do nowego układu (srid)

ST_AsText(geometry geom) – zwraca geometrię obiektów warstwy w formacie WKT (Well-known text)

Testujcie, a jednocześnie uczcie się nowo poznanych funkcji na Waszych danych:)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Translate using Google Translate»
Social media & sharing icons powered by UltimatelySocial

Podoba Ci się nasza strona? Odwiedź nasz profil