Tag: EPSG

  • 2. Definiowanie warstw PostGIS / PostgreSQL

    Dzisiaj spróbujemy zdefiniować warstwę PostGIS w PostgreSQL

    Można to zrobić na kilka sposobów:

    • z poziomu pgAdmina (od zera)
    • z poziomu QGIS (od zera)
    • poprzez import danych w QGIS

    Dzisiaj będziemy to robić z poziomu pgAdmina, w następnym wpisie pokaże jak stworzyć lub zaimportować warstwy w QGIS.

    Czym jest układ współrzędnych (układ odniesienia)?

    Każda warstwa dodawana do bazy danych powinna mieć zdefiniowany układ współrzędnych. Jest to tzw układ odniesienia w terenie. Bez tego nie zlokalizujemy się w terenie, nie przeprowadzimy pomiarów i nie porównamy danych.

    Układy odniesienia

    W skrócie… ziemia nie jest kulą, a raczej mniej lub bardziej dokładną elipsoidą (geoidą) (https://pl.wikipedia.org/wiki/Geoida). Z uwagi na fakt że geoida jest pofałdowana i nierówna i odbiega od ideału elipsoidy, nie da się wyprowadzić idealnego wzoru na wyliczenie lokalizacji punktu na geoidzie.

    Wyróżniamy układy współrzednych:

    • Geographic Coordinate Systems (GCS)
      • opisują położenie punktów na elipsoidzie(ziemi)
      • do nich zaliczamy min. WGS84 (EPSG:4326) – używany w GPS
      • współrzędne podawane są w stopniach, długości i szerokości geograficznej
      • w zależności od szerokości geograficznej występują różnice w realnych metrach (nie jest to system do pomiarów)
    • Projected Coordinate Systems (PCS)
      • powstają z rzutowania powierzchni ziemi na płaską mapę.
      • do nich zaliczamy min. Polskie układy współrzędnych :
        • PUWG 1992 (EPSG:2180) – dla całej Polski
        • PUWG 2000 (EPSG:2176-2179) – podział na 4 strefy w celu lepszego odwzorowania punktu na mapie
      • współrzędne podawane są w metrach (szczegółowe pomiary)

    Praca autorstwa Radvid – Praca własna, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=3769616

    Dla Krakowa i okolic wybieramy (EPSG:2178), dla całej Polski (EPSG:2180). Część danych państwowych jest dostarczana w EPSG:2180, lokalne dane Krakowskie są w większości dostarczane w EPSG:2178.

    Pomijając wszystko co napisałem powyżej QGIS sam przeprowadza reprojekcje danych do układu Projektu (u mnie standardowo zdefinowanego w Ustawieniach na EPSG:2178), ale wydajniej jest robić wszystko w 1 układzie.

    Definiowanie warstw z poziomu pgAdmina, psql (tekstowy client sql)

    Jak już mamy wybrany układ współrzędnych dla naszych warstw testowych (2180), to spróbujmy teraz zdefiniować 3 warstwy(punktową , liniową i poligonową). Zalogujmy się więc do naszego pgAdmina.

    Otwórzmy Query Tool (Alt – Shift – Q) lub naciśnijmy odpowiedni przycisk na prawo od Object Explorer

    Będziemy definiować proste warstwy każdego typu i tworzyć im indeksy geometryczne (przyspiesza to odnajdowanie obiektów w przestrzeni, a w niektórych przypadkach jest konieczne do przeprowadzania obliczeń)

    Nasze warstwy będą zawiarały:

    • ID – unikalny identyfikator
    • Nazwa – tekst
    • geom – geometria
    -- Dodajmy warstwę punktową i tworzymy index geometryczny
    CREATE TABLE qgis.test_punkty (id SERIAL PRIMARY KEY, nazwa TEXT, geom geometry(Point, 2180));
    CREATE INDEX test_punkty_geom_idx ON qgis.test_punkty USING GIST(geom);
    -- Dodajmy warstwę liniową i tworzymy index geometryczny
    CREATE TABLE qgis.test_linie (id SERIAL PRIMARY KEY, nazwa TEXT, geom geometry(LineString, 2180));
    CREATE INDEX test_linie_geom_idx ON qgis.test_linie USING GIST(geom);
    -- Dodajemy warstwę poligonową i tworzymy index geometryczny
    CREATE TABLE qgis.test_poligony (id SERIAL PRIMARY KEY, nazwa TEXT, geom geometry(Polygon, 2180));
    CREATE INDEX test_poligony_geom_idx ON qgis.test_poligony USING GIST(geom);
    -- Jesteśmy (przynajmniej ja jako postgres, więc nadajmy użytkownikowi końcowemu (qgis) stosowne uprawnienia od odczytu, aktualizacji i usuwania
    GRANT ALL ON qgis.test_punkty TO qgis;
    GRANT ALL ON qgis.test_linie TO qgis;
    GRANT ALL ON qgis.test_poligony TO qgis;
    

    FIX: Dodajmy jeszcze prawa do Sekwencji czyli w tym przypadku mechanizmowi nadawania kolejnych ID na warstwach. Jako, że tworzymy tabele jako użytkownik postgres to musimy użytkownikowi końcowemu, czyli qgis, nadać prawa.

    GRANT ALL ON SEQUENCE qgis.test_punkty_id_seq TO qgis;
    GRANT ALL ON SEQUENCE qgis.test_linie_id_seq TO qgis;
    GRANT ALL ON SEQUENCE qgis.test_poligony_id_seq TO qgis;
    

    Teraz czas na QGIS

    Sprawdźmy teraz w QGIS czy możemy to już edytować

    Utwórzmy nowy projekt, wybierzmy układ współrzędnych projektu (1)

    Żeby zlokalizować się wstępnie na mapie musimy mieć jakiś punkt odniesienia. Ja wziąłem ogólnodostępne dane dotyczące Krakowa w formie WFS ze strony Miejskiego Systemu Informacji Przestrzennej, https://msip.krakow.pl/dataset/2643

    Kopiujemy : https://msip.um.krakow.pl/arcgis/services/Obserwatorium/Dzielnice/MapServer/WFSServer , otwieramy QGIS -> menu Warstwa -> Dodaj warstwę WFS / OGC API…

    Potem dodajemy nowe połączenie… Ok żeby zatwierdzić i klikamy Połącz

    a potem zaznaczamy każdą kolejną warstwę (ten dostawca dostarcza 2 warstwy) i klikamy Dodaj na dole ekranu. Na koniec Zamknij.

    Przy nowym projekcie QGIS przeniesie nas od razu do dodanej warstwy, w przypadku istniejącego projektu trzeba prawy klawisz na danej warstwie na Liście warstw i Powiększ do warstw(y)

    Teraz w końcu możemy zacząć dodawać nasze prywatne warstwy:

    Połączenie konfigurowane było we wpisie 1. Instalacja PostgreSQL i PostGIS . Wciskamy połącz, podajemy użytkownika i haslo (qgis i nasze nadane hasło). rozszerzamy strzałeczką i pojawiają nam sie nasze 3 puste warstwy

    Dodajemy kolejno każdą z nich, Zaznaczając i Dodaj. i zamykamy. Ustawiamy sobie kolejność warstw na mapie aby warstwy poligonowe nie zasłaniały nam liniowych i punktowych (w panelu Warstwy) przeciągając odpowiednio.

    Zaznaczamy warstwę którą chcemy edytować, włączamy edycje warstwy (patrz pkt 1 na obrazku poniżej), a potem już możemy dodawać punkty (patrz pkt 2)

    Ja dodam kilka punktów, id punktu będzie się samo nadawało, nazwę podajemy wg uznania.

    Na koniec wyłączamy tryb edycji i zatwierdzamy zmiany, dopiero wtedy dane są zapisywane w PostgreSQL

    Tak samo dodajemy linie i poligony , zakańczając prawym klawiszem

    Skopiujmy jeszcze na próbę jeden obiekt z Dzielnic. Przechodzimy na warstwę Dzielnice, zaznaczamy narzędziem zaznaczania a potem kopiujemy, przechodzimy na naszą warstwę Poligony, oczywiście włączając tryb edycji i wklejamy na próbę.

    Jak wyłączymy edycję, zatwierdzimy zmiany i odznaczymy wszystkie obiekty uzyskujemy :

    Zatem udało się nam wkleić obiekt zewnętrzny do naszej warstwy testowej. I na tym zakończymy ten wpis.

    Podsumowanie:

    • Przebrnęliśmy przez nudną teorię dot. układów współrzędnych
    • Zdefiniowaliśmy próbne warstwy punktowe, liniowe, poligonowe, z poziomu pgAdmin
    • Utworzyliśmy nowy projekt testowy i ustawiliśmy jego układ współrzędnych
    • Dodaliśmy warstwy odniesienia (tutaj granice Krakowa) żeby móc przenieść się w granice naszego układu
    • Dodaliśmy do QGIS nasze warstwy, oraz testowe obiekty
    • Skopiowaliśmy obiekt z warstwy odniesienia

    Zapraszam do komentarzy