Własny interaktywny atlas gminy - od luźnego pomysłu po klęskę urodzaju

Własny interaktywny atlas gminy - od koncepcji po klęskę urodzaju


Dzień dobry.

To mój pierwszy post na forum i zacznę od razu z grubej rury. Zachęcony przez Jakuba Kaczorowskiego na PGU QGIS na Facebooku chciałbym opisać rozwijany przez siebie prywatny, niekomercyjny i czysto hobbystyczny projekt pod nazwą Interaktywny atlas gminy Mieroszów, dostępny pod adresem mapa.kowalowa.eu. Proszę wybaczyć, że gdzieniegdzie w tym tekscie wykorzystam fragmenty postu z Facebooka.

W największym skrócie: atlas składa się z 51 warstw (stan na dzień pisania tego postu), podzielonych na 10 kategorii, które opiszę dalej. Większość warstw ma suwak przezroczystości, niektóre umożliwiają uzyskanie efektu negatywu - wszystko po to, by w miarę łatwo, przy pewnej wprawie (którą bywalcy tego forum na pewno mają, ale nietechniczny użytkownik niekoniecznie) “upiec” swoją własną kompozycję mapową.

Jak wskazuje nazwa, atlas jest skoncentrowany na gminie Mieroszów, położonej w województwie dolnośląskim, przy granicy z Republiką Czeską. Powierzchnia gminy to 76 km kw. Gmina leży w Sudetach Środkowych (Góry Kamienne i Suche oraz Zawory - zachodnia część Gór Stołowych). Przez cały obszar przepływa rzeka Ścinawka, która jako jedyna znana mi większa rzeka ma źródło w Polsce, środkowy bieg w Czechach, i dolny bieg ponownie w Polsce; jest dopływem Nysy Kłodzkiej, a ta z kolei Odry.

Małe zastrzeżenie: nie chciałem tworzyć kolejnej kopii Geoportal.gov.pl i po prostu podłączyć “nudnych” warstw WMS czy WMTS typu sieć drogowa, punkty adresowe i ortofotomapa. Jednym z podstawowych założeń była różnorodność objętych nim tematów - od rzeźby terenu, przez historię, geologię, sieć hydrograficzną po ochronę przyrody - i maksymalne uniezależnienie atlasu od zewnętrznych serwisów i usług.

Całość zajmuje ok 1,7 GB i działa na hostingu współdzielonym. Żadnych skomplikowanych zależności, żadnych skryptów Pythona działających w tle - podstawą atlasu jest biblioteka Leaflet, zamknięta w jednym pliku HTML (ok. 100 kB). Do tego kilka pomocniczych skryptów PHP i jeden JS, konieczne do działania biblioteki JS podpięte w <head>, kilkanaście plików GeoJSON i prawie pół miliona kafli w formatach PNG i WEBP :slight_smile:

Geneza projektu

Tak jak wspomniałem w poście na Facebooku, nie kończyłem żadnych studiów ani kursów związanych z GIS. Z wykształcenia i poniekąd zawodu jestem astronomem (ale nie pracuję naukowo), więc może to tłumaczy moje zamiłowanie do cyfr, wykresów i analizy obrazów. Mój pierwszy kontakt z QGIS musiał jednak nastąpić bardzo wcześnie, bo pamiętam go jeszcze pod nazwą Quantum GIS i z dość topornym interfejsem :slight_smile:

Kilka lat temu zacząłem ponownie bawić się GIS (z naciskiem na “bawić”) i w ten sposób zabawa dość szybko zamieniała się w podziw, że z jednej paczki danych czy pliku GeoTIFF można wyciągnąć mnóstwo różnych informacji. Do tego lubię mapy - była taka chwila, że miałem w domu prawie dwa tysiące arkuszy tzw. powiatówek, uratowanych przed przemiałem, plus całkiem spora kolekcja innych.

W temat obróbki danych kartograficznych, głównie NMT, wszedłem poważniej na przełomie 2023 i 2024 r., gdy w literaturze archeologicznej trafiłem na bardzo skąpe informacje o pozostałościach pruskich fortyfikacji z XVIII w. w mojej okolicy (wieś Kowalowa w gminie Mieroszów), a na standardowym NMT w Geoportalu było je ledwo widać. Chciałem spróbować “wydłubać” z nich więcej na własną rękę, a to wymagało podszkolenia w różnych algorytmach i funkcjach QGIS i tym, co jest jego silnikiem, głównie GDAL. Tworzyłem różne warstwy tymczasowe i kolejnymi iteracjami, korzystając z wtyczek QGIS i podręczników do nich, starałem się wyciągnąć jak najwięcej z dostępnych danych, na początku głównie NMT. Ponieważ interesuje mnie również hydrologia i geologia okolicy (plus meteorologia, ale do tego jeszcze QGIS nie zaprzągłem), poszedłem i w tym kierunku.

hillshade-porownanie

Zapewne każdy, kto pracuje z QGIS wie, że w trakcie pracy powstają całe stosy tymczasowych warstw, które czasami szkoda usunąć, bo “mogą się przydać”, no i w ten sposób w kilkunastu katalogach i podkatalogach zgromadziłem dziesiątki takich “tymczasowych” plików, liczących łącznie dziesiątki gigabajtów. Dobrze, że pamięć dyskowa jest stosunkowo tania :slight_smile: Składałem je oczywiście w QGIS, tworząc kolejne grupy i podgrupy, i w końcu było tych warstw - lokalnych i zdalnych - prawie sto. W końcu zrobiłem porządki, bo projekt przy otwieraniu już mocno mulił, ale przy tej okazji pomyślałem, że może warto byłoby mieć to offline, na potrzeby wizyt w terenie (czyli włóczenia się po okolicy). No i w ten sposób, dokładając jedną warstwę po drugiej, stworzyłem coś, co było już używalne i można było zaprezentować to światu - chociaż tak jak napisałem na wstępie, projekt jest z premedytacją ograniczony terytorialnie. Głównie ze względu na nakład pracy, jaki włożyłem w przygotowanie warstw (sądzę, że przez kilka lat uzbierałoby się kilkaset godzin, licząc z wcześniejszymi eksperymentami, kiedy jeszcze nie myślałem, że będzie z tego coś większego, i byłem skupiony na wirtualnym “wykopywaniu” fortyfikacji z danych lidarowych).

Architektura i ewolucja od mapy do atlasu

Dokładając kolejne warstwy dość szybko zacząłem się gubić w zmianach i poprawkach, więc na szybko stworzyłem w formacie Markdown coś w rodzaju publicznego changelogu, dostępnego w tym miejscu. Pokazuje on przyrost objętości atlasu (początkowo nazywanego po prostu mapą) w bardzo krótkim czasie - od pierwszej wersji publicznej w połowie lipca do teraz, czyli w sumie przez trzy tygodnie, projekt “spuchł” z początkowych 17 warstw do 51 :slight_smile:

W zbudowaniu szkieletu pomógł mi Claude, ale większość dłubaniny w danych to już ręczna robota. Kod źródłowy nie jest co prawda publiczny (w znaczeniu - brak repozytorium np. na Githubie), ale sam plik index.html mówi sporo, jeśli ktoś będzie miał ochotę rzucić okiem na mój twórczy chaos :slight_smile:

Ponieważ od czasu studiów (druga połowa lat 90.) używam Linuksa - najpierw z ciekawości, a od mniej więcej 2000 r. z wyboru jako jedyny system operacyjny - bardzo bliska jest mi filozofia open source, zarówno jeśli chodzi o oprogramowanie, jak i różne projekty, w których mniej lub bardziej się udzielam - na przykład edycja OpenStreetMap, by pozostać przy tematach mapowych. Nie jest zatem dziwne, że cały projekt powstaje przy użyciu wolnego oprogramowania i publicznych zasobów danych, najchętniej na wolnych licencjach.

Konstrukcja atlasu powstawała często ad hoc - miałem pomysł na jakąś warstwę, miałem pliki źródłowe albo pośrednie, pozostawało je przetworzyć, ewentualnie metodą prób i błędów nałożyć kilka na siebie, zmieszać i obserwować, co z tych eksperymentów wychodzi. Wraz z dodawanymi warstwami (“kartami”) rosła liczba kategorii (“rozdziałów”), a także ich kolejność - zarówno na rozwijanej liście, jak i przy planowaniu, które warstwy mają się wyświetlać wyżej, a które niżej.

Korzystając z QGIS pobierałem niektóre warstwy w zadanym “pudełku” (np. standardową ortofotomapę czy niemal wszystkie warstwy rastrowe), przycinałem do granicy gminy pobranej z OpenStreetMap i ciąłem na kafle XYZ. W ten sposób przeniosłem na swój serwer to, co mogłem i potrafiłem, żeby działało “lokalnie” - lokalnie w tym znaczeniu, że kafle serwuje serwer dostawcy mojego hostingu, a nie że jest to proste podłączenie obcej usługi typu WMS. I rzeczywiście działa to wyraźnie szybciej niż opieranie się w całości na czytaniu kafli ze zdalnych serwerów, które czasami zawodzą - robiłem testy polowe, gdy ta sama treść była wczytywana z mojego hostingu oraz z serwera WMS/WMTS, i wersja “lokalna” działała zdecydowanie płynniej.

Kategorie i warstwy

Najwyższy czas na prezentację treści atlasu. Nazwy kategorii podaję w brzmieniu takim, jakie jest na liście warstw w atlasie - starałem się, by były na pierwszy rzut oka zrozumiałe dla nietechnicznego i niemapowego użytkownika. Zachęcam oczywiście do samodzielnej eksploracji, bo jedna mapa mówi więcej niż tysiąc słów (czy jakoś tak).

  • Podkład: OpenStreetMap (Carto i Mapy.com)

  • Granice i nazwy:

  • Granice gminy i poszczególnych miejscowości (wzięte z OpenStreetMap),
  • Nazwy geograficzne (PRNG),
  • Kategorie własności gruntów
  • Rzeźba i pokrycie terenu:
  • NMT w moim autorskim opracowaniu (w terminologii angielskojęzycznej DEM), o którym będzie mowa niżej
  • NMT z efektem oświetlenia RGB (tzw. multi hillshade)
  • NMPT (zwykły i znormalizowany - DSM i nDSM)
  • Warstwice (w cięciu co 5 m, etykietowane co 25 m - uwaga na marginesie: to jedyna warstwa w formacie PMTiles)
  • Hipsometria (dwie wersje, nazywane przeze mnie klasyczną i marsjańską)
  • Geomorfologia (moja ulubiona warstwa, mogę po niej błądzić bez przerwy. A gdy dołoży się do niej hipsometrię marsjańską, naprawdę można się poczuć jak przy oglądaniu obcej planety. Znowu wyłazi ze mnie astronom :))
  • Korony drzew (w terminologii angielskojęzycznej CHM); inspiracją dla tej warstwy była Krajowa Mapa Koron Drzew - polecam, jeśli ktoś nie zna tego projektu
  • Szczyty górskie na podstawie pomiarów lidarowych
  • Mgła w dolinach - mały dodatek estetyczny, bez żadnego praktycznego zastosowania
  • Woda i atmosfera:
  • Sieć Meteo.Mieroszów - kolejny z moich pomysłów: zebrane w jednym miejscu aktualne dane z prywatnych stacji meteo w gminie, dostępne pod adresami https://wx.kowalowa.eu (karty stacji) i https://wx.kowalowa.eu/mapa(mapa gminy)
  • Sieć rzeczna (celowo nie użyłem pojęcia “Hydrografia”, żeby nie straszyć użytkownika; to faktyczne i potencjalne drogi spływu wody w mojej interpretacji, pozyskane z NMT)
  • Rzeki/potoki/strumienie (to samo co wyżej, ale w wersji Wód Polskich)
  • Zlewnie
  • Zagrożenie powodzią
  • Ochrona przyrody:
  • Pomniki przyrody
  • Inne formy ochrony przyrody
  • Proponowane rezerwaty (propozycje RDOŚ we Wrocławiu - bardzo gorący temat lokalny)
  • Turystyka:
  • Szlaki turystyczne (z podziałem na piesze i rowerowe, oficjalne od PTTK i lokalne - gminne i LP)
  • Infrastruktura turystyczna (głównie wiaty na szlakach)
  • Mapy historyczne:
  • Archiwalne mapy topograficzne (polskie od GUGiK i niemieckie Messtischblatty, które na Dolnym Śląsku i ogólnie na Ziemiach Pozyskanych są bezcennym źródłem informacji o historii i topografii)
  • różne mapy i plany z najbliższej okolicy - fortyfikacje we wsi Kowalowa z czasów tzw. wojny kartoflanej (1778), uzdrowisko Sokołowsko w dwóch wersjach (z 1887 r., z okresu największego rozkwitu, gdy miejscowść nazywała się Görbersdorf, oraz z 1989 r., z czasów rozpoczynającego się upadku i stagnacji), plany rozwoju Mieroszowa, ówczesnego Friedlandu (1926)
  • Zdjęcia lotnicze:
  • Ortofotomapa standardowa (aktualność 2025)
  • Ortofotomapa wysokiej rozdzielczości (aktualność 2013)
  • Ortofotomapa w podczerwieni (aktualność 2025)
  • Ortofotomapa czechosłowacka (archiwalna, czarno-biała, z lat 50.)
  • Lasy Państwowe (BDL):
  • Podział lasu
  • Zakazy wstępu
  • Zagrożenie pożarowe
  • Własność lasów (prywatne, gminne itd.)
  • Geologia:
  • Szczegółowa Mapa Geologiczna Sudetów (w skrócie SMGS, skala 1:25000)
  • Geologische Karte von Preussen (w skrócie GKP25, skala 1:25000)

Dodatkowo atlas wyposażony jest w kilka przydatnych narzędzi:

  • Aktualna pozycja w terenie (lokalizacja ograniczona do gminy i najbliższej okolicy, chociaż dla wtajemniczonych jest też możliwość lokalizacji w czasie rzeczywistym)
  • Profil trasy - rysowanie dowolnej linii, niekoniecznie po drogach i ścieżkach, i odczyt profilu wysokościowego
  • Siatka geograficzna i kilometrowa

Ostatnim narzędziem, a właściwie dodatkiem do atlasu, jest przewodnik uruchamiany podczas pierwszego wejścia na stronę i w dowolnym momencie później, po kliknięciu w przycisk ze znakiem zapytania. Spokojnie, jest nienachalny - wystarczy kliknąć w dowolnym miejscu ekranu poza okienkiem przewodnika, żeby się go pozbyć.

Każda warstwa zaopatrzona jest w przycisk i, pod którymi kryje się informacja o treści warstwy, jej źródle i ewentualnych ograniczeniach. Wiele warstw ma również oznaczenie L, czyli dostęp do legendy.

Warsztat (w dużym skrócie)

Pracuję na starym, 13-letnim laptopie Dell Latitude E6540. Pomimo wieku jest to całkiem żwawa maszynka, ale jej największą bolączką jest ograniczenie pamięci RAM do 16 GB - nic nie da się z tym zrobić, to kwestia BIOS. Procesor Intel i7 (4 rdzenie, 8 wątków). Dwa dyski SSD po 1 TB każdy (jeden dysk siedzi w zmodyfikowanej kieszeni w miejscu napędu DVD). Korzystam ze zintegrowanej grafiki HD Graphics 4600. Jest też drugie GPU (AMD Radeon), ale w zasadzie go nie używam. Całość działa pod kontrolą Kubuntu (aktualnie 26.04).

Od strony oprogramowania podstawą jest QGIS 3.44 - do 4.0 jeszcze się nie przekonałem. Do tego garść skryptów Pythona automatyzujących powtarzalne czynności (np. konwersje czy cięcie na kafle) i Basha.

Jeśli chodzi o wtyczki do QGIS, to najbardziej efektywna okazała się, znana na pewno wielu osobom na forum, RVT (Relief Visualization Toolbox). Z początku nie wiedziałem, jak się nią posługiwać, i błądziłem po omacku, ale gdy już osiągnąłem pierwsze sensowne efekty, RVT okazał się prawdziwym “czarnym koniem”. To dzięki niemu uzyskałem tak wyraźny NMT, który z kolei był bazą dla innych map, na przykład geomorfologii, która wydobywa z terenu takie szczegóły, że szczęka mi opadła :slight_smile:

Mapa koron drzew (Canopy Height Model)

Wspomniałem, że zainspirowała mnie Krajowa Mapa Koron Drzew (KMKD), na którą kiedyś trafiłem. Kolejność była taka - najpierw zachwyciłem się NMT i tym, co można z niego wyciągnąć. Póżniej doszedł NMPT, który spowodował, że teren ożył i stał się bardziej plastyczny. Później przyszło zastanowienie - a gdyby tak odjąć NMT od NMPT? Wtedy się dowiedziałem, że ktoś już wpadł na ten sam pomysł, nawet wiele razy, i nazywa się to znormalizowany NMPT :wink: Efekt był fajny, więc drążyłem dalej. I w ten sposób, z wydatną pomocą Claude, doszedłem do jednej z najciekawszych warstw w atlasie, czyli mapy koron drzew, pozyskanej bezpośrednio z chmury punktów z lidaru. Są na niej wszystkie drzewa, które w październiku 2021 r. (wtedy zbierano dane w mojej okolicy) miały wysokość 4 m - taką wartość przyjąłem za KMKD.

Trzeba było oczywiście zrobić małą kontrolę jakości pod kątem podejrzanie wysokich i bardzo punktowych “drzew”, którymi w kilku przypadkach były wieże BTS. Na szczęście w gminie jest ich tylko kilka, niezbyt wysokie wieże dwóch kościołów i jeden wyższy komin (mówię o danych cyfrowych, bo w rzeczywiści komin wyburzono kilka miesięcy temu).

Mapy historyczne - droga przez georeferencję

Zdecydowana większość materiałów archiwalnych (Messtischblatty, Geologische Karte von Preussen, SMGS, stare plany) wymagała ręcznej georeferencji w QGIS. Każdy, kto przez to przechodził wie, jaka to żmudna i czasochłonna praca, ale jeśli efekty są zadowalające, daje dużo satysfakcji. Wszystkich arkuszy, które musiałem poddać georeferencji, było około 20 - z różnych epok, w różnym stanie, technice druku, stopniu czytelności i innych cechach wpływających na łatwość (albo trudność) całego procesu. Kolejnym krokiem było uczenie się na błędach, którą metodę dopasowania dla której serii map wybrać, jakiego algorytmu resamplingu użyć, dobór układu współrzędnych i inne atrakcje :slight_smile:

Materiały źródłowe pochodzą z różnych miejsc - część pobrałem z GUGiK za pomocą funkcji eksportu określonego obszaru warstwy do pliku. Inne z ogólnodostępnych repozytoriów map w Polsce i za granicą. Po niektóre sięgałem do bibliotek cyfrowych. Jedną pozyskałem w formie skanu z Biblioteki Państwowej w Berlinie. Kolejną z Archiwum Państwowego we Wrocławiu. Jeszcze inną z Narodowego Instytutu Dziedzictwa. Mapę geologiczną Sudetów mam częściowo z Państwowego Instytutu Geologicznego, a częściowo od zaprzyjaźnionego geologa. Proces zdobywania tych materiałów to epopeja sama w sobie. Ale wszystkie są pozyskane legalnie, to dla mnie ważne.

Ślepe zaułki

Nie wszystko się udało. Ponieważ dla mojej gminy nie ma opracowanych map zagrożenia powodziowego (MZP) i map ryzyka powodziowego (MRP), a jedynie bardzo ogólna wstępna ocena ryzyka powodziowego (WORP) od Wód Polskich, próbowałem samodzielnie zbudować mapę zagrożenia powodziowego, bazując na NMT i pakiecie Whitebox Tools, który podsunął mi Claude. Ale moja wiedza w tej dziedzinie jest zbyt mała, żebym mógł do niej “doskoczyć”. Może kiedyś wrócę do tego tematu.

Plany na przyszłość

Nie wiem :slight_smile: Pewnie kolejne warstwy… Gdy zostaną zebrane i opublikowane świeże dane z lidaru, spróbuję przebudować NMPT i warstwy pochodne, w tym mapę koron drzew. Być może uda mi się dzięki zrobić porównanie - drzewa w 2021 r. i później: gdzie las urósł, a gdzie i ile naprawdę go wycięto (bo leśnicy mają w moich okolicach szerokie pole do popisu - około 40% gminy zajmują lasy). Być może dołożę zdjęcia niektórych miejsc, z ziemi i z drona, którym dysponuje znajomy. Nie chcę rzecz jasna tworzyć własnej ortofotomapy, ale niektóre miejsca są tak ciekawe, że dobrze byłoby pokazać je z różnej perspektywy.

Podsumowanie

Nie twierdzę, że swoją pracą odkrywam Amerykę. Wręcz przeciwnie - zdaję sobie sprawę, że wiele z rzeczy, które zrobiłem, ktoś przede mną wdrożył lepiej, zgrabniej, bardziej optymalnie w dziesiątkach innych miejsc w sieci, ale podkreślę jeszcze raz - to projekt amatorski, z silnie określonymi warunkami brzegowymi i “właściwością miejscową”. Zdaję sobie sprawę z ograniczeń takiego podejścia i braku skalowalności, ale wydaje mi się, że na moje potrzeby, i pewnie garstki innych osób, które już korzystają i będą korzystać z mojej pracy, taka chałupnicza konstrukcja w zupełności wystarczy. Minusem atlasu jest też to, że do działania potrzebuje w miarę szybkiego internetu - a z tym w terenie górskim bywa różnie. Ale nie przewiduję wydania wersji offline (aplikacji) - to już nie na moje progi :slight_smile:

Dwa linki:

A ponieważ mówi się, że “bez obrazków się nie liczy”, zapraszam do pełnego opisu wszystkich warstw wraz z ok. 50 zrzutami ekranu na kowalowa.eu.

Zrzuty ekranu

  • Widok początkowy

  • NMT, hipsometria, szlaki turystyczne (w dymku węzeł szlaków na szczycie Lesista Wielka)

  • NMT, hipsometria, hydrografia

  • Geomorfologia (z hipsometrią i “surowy”)

  • NMT w “potrójnym” oświetleniu RGB (multi hillshade)

  • NMPT

  • Podział lasu na oddziały i własność lasów

  • Sieć rzeczna (rzeczywista i potencjalna)

  • Geologia (1910 - Geologische Karte von Preussen, 1973 - Szczegółowa Mapa Geologiczna Sudetów)

  • Geologia (Geologische Karte von Preussen)

  • Mapa z czasów wojny o sukcesję bawarską (tzw. wojna kartoflana)

  • Pomniki przyrody

  • Profil terenu

  • Profil terenu

  • Plan inwentaryzacji zieleni w miejscowości Sokołowsko z 1989 r.

  • Plan Sokołowska z 1887 r.

  • Widok kopalni melafiru w Rybnicy Leśnej (NMT, hipsometria, warstwice)

6 polubień

Imponujące. Chyba trudno o lepszą reklamę pasji, hobby, otwartych danych i open source. Wow. Nie przestawaj. Jak będę przy kompie ta na pewno przy kawie i dużym ekranie przeklinam całość :saluting_face:

1 polubienie

Tak na szybko - jeśli masz własny serwer i wgl, zainteresuj się nextgisem - opensource kożna na swoim serwerze postawić fajny geoportal i go zasilać prosto z qgisa :slight_smile:

2 polubienia

Trudno o lepszą motywację, niż zachęta z zacnego grona :slight_smile: Dziękuję!

Dzięki za podpowiedź. NextGIS znam tylko z wtyczki do QGIS. Własnego serwera niestety nie mam, ale zainteresuję się, czy można uruchomić to oprogramowanie na hostingu. Z szybkiego przeglądu widzę, że są gotowe obrazy Docker na Githubie.

1 polubienie

A na czym hostujesz aktualnie swoją mapę?

Mega polecam dla takich freaków nextgis, bo jest bardzo sympatyczny na początek:)

Mam hosting w CyberFolks od 2013 r. To jakiś przedpotopowy plan, którego w tej chwili nie mogę znaleźć w cenniku. 35 GB miejsca na dane, nielimitowany transfer i bazy danych, ale nie jest to VPS, więc z tego co się zorientowałem, NextGIS w Dockerze na tym nie uruchomię.

1 polubienie

Super ! To można przeglądać godzinami. No i inspiracja do własnych projektów. Dzięki za podzielenie się.

1 polubienie