WMSy bardzo często działają powoli. Jeśli masz dużo warstw WMS na mapie, to może doprowadzić do frustracji. Jak temu zaradzić?
Jeżeli dane nie są szybko zmieniające się (np. ortofotomapa), to można (w pewnym uproszczeniu) pobrać do Systemu i wyświetlać jako warstwę lokalną, a nie WMS.
Mówiąc językiem bardziej technicznym: można stworzyć cache tej warstwy. Jak? Odpowiedź przedstawia poniższy artykuł.
Co potrzeba do wykonania zadania?
- Moduł dodatkowy Geoserver
- Adres WMS
Jak stworzyć chache warstwy WMS w Geoserver?
Niektóre usługi WMS – zwłaszcza te “obfitujące” w dane, jak chociażby ortofotomapa – działają bardzo wolno, przez co praktycznie nie da się z nich komfortowo korzystać. Rozwiązaniem problemu jest wybór usługi WMTS. Co jednak, jeśli nie jest ona dostępna? W podobnej sytuacji możemy sięgnąć po opcję tzw. buforowania kafelków. Choć nazwa wydaje się egzotyczna, to sam cel działania jest prosty i klarowny – chodzi bowiem o skrócenie czasu oczekiwania na wyświetlenie się warstwy i odciążenie serwera poprzez redukcję obliczeń związanych z renderingiem.
Jak to działa? Wyobraźmy sobie pewien obszar przedstawiony na mapie. Oznaczmy jego pełny zasięg wartością 0. Następnie dzielimy go na cztery części – jest to pierwszy poziom powiększenia (zoom), dlatego też możemy przypisać im wartość 1 . Każdy z czterech kafelków ponownie dzielimy na cztery części, uzyskując tym razem aż 16 elementów. Wraz z liczbą podziałów rośnie liczba elementów, a z nią poziom szczegółowości. Każdy z kafelków posiada swój unikalny identyfikator, określony wartościami X,Y i Z. Pierwsze dwie odnoszą się do kolumny i wiersza, trzecia zaś oznacza poziom skalowy. Takie rozwiązanie powoduje, że aplikacja kliencka sama ustala, które kafle pobrać dla widocznego obszaru mapy, wysyłając zapytania do każdego elementu z osobna. Dzięki temu informacje pobierają się zdecydowanie szybciej.
No dobrze, ale jak osiągnąć ten efekt w praktyce? Z jakich narzędzi skorzystać? Potrzebny będzie Geoserver i jakaś “ciężka” warstwa do testów. Znakomicie sprawdzi się tutaj klasyczna ortofotomapa w wersji WMS.To już mamy. Co dalej? Wraz z Geoserverem otrzymujemy narzędzie GeoWebCache (będziemy je dalej nazywać GWC), które wykorzystuje się do tworzenia wspomnianych kafli (co ciekawe kafle te możemy tworzyć zarówno dla danych rastrowych, jak wektorowych). Zanim jednak przejdziemy do tworzenia kafli dla wybranej warstwy musimy utworzyć siatkę kartograficzną, na podstawie której zostaną zdefiniowane poszczególne poziomy powiększenia.
Po lewej stronie okna głównego Geoservera znajduje się panel opcji, wśród nich zaś kategoria Buforowanie kafelków. Przechodzimy do opcji Siatki kartograficzne.
W kolejnym oknie klikamy na Utwórz nową siatkę kartograficzną:
Zaczynamy od nadania nazwy – dobrym pomysłem jest wykorzystanie kodu EPSG układu, który chcemy wykorzystać do stworzenia nowej siatki. W tym przypadku jest to Państwowy Układ Współrzędnych Geodezyjnych 1992 oznaczony kodem 2180:
Oprócz wypełnienia pola Nazwa niezbędne jest również wskazanie układu referencyjnego. Geoserver posiada wbudowaną wyszukiwarkę układów, który otwieramy klikając na Znajdź:
Wprowadzamy kod poszukiwanego układu. Wyboru dokonujemy klikając na odpowiednią wartość w kolumnie code:
Wartości min/max dla zasięgu siatki kartograficznej obliczamy klikając na Wylicz z maksymalnego zasięgu CRS:
Należy również określić rozmiar kafelka, podając jego wysokość i szerokość w pikselach:
Po uzupełnieniu wszystkich niezbędnych informacji (pola oznaczone gwiazdką) przechodzimy do ostatniego etapu, tj. dodania poziomów powiększenia:
Każdy z kafelków ma jasno określony rozmiar podany w jednostkach wybranego układu współrzędnych (dla EPSG:2180 są to metry) oraz skalę. Wraz ze wzrostem poziomu powiększenia zwiększa się również skala, a także liczba kafelków do wygenerowania (do odczytania w kolumnie kafelki). Po dodaniu odpowiadającej nam liczby poziomów należy zapisać zmiany, klikając na Save.
Wróćmy teraz do ustawień Buforowania kafelków i wybierzmy opcję Kafelkuj Warstwy:
Naszym celem jest utworzenie kafelków dla warstwy z klasyczną ortofotomapą. Wybieramy więc interesującą nas warstwę i klikamy na Dane inicjalne/czyszczenie:
W ten sposób uruchamiamy zainstalowaną wraz z Geoserverem aplikację GeoWebCache. W polu Number of tasks to use określamy liczbę równolegle wykonywanych procesów generowania kafli. W Type of operation wybieramy między tworzeniem pełnego zestawu nowych kafli (opcja Reseed) lub uzupełnieniem braków (Seed). Wskazujemy również zakres poziomów powiększenia, dla których zostaną wygenerowane kafelki. Opcjonalnie możemy również określić Bounding Box, a dokładniej koordynaty lewego dolnego i prawego górnego wierzchołka prostokąta wyznaczającego zasięg konkretnego obszaru – w tym przykładzie posłużono się współrzędnymi bounding boxa miasta-powiatu Poznań. Aby rozpocząć proces, klikamy na Submit:
Możemy na bieżąco śledzić przebieg procesu, monitorując liczbę przetworzonych kafli i czas pozostały do zakończenia przetwarzania (w celu odświeżenia widoku tabeli klikamy na Refresh list). Tytułem uzupełnienia – tutaj akurat proces przetwarzania zakończył się błyskawicznie, a to ze względu na mało obciążający zakres poziomów powiększenia 0-5. W przypadku większego zoomu należy się nastawić na zdecydowanie dłuższy czas oczekiwania.
Upewnijmy się, że wszystko przebiegło zgodnie z planem. W tym celu należy otworzyć katalog:
Geoserver\data_dir\gwc\nazwa_warstwy i odszukać foldery zawierające pliki graficzne reprezentujące zestawy kafelków dla poszczególnych poziomów powiększenia:
Pora na test: jak widać na załączonym zrzucie ekranu, katalog zawiera kafle z poziomów od 3 do 12 (a więc maksymalnie do skali ok. 1: 2665) utworzone dla zakresu przestrzennego Poznania. Aby wykorzystać możliwości kafelkowania warstwy, należy odpowiednio sformatować adres usługi WMS/WMTS. Można również odwołać się bezpośrednio do obszaru roboczego w Geoserverze, w którym przechowywana jest warstwa, np. (…)/geoserver/nazwa_obszaru/gwc/
service/wmts. W jaki sposób sprawdzić, czy całość działa szybciej? Najprościej wczytać daną usługę w programie QGIS i porównać czas renderowania warstwy bez-(/geoserver/
nazwa_obszaru/ows) i z uwzględnioną obsługą kafelków.
Poniżej porównanie: