TileCache – przyspieszenie dla WMS

Wprowadzenie

Nie ulega wątpliwości, że usługa WMS była ogromnym krokiem naprzód w udostępnianiu informacji geograficznej. Ma ona jednak jedną podstawową wadę: nie nadaje się do szybkiej obsługi dużej liczby użytkowników. Konieczność generowania nowego obrazu mapy na każde, choćby drobne przesunięcie szybko doprowadzi do przeciążenia najmocniejszego nawet serwera, jeśli tylko jednoczesnych użytkowników będzie wielu. Dodatkowo znikający nawet na pojedyncze sekundy obraz mapy mocno pogarsza komfort korzystania.

Najprostszym sposobem zaradzenia temu jest użycie kafli. Chyba każdy zetknął się z tą technologią w popularnych internetowych serwisach mapowych. Polega ona na tym, że obraz mapy dzielony jest na małe fragmenty, które następnie są składane w całość po stronie klienta. W przypadku przesunięcia mapy niezbędne jest tylko uzupełnienie brakujących kafli, bez konieczności przeładowywania całości. Dodatkowo kafle mogą być przechowywane lokalnie w pamięci podręcznej przeglądarki, co jeszcze bardziej przyspiesza oglądanie mapy.

Nie tylko standard Google

Najczęściej mamy do czynienia z kaflami w standardzie Google Maps, które spopularyzowało ten sposób serwowania map w Internecie. Spowodowało to powstanie kilku stereotypów na ich temat, które postaram się poniżej wyjaśnić.

 1. Kafle muszą być w układzie Google Mercator

Nieprawda. Dla kafli nie ma innych ograniczeń w wyborze układu współrzędnych, niż te istniejące przy każdej innej mapie. Niektóre narzędzia do generowania kafli (np. TileMill) faktycznie obsługują wyłącznie układ Google, ale jest to ograniczenie programu, a nie samej technologii.

2. Kafle zajmują mnóstwo miejsca na dysku 

Półprawda. Nie ma konieczności generowania wszystkich możliwych kafli – zwykle 100% pokrycia tworzy się jedynie dla kilku najwyższych poziomów powiększenia, zaś kafle bardziej szczegółowe tylko dla pewnych obszarów (np. miast). Ponadto nad rozmiarami rosnącej piramidy można zapanować, odgórnie ograniczając jej objętość lub uruchamiając skrypt usuwający najrzadziej wyświetlane kafle.

3. Kafle muszą dzielić się na 4 i mieć poziomy skalowe jak Google

Półprawda. Podział na drzewo czwórkowe (quadtree) jest prosty i logiczny, ale nie obowiązujący, każdy poziom powiększenia może być definiowany niezależnie. Z poziomami skalowymi sprawa ma się nieco inaczej.

Pojedyncze kafle nie mają własnej georeferencji. Aplikacja klienta wpasowuje kafle w układ współrzędnych na podstawie zasięgu (BBOX), rozmiaru kafla (w pikselach) oraz jego rozdzielczości (w metrach na piksel). Ale fizyczny rozmiar piksela, będący podstawą do określenia skali, będzie się różnił między ekranami. Można zrobić następujący eksperyment: otworzyć geoportal.gov.pl, zanotować skale przy poszczególnych poziomach powiększenia, a następnie zmienić rozdzielczość ekranu i sprawdzić ponownie. Możliwe jest zatem stworzenie kafli dokładnie odpowiadających skalą papierowym mapom topograficznym (1:100 000, 1:50 000, 1: 25 000, 1:10 000), ale tylko dla konkretnego ekranu i konkretnej rozdzielczości.

Jeśli zaś chodzi o drukowanie w określonej skali, to lepiej wykorzystać do tego polecenie GetPrint dostępne w serwerach WMS, np. QGIS Server.

Dostępne narzędzia

Istnieje szereg narzędzi, które umożliwiają przygotowanie kafli z danych publikowanych przez WMS: są to m.in. TileCache, MapProxy, GeoWebCache. Ze względu na popularność i prostotę konfiguracji, szerzej opiszę pierwsze z nich.

TileCache jest napisane w języku Python i w najprostszym wariancie nie wymaga instalacji, ani też nie zależy od dodatkowych pakietów. Warto jednak zaopatrzyć się w bibliotekę PIL (Python Imaging Library), ponieważ bez niej nie będzie możliwe tworzenie tak zwanych meta-kafli (o których później).

TileCache jako CGI

Najprostszym rozwiązaniem jest ściągnięcie i rozpakowanie TileCache do katalogu cgi-bin serwera WWW (w Debianie i Ubuntu jest to /usr/lib/cgi-bin). Program będzie dostępny natychmiast, a każda zmiana w pliku konfiguracyjnym zostanie uwzględniona bez konieczności restartu serwera.

Zaraz po rozpakowaniu można sprawdzić działanie TileCache poprzez wywołanie warstwy demo:

http://domena.pl/cgi-bin/tilecache-2.11/tilecache.cgi/1.0.0/basic/0/0/0.png

Efektem powinno być pojawienie się następującego obrazka:

 

Konfiguracja

Dokonujemy jej poprzez edycję tekstowego pliku o nazwie tilecache.cfg. Domyślnie mamy podanych kilka przykładów, które mogą posłużyć jako podstawa do definiowania własnych. Istnieją następujące możliwości generowania kafli:

  • poprzez wysyłanie zapytań do serwera WMS,
  • bezpośrednio do silnika generującego obraz – dostępne dla Mapnik i MapServer.

Nową warstwę definiujemy umieszczając jej nazwę w kwadratowych nawiasach [nazwa_warstwy], w kolejnych liniach wpisujemy opcje.

Najważniejsze z nich to:

type – definiuje źródło warstwy (WMS lub bezpośrednio),

url – adres serwera WMS,

mapfile – lokalizacja pliku konfiguracyjnego w przypadku wyboru opcji Mapnik lub MapServer,

layers – warstwy do pobrania z serwera WMS, oddzielone przecinkami,

bbox – zasięg warstwy, w formacie ,,,,

srs – układ współrzędnych w formacie EPSG:xxxx,

resolutions – rozdzielczości poszczególnych poziomów powiększenia, ujęte w kwadratowy nawias i rozdzielone przecinkami.

Jeśli nie zdefiniujemy własnych rozdzielczości, to program określi je sam według następującej zależności:

  • poziom 0 – długość dłuższej osi zasięgu warstwy (N-S lub W-E) [metrów] / 512 [pikseli],
  • każdy kolejny – rozdzielczość poprzedniego poziomu / 2.
[warning]Przy określaniu własnych rozdzielczości należy pamiętać, że liczba kafli przypadających na cały zasięg wzdłuż danej osi musi być liczbą całkowitą. Można to sprawdzić przy pomocy wzorów: (Xmax-Xmin) / ([rozdzielczość]*256) oraz (Ymax-Ymin) / ([rozdzielczość]*256) [/warning]

Pełna lista dostępnych opcji znajduje się w dokumentacji.

Meta-kafle

Problemem, który może się pojawić przy kafelkowaniu, jest ucinanie i powielanie niektórych elementów mapy (zwłaszcza napisów) na granicy kafli. Aby temu zaradzić, można użyć tak zwanych meta-kafli (metatiles). Polega to na tym, że TileCache wysyła do serwera WMS zapytanie o większy obszar (kolor czarny), odrzuca ramkę, a następnie dzieli pozostałą część (kolor czerwony) na pojedyncze kafle (zielone):

Aby skorzystać z meta-kafli, należy do konfiguracji warstwy dopisać następujące opcje:

metaTile=True

metaSize=x,y – określa z ilu kafli ma się składać meta-kafel, domyślnie jest to 5×5,

metaBuffer= x – określa ramkę dookoła meta-kafla, domyślnie jest to 10 pikseli.

Generowanie kafli

Najprostszym sposobem wygenerowania kafli jest zażądanie obszaru zainteresowania poprzez WMS. Można dodać adres TileCache – w postaci http://domena.pl/cgi-bin/tilecache-2.11/tilecache.cgi jako nowy serwer WMS w QGIS, program ten jest w stanie sam rozpoznać dostępny zasięg i rozdzielczości. W przypadku aplikacji www opartych na OpenLayers trzeba będzie zamienić adres wskazujący bezpośrednio na serwer WMS na adres TileCache oraz podać parametry „bbox” i „resolutions” identyczne z tymi, które podaliśmy w konfiguracji TileCache. Gdy będziemy oglądać jakiś obszar po raz pierwszy, odpowiedź na zapytanie może zająć serwerowi dłuższy czas (zwykle do kilkunastu sekund). W miarę przeglądania mapy kafle będą stopniowo powstawały i odpowiedzi będą znacznie szybsze.

TileCache pod mod_python

Jeśli wszystko już działa prawidłowo, można zamiast CGI użyć szybszego mod_python. Moduł ten można zainstalować w systemie poleceniem:

apt-get install libapache2-mod-python

Następnie przenosimy TileCache z katalogu cgi-bin do /var/www:

mv -R tilecache-2.11 /var/www

Po tej operacji wymagana jest instalacja TileCache w systemie:

cd /var/www/tilecache-2.11
python setup.py install

Gdy instalacja się zakończy,dodajemy następujące linijki w konfiguracji Apache:

   
       AddHandler python-program .py
       PythonHandler TileCache.Service
       PythonOption TileCacheConfig /var/www/tilecache-2.11/tilecache.cfg

Na koniec należy zrestartować serwer:

/etc/init.d/apache2 restart

Od tej pory należy zamienić URL typu:

http://domena.pl/cgi-bin/tilecache-2.11/tilecache.cgi…

na:

http://domena.pl/tilecache-2.11/tilecache.py

Rozwiązanie to, choć szybsze, ma jednak pewien minus: każda zmiana w pliku konfiguracyjnym będzie teraz wymagała restartu Apache.