niedziela, lutego 21, 2010

GDAL, Mapserver i tile serwery

Jedną z najważniejszych nowości w wydanej niedawno wersji 1.7 (a właściwie to 1.7.1) oprogramowania GDAL jest dodanie do wbudowanego minidrivera WMS obsługi serwerów typu TMS (Tile Map Service). O możliwościach jakie stwarza nowa funkcjonalność już kiedyś pisałem, bo choć dopiero teraz opublikowano stabilne wydanie GDAL, to wersja rozwojowa była dostępna już od wielu miesięcy (np. 1.7.0dev w pakiecie FWTools 2.4.2 z 2009/06/24).

Oczywiście GDAL nie jest jedynym programem, który pozwala na ściągnięcie map w kafelkach z serwerów OpenStreetMap lub ARS Geoportalu - istnieje przecież szereg innych rozwiązań. Nie jest też pewnie najbardziej przyjaznym dla zwykłego użytkownika - większość z nich preferuje jednak standardowy interfejs okienkowy i klikanie niż własnoręczne wpisywanie komend do linii poleceń i tworzenie plików xml.

Przewaga GDAL tkwi w jego uniwersalności. Nie jest to jedynie zbiór programików, to przede wszystkim biblioteka programistyczna, dzięki której zestaw funkcji GDAL może być wykorzystany w innych aplikacjach. Takich programów, które opierają się w mniejszym lub większym stopniu na bibliotece, jest całkiem sporo: GRASS, Mapserver, QGIS, a nawet Google Earth i ArcGIS.

W przypadku integracji GDAL i Mapservera możliwe jest np. użycie serwera ARS Geoportalu jako źródła danych rastrowych, a następnie stworzenia własnego WMS. Po co jednak ktoś chciałby rezygnować z szybkiego dostępu do kafelków na rzecz powolnego WMS? Powodów może być wiele: nasz program może nie posiadać obsługi TMS, chcielibyśmy mieć mapy w innym odwzorowaniu itp.

Tyle tytułem wstępu. Teraz czas na praktyczne wykorzystanie :)

Potrzebne będą:
  • GDAL 1.7
  • Mapserver (z obsługą GDAL)
  • dowolny serwer TMS (np. Geoportal, OSM lub UMP)
Nie będę opisywał procesu instalacji i konfiguracji jednego i drugiego oprogramowania - jest zbyt dużo możliwości i platform (FWTools, Osgeo4W dla Windows, pobieranie z paczek lub kompilacja w systemach Linux). W każdym razie na Windowsach powinno być łatwiej (dziwnym nie jest...), bo jak wspomniano FWTools ma już wersję 1.7. Natomiast w przypadku Linux konieczna będzie kompilacja ze źródeł - w repozytoriach leżą jakieś przestarzałe pakiety sprzed dwóch lat (tak, to jest właśnie jedna z wielu ZaletLinuksa™).

Zakładając, że GDAL i Mapserver są w najnowszej wersji i działają jak należy, można przystąpić do właściwego działania:

Potrzebny jest plik xml z konfiguracją serwera. Zasady są identyczne jak w notce o pobieraniu map z serwerów ARS Geoportalu. Należy pamiętać o dodaniu do pliku tagu <Cache>, dzięki czemu unikniemy za każdym razem ściągania danych od nowa, co przełoży się na wiekszą szybkość i mniejsze obciążenie serwerów.
Gotowe konfiguracje: Geoportal (BDO), UMP, OSM.

Tworzymy nowy plik map dla Mapservera i dodajemy warstwę rastrową, a jako źródło danych (DATA) podajemy lokalizację pliku xml.
Nie będę się wdawał w szczegóły dot. tego jak stworzyć plik map i co znaczą poszczególne opcje - tutaj jest przykładowy plik dla OSM. Kilka rzeczy na które warto zwrócić uwagę:
  • PROJECTION to odwzorowanie danych źródłowych (czyli EPSG:900913 dla UMP i OSM, 2180 dla Geoportalu)
  • wms_srs to odwzorowania w jakich mapy będzie udostępniał Mapserver
  • PROCESSING "RESAMPLE=AVERAGE" - włączenie resamplingu (dostępny jest również BILINEAR), domyślnie używany jest NEAREST, który jest szybki, ale daje kiepską jakość
  • MAXSCALE, MINSCALE - przedział widoczności danej warstwy (dla warstw UMP i OSM nie trzeba go podawać, ale w przypadku np. TBD z Geoportalu, które pojawia się dopiero od pewnego przybliżenia, a pierwszy poziom składa się z 1536x1024 kafelków, konieczne jest wpisanie MAXSCALE - w przeciwnym wypadku ogólny widok Polski w oddaleniu powodowałby próbę ściągnięcia wszystkich(!) plików z pierwszego poziomu)
  • CONFIG "PROJ_LIB" to lokalizacja pliku z definicjami kodów EPSG odwzorowań - 900913 nie jest standardowym kodem, więc Mapserver może go nie rozpoznać - należy podać ścieżkę do pliku, w którym dodany jest ten kod (można też spróbować oficjalnego, choć nie tak znanego, EPSG:3857, który opisuje to samo odwzorowanie "sferycznego Merkatora" co 900913)
Mamy xml, mamy map, więc można zacząć korzystać z naszego WMS. Standardowy adres serwisu to adres skryptu Mapservera na serwerze z dodanym parametrem-ścieżką do pliku map - przykładowo http://localhost/cgi-bin/mapserv?map=/srv/ars.map
Taki url wystarczy dodać teraz np. do QGIS:


Ale, ale... ktoś mógłby zapytać czy skoro QGIS również oparty jest na GDALu, to czy nie można by w nim bezpośrednio podpiąć TMS, bez przechodzenia przez Mapserver?
Owszem, można. Wystarczy z menu Warstwa wybrać Dodaj warstwę rastrową i wskazać odpowiedni plik xml. Wydaje się proste, tyle że potrzebny jest QGIS skompilowany w oparciu o GDAL 1.7, a najnowsza stabilna wersja QGIS wykorzystuje 1.6.1 (próba otworzenia takiego xml zakończy się wyskoczeniem błędu GDALWMS: No mini-driver registered for 'TMS'; zadziała natomiast xml dla WMS).
Zatem należy czekać na kolejną wersję oficjalną QGIS 1.5 (kilka miesięcy?) lub korzystać z Osgeo4W i rozwojowych buildów (tam pewnie pojawi się wcześniej), zaś niecierpliwym pozostaje samodzielna kompilacja...

8 komentarzy:

Anonimowy pisze...

Może da się coś zrobić z takim adresem:
http://www.jaworzno.pl/mapa/advMapsGetImgMaps.php?logo=off&p=plan_05&scale_bar=off&m_x=6590785&m_y=5563656&m_w=200&i_w=1100&i_h=800&cs=POL.2000.18&scale=1000&l=wladanie

Anonimowy pisze...

Jakie parametry powinien mieć plik xml do programu gdal, żeby przy założeniach
1. mapa z geoportalu w ARS o współrzędnych: X: 445672.93, Y: 685928.64
(To jest środek tego co mnie interesuje, a chciałbym mieć tak ze 2km w każdą stronę)
2. Skala w geoportalu to: 1:10614
utworzył mi się pojedynczy plik z mapa rastrową.

będę wdzięczny za pomoc.

m_k pisze...

Plik xml jest zawsze taki sam (dla danej warstwy), zmieniają się jedynie parametry podawane przy wywołaniu komendy gdal_translate (przykłady są w notce http://terraobserver.blogspot.com/2009/07/pobieranie-map-z-serwerow-ars.html).

Anonimowy pisze...

Witam,
a ja mam takie pytanie... jak rozwiązać problem polskich znaków w nazwie warstwy? Używając FWTools program nie rozpoznaje ich i tym samym z zasobu odpadają nam dość istotne informacje... Czy jest jakiś sposób na to?
pozdrawiam,
Dawid

m_k pisze...

Hm, dobre pytanie. Strzelam: spróbować rożnych kodowań w pliku XML, zobaczyć najnowszą wersję GDAL?

Anonimowy pisze...

Kodowanie nie pomogło. Korzystam z narzędzia FWTools, niestety nie wiem jak zaktualizować GDAL do nowszej wersji w tym pakiecie. Jakieś propozycje?
pozdrawiam,
Dawid

m_k pisze...

To jeszcze taka rzecz mi przyszła teraz do głowy: przepuść nazwę warstwy przez jakiś url enkoder i tak przerobioną wstaw do xml-a.

Anonimowy pisze...

Celny strzał- działa. Nie dla wszystkich serwerów, ale większości. Dziękuję,
Dawid