Jak przyspieszyć zewnętrzne usługi WMS?

Gdzie jest problem?

WMSy bardzo często działają powoli. Jeśli masz dużo warstw WMS na mapie, to może doprowadzić do frustracji. Czy da się coś z tym zrobić? Da się.

Jak to w ogóle działa?

Weźmy jako przykład warstwę “klasoużytki” z dostępne jako pod WMS: Krajowa Integracja Ewidencji Gruntów. Faktycznym źródeł tych danych są serwisy powiatowe, a Krajowa Integracja polega na tym, że… integruje usługi wszystkich powiatów pod jednym adresem.

Korzystając z WMS, za każdym razem gdy ruszymy mapę:

  1. wysyłamy zapytanie “do Geoportalu”: chcę zobaczyć mapę klasoużytków w skali X, dla zasięgu Y.
  2. Geoportal wyłapuje nasze zapytanie i przesyła je do odpowiedniego powiatu
  3. Serwis powiatowy na podstawie danych źródłowych przygotowuje “kafelki” w żądanej skali dla żądanego zasięgu i wysyła je do Geoportalu
  4. Geoportal jest tylko łącznikiem więc wysyła je do nas.
  5. Po kilku, kilkunastu sekundach wyświetla się mapa. Czas zależy od obciążenia serwisów powiatowych, obciążenia sieci i wielu innych czynników

Tak się dzieje za każdym razem jak ruszymy myszką. Dlatego to trwa… Cały proces obrazuje poniższa grafika.

Co można z tym zrobić?

Można “przechwycić” raz wygenerowane kafelki i je zapisać. Jak to zrobić?

Wykorzystanie Geoservera jako maszynę do przechwytywania i przechowywania kafelków.

Można pomiędzy klienta (GIS.Box lub QGIS) wrzucić Geoserver, który wykorzystamy jako maszynę do przechwytywania i przechowywania raz przesłanych przez Geoportal kafelków. Jak to działa?

  1. wysyłamy zapytanie “do Geoservera”: chcę zobaczyć mapę klasoużytków w skali X, dla zasięgu Y.
  2. Geoserver szuka, czy ma takie dane w swojej pamięci.
    1. Jeśli ma to odsyła. Koniec
    2. Jeśli nie ma to podobnie jak w poprzednim przypadku wysyła zapytanie do Geoportalu, on do serwisu powiatowego, kafelki się generują, i przez Geoportal trafiają do Geoservera, który je ZAPISUJE i wysyła dalej, do klienta.

Dzięki temu, my sami, oraz każda inna osoba korzystająca z tego Geoservera będzie mogła otrzymywać dane w mgnieniu oka. Czekać będzie tylko pierwsza osoba, która zbliżyła się do danego obszaru.

Różnice w czasach odpowiedzi można zaobserwować na poniższym filmie

Brzmi dobrze? To zabieram się do pracy:

Co potrzeba do wykonania zadania?

  1. Moduł dodatkowy Geoserver (lub jakikolwiek inny Geoserver)

 

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:

  1. Bez kafelków:
  2. Z kafelkami:

 

Czy artykuł był pomocny?