Tag: POSTGIS

  • 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

  • 1. Instalacja PostgreSQL i PostGIS

    Do instalacji modułu PostGIS mamy wiele możliwości:

    Ja wybrałem wersje https://www.enterprisedb.com/downloads/postgres-postgresql-downloads, wersja ta zawiera Stack Builder (który pomaga doinstalować moduły do PostgreSQL)

    Ściągamy zatem wersje Windows x86-64 i instalujemy.

    Wybieramy lokalizacje instalacji, hasło dla administacyjnego usera postgres-a (zapamietajmy je) i port (jak nie mamy więcej instancji postrgresa to zostawmy default). Potem baza zaczyna sie instalować.

    Po zakończeniu instalacji wybieramy aby uruchomiło nam Stack Buildera

    Stack Builder poprosi nas o wybranie instalacji Postgres którą chcemy „modyfikować”, wybieramy naszą.

    a potem doznaczamy co Stack Builder ma nam doinstalować (u nas PostGIS).

    następnie wybieramy download directory (u mnie default user dir), to jest folder do którego zostaną ściągniete pliki instalacyjne.

    Po naciśnięciu Next, czekamy (u mnie trwało to trochę zanim wogóle zaczęło się sciągać, proszę nie panikować).

    Następnie musimy przeprowadzić instalacje ściągniętych modułów

    Kolejno (I agree) o ile zgadzamy się z licencją …

    Next (wybór komponentów) i Next (wybór lokalizacji instalacji, default w folderze Postgres-a) w kolejnych krokach, potem Close w ostatnim.

    Teraz możemy wrócić do Stack Buildera i nacisnąć Finish

    No i mamy juz działającego PostgreSQL z zainstalowanym modułem postGIS.

    Wejdźmy teraz do pgAdmina (tutaj 4)

    wybieramy naszą bazę i podajemy do niej hasło (u mnie jest więcej baz, nas interesuje aktualnie PostgreSQL 17)

    Potem wybieramy żółte pole, to otworzy nam Query Tool , okienko gdzie będziemy sie porozumiewać z posgreSQL, wpisujemy

     CREATE EXTENSION postgis; 
    
    

    i klikamy w strzałkę powyżej. (Execute Script). To instaluje nam w bazie funkcje postGIS.

    Następnie możemy sprawdzić czy postGIS został poprawnie zainstalowany poprzez wpisanie i uruchomienie skryptu jak powyżej:

    SELECT PostGIS_Full_Version();
    
    

    Zwróci to nam Dane w Data Output poniżej.

    Ok, utwórzmy teraz nowego usera „qgis” , który będzie mogł grzebać tylko w swoim scheme (obszarze, schemacie), ale też będzię mógł korzystać z dobrodziejstw postgis-a, Najcześciej tworzy się schematy z tą samą nazwą co user, więc stworzymy usera i schemat „qgis”, i nadamy mu uprawnienia.

    Wykonujemy (Execute script [F5]) poniższe

    -- tworzymy usera qgis i nadajemy mu haslo
    CREATE USER qgis WITH PASSWORD 'qpass'; 
    -- tworzymy miejsce pracy usera
    CREATE SCHEMA AUTHORIZATION qgis; 
    -- zezwalamy zeby nasz nowy user mogl sie logowac do bazy
    GRANT CONNECT ON DATABASE postgres TO qgis; 
    -- zezwalamy zeby nasz nowy user mogl korzystac z publicznej schema, 
    -- tam sa min zainstalowane funkcje postgisa
    GRANT USAGE ON SCHEMA public TO qgis; 
    GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO qgis;
    GRANT ALL ON geometry_columns TO qgis;
    GRANT ALL ON spatial_ref_sys TO qgis;
    
    

    Teraz w teorii moglibyśmy się już zalogować z poziomu QGIS i sprawdzić czy serwer zezwala nam na połączenie.

    Wpisujemy nasze dane logowania

    • Nazwa : dowolna nazwa rozpoznawalna dla nas, nie zalecam spacji
    • Usługa : nie definiowalismy danych usługi, pozostawiamy puste
    • Host : u nas localhost (baza lokalna)
    • Port : o ile podczas instalacji nie zmienilismy to port bedzie default 5432
    • Baza danych : postgres (defaultowa nazwa)

    Potem klikamy Test Połączenia i podajemy naszego user/pass i klikamy OK

    Teraz mozemy kliknac OK, połączenie zostało zdefinowane a QGIS już je dodał do listy.

    Definowaniem tabel i warstw zajmiemy się w nastepnym wpisie.

    Co dzisiaj zrobilismy:

    • Zainstalowalismy na Windows 11 lokalny serwer PostgreSQL
    • Zainstalowaliśmy i aktywowaliśmy moduł postGIS
    • Stworzylismy usera i scheme dla naszego usera
    • Nadaliśmy mu uprawnienia żeby mógł się łączyć i korzystać z dobrodziejstw postGIS
    • Skonfigurowaliśmy połączenie z postgreSQL w QGIS

    Czego nie zrobiliśmy:

    • nic nie zrobiliśmy w kwestiach bezpieczenstwa, zakładam że będzie to lokalna testowa baza danych do nauki
    • zalecam tez wybranie innego niz 'qpass’ hasla 🙂