Kartografia internetowa

Ćwiczenie 3 - Mapserver, podstawy tworzenia map

Mapserver  Plik Map  Zadanie 4  Wyświetlanie strony  Etykiety 

Zadanie 5  Wykorzystanie klas  Warstwy rastrowe  Zadanie 6 

Kilka słów wstępu

Ćwiczenia są okazją do wyrobienia sobie kilku niezmiernie przydatnych i ułatwiających życie nawyków:

  1. Najważniejsze - należy bezwzględnie utworzyć katalog Backup, gdzie przechowywana będzie ostatnia działająca wersja serwisu. Często zachodzi konieczność jednoczesnej (szczególnie na początku) zmiany dużej ilości kodu. Jeśli wystąpią jakiekolwiek błędy to rezultatem ich doraźnej naprawy jest przeważnie nieczytelny plik i niemożność kontynuacji ćwiczeń. Kopia zapasowa o ile oczywiście jest odpowiednio często aktualizowana niweluje ten problem
  2. Należy w miarę możliwości wprowadzać zmiany w jak najmniejszych partiach (np. jedna warstwa) i po każdej przeprowadzać test
  3. Wszelkie nowo utworzone lub zmodyfikowane dane powinny zostać opatrzone komentarzem (metadane)
  4. Kod powinien być odpowiednio skomentowany tak aby zarówno twórca jak i osoba trzecia mogła zrozumieć "co autor miał na myśli".

Mapserver

W dużym uproszczeniu Mapserver jest środowiskiem/silnikiem wyspecjalizowanym w przetwarzaniu i wyświetlaniu wszelkiego rodzaju informacji przestrzennej na potrzeby internetu. Jego podstawowym zadaniem jest generowanie statycznych bądź dynamicznych map we wszelkiego rodzaju serwisach internetowych. Może on funkcjonować na dwa sposoby, jako program/skrypt CGI lub też jako niezależny program dostępny poprzez interfejs API z poziomu takich języków jak Perl/Python/PHP. Poniżej zajmiemy się wyłącznie tym pierwszym przypadkiem, gdyż mimo że to podejście uniemożliwia wykorzystanie wielu funkcji jest znacznie prostsze w implementacji.

Aby uruchomić aplikację w Mapserverze potrzebne są następującę elementy:

Plik Map (Map File)
Plik tekstowy z rozszerzeniem .map o odpowiedniej strukturze wewnętrznej, zawierający definicję poszczególnych warstw i sposobu ich wyświetlania w przeglądarce, użytych odwzorowań kartograficznych, potrzebne współrzędne itp. Informuje także o lokalizacji danych źródłowych i wyjściowych.
Dane geograficzne
Mapserver jako domyślne źródło danych przyjmuje pliki Shapefile, jednak równie dobrze mogą być stosowane inne formaty. Obsługiwane są wszystkie najpopularniejsze typy danych rastrowych.
Strona HTML
Tworzy interfejs użytkownika. W najprostszym rozwiązaniu Mapserver może być użyty do wygenerowania statycznego obrazka. Bardziej wymagające aplikacja wymagają dwóch elementów:

  • Strona inicjalizująca - zawiera startowe zapytanie do serwera, mogące byc przekazane w postaci zarówno URL jak i zmiennych ukrytych

  • Szablon (Template File) - tworzy szkielet wygladu strony i określa możliwości interfejsu użytkownika. Zawarte w niej zmienne Mapservera są zastępowane przez odpowiednie wartości podczas wyświetlania w przeglądarce

Mapserver CGI
program/skrypt zlokalizowany w katalogu cgi-bin lub innym przechowującym skrypty działające na serwerze. Jego zadaniem jest odpowiednie przetworzenie otrzymywanych zapytań.
Serwer HTTP

Plik Map

Plik map oparty jest o strukturę hierarchiczną i składa się z obiektów, zawierających słowa kluczowe bądź inne obiekty. Na jej szczycie znajduje się obiekt MAP, do którego należą wszystkie pozostałe. Zaczynając konstrukcję dokumentu należy pamiętać o kilku zasadach:

  • Należy pamiętać o wspomnianej hierarchi. Każdy obiekt musi zaczynać się swoją nazwą a kończyć słowem END.
  • Komentarze poprzedzane są znakiem #.
  • Ścieżki dostępu mogą być podawane bezwzględnie lub relatywnie do lokalizacji pliku map i shapefile.
  • Wszystkie ciągi zawierające znaki inne niż alfanumeryczne (czyli na przykład ścieżki dostępu) muszą być zawarte w podwójnym cudzysłowiu. Zalecane jest jednak aby czynić tak z wszystkim ciągami znaków. Nie dotyczy to jedynie wybieranych z listy parametrów słów kluczowych.

Poniżej opisane są podstawowe obiekty wraz z przykładowymi słowami kluczowymi niezbędnymi do budowy prostego pliku map. Całość dostępnych parametrów można znaleźć tutaj. Ich hierarchia prezentuje się następująco:

Obiekt MAP
MAP
Początek obiektu
IMAGETYPE
Typ pliku graficznego jaki zostanie użyty przez Mapserver jako wyjściowy. Podstawowym formatem jest w tym wypadku PNG, aczkolwiek za pomocą obiektu OUTPUTFORMAT możliwe jest użycie innych (GeoTIFF, PDF itp.)
EXTENT
Ramy przestrzenne bazowego okna wyświetlanej mapy. Jest to oddzielony spacjami zestaw współrzędnych w formacie X1 Y1 X2 Y2 (lewy dolny róg, prawy górny róg). Musi być on zapisany w jednostkach pliku źródłowego lub też zdefiniowanej dodatkowo projekcji wyjściowej
SIZE
Wielkość wyświetlanego w przeglądarce okna mapy podana w pikselach w formacie X Y
SHAPEPATH
Ścieżka dostępu do danych. Może być podana bezwzględnie lub w relacji do pliku map np. "./Dane"
IMAGECOLOR
Kolor tła mapy w formacie R G B
END
Koniec obiektu
Obiekt LAYER
Domyślnie maksymalna ilość możliwych do zdefiniowania warstw to 50 lub 100, jednak można dokonać konfiguracji dla ich dowolnej liczby. Kolejność umieszczania warstw w pliku map nie jest bez znaczenia, gdyż rysowane są one w odwrotnej kolejności niż występują w dokumencie.
NAME
Identyfikator warstwy. W ten sposób można się do niej odwoływać.
DATA
Ścieżka dostępu do danych, relatywnie do SHAPEPATH. Może być to zarówno raster jak i wektor.
TYPE
Określa typ wyświetlanej warstwy np. RASTER, POLYGON, LINE. Jakkolwiek podana wartość nie musi być taka sama jak pliku źródłowego, jednak obowiązują zasady zdrowego rozsądku... Polecenie można wykorzystać np. podając wartość LINE dla warstwy poligonalnej co spowoduje wyświetlenie samych obrysów.
STATUS
Domyślnie ustawiony na ON czyli zawsze widoczna. Użycie OFF spowoduje, że warstwa wyświetlona zostanie dopiero po wywołaniu.
Obiekt CLASS
NAME
Tak jak obiekt MAP może posiadać wiele warstw tak warstwy mogą zawierać wiele klas, rozróżnianych za pomocą tego polecenia. Każda warstwa wektorowa musi zawierać obiekty CLASS i STYLE ale nie dotyczy to rastrów.
Obiekt STYLE
Zawarty wewnątrz klasy określa w jaki sposób jest ona wyświetlana.
COLOR
Kolor poligonu lub lini w formacie R G B
OUTLINECOLOR
W przypadku poligonu określa kolor linii

Przy budowie pliku map dobrze je zachować pewne zasady składni. Aczkolwiek w wiekszości nie są one niezbędne to zdecydowanie ułatwiają zarówno samo pisanie jak i wykrywanie błędów, kolejne transformacje i dodawanie obiektów. Przyjmuje się, że wszystkie polecenia (także obiekty i parametry wybierane z listy) pisane są dużymi literami. Czytelność dokumentu poprawia stosowanie wcięć podkreślających miejsce obiektu w hierarchi a także stosowanie komentarzy. Poniżej przykładowy plik:

MAP #Początek pliku map i głównego obiektu
  IMAGETYPE      PNG
  EXTENT         -97.238976 41.619778 -82.122902 49.385620
  SIZE           400 200
  SHAPEPATH      "/aplikacja/materialy"
  IMAGECOLOR     0 0 0

  LAYER #niezbędna jest co najmniej jedna warstwa
    NAME         "lasy"
    DATA         "lasy.shp"
    STATUS       OFF
    TYPE         POLYGON

    CLASS
      NAME       "lasy bukowe"

      STYLE
        COLOR        0 150 0
        OUTLINECOLOR 255 255 255
      END #Koniec obiektu STYLE
    END #Koniec obiektu CLASS
  END #Koniec obiektu LAYER
END #Koniec obiektu MAP

ZADANIE 4. W katalogu ~/htdocs/KartografiaX/ utwórz prawidłowy plik map z co najmniej dwoma warstwami: jedną rastrową oraz wektorową wykorzystując przykładowe dane. Następnie otwórz stworzony uprzednio plik index.html. Przekształć go aby między znacznikami <body> zawierał wyłącznie obrazek. Zamiast ścieżki dostępu do pliku wprowadź następujący ciąg znaków zastępując odpowiednio nazwami własnych plików i warstw:

/cgi-bin/mapserv?map=/var/www/KartografiaX/nazwa_twojego_pliku_map.map& layer=twoja_warstwa_rastrowa&layer=twoja_warstwa_wektorowa&mode=map

Otwórz w przeglądarce adres http://localhost/KartografiaX

Wyświetlanie strony w przeglądarce

W powyższym zadaniu aby wyświetlić mapę utworzoną przy pomocy Mapservera konieczne było wpisanie ciągu pewnego ciągu znaków. Jest to najprostszy to sposób najprostszy i dający małe możliwości niemniej przydatny w pewnych przypadkach. Ciąg ten można podzielić na dwie części. Pierwsza z nich:

/cgi-bin/mapserv?

mówi o lokalizacji skryptu Mapservera relatywnie do katalogu głównego serwera. Za znakiem ? rozpoczyna się natomiast ciąg poleceń dla skryptu CGI. Wygląda on następująco (przy użyciu nazw warstw z przykładowego pliku map):

map=/var/www/KartografiaX/lasy.map& layer=lasy&layer=inne_lasy&mode=map

Poszczególne polecenia oddzielone są znakiem &. I tak:

map=/var/www/KartografiaX/lasy.map

podaje informację o położeniu wykorzystywanego pliku map,

layer=lasy

przekazuje nazwę warstwy do wyświetlenia. Należy pamiętać, że warstwy rysowane są w odwrotnej kolejności niż zostały podane w pliku map.

mode=map

To polecenie podaje tryb wyświetlenia. W tym wypadku "map"oznacza, że w oknie przeglądarki zwrócony zostanie statyczny obrazek.

Etykiety

Mapserver posiada dość rozbudowane możliwości etykietowania obiektów. Aby je zastosować niezbędne jest dodanie do utworzonego wcześniej pliku map kilku nowych parametrów i jednego obiektu.

Po pierwsze należy pobrać zestaw czcionek i po rozpakowaniu umieścić go w katalogu ~/htdocs/kartografiaX/. Następnie w obrębie obiektu MAP musi znaleźć się dodatkowy parametr określający lokalizację listy czcionek:

FONTSET "ścieżka dostępu do listy czcionek"

Lista czcionek to plik tekstowy z rozszerzeniem .list zawierający nazwy czcionek i odpowiadające im pliki. I tak linijka:

arial      Vera.ttf

informuje skrypt CGI do jakiego pliku się odwołać po wywołaniu nazwy arial

Kolejny etap to dodanie w obrębie LAYER informacji o tym jakiego atrybutu będziemy używać do etykietowania:

LABELITEM "nazwa_atrybutu"
Nazwy atrybutów rozpoznają wielkość czcionki

O tym w jaki sposób wyświetlane będą etykiety decydują parametry w obiekcie LABEL będącym częścią CLASS.

Obiekt LABEL
COLOR
Kolor czcionki w formacie R G B
TYPE
Typ czcionki, do wyboru TRUETYPE lub BITMAP (czcionki wbudowane)
FONT
Nazwa użytej czcionki Truetype (według listy czcionek)
SIZE
Rozmiar czcionki w pikselach
SHADOWCOLOR
Kolor cienia w formacie R G B
SHADOWSIZE
Rozmiary cienia w pikselach w formacie X Y
ANTIALIAS
Włącza lub wyłącza antialiasing, do wyboru wartość TRUE lub FALSE
POSITION
Decyduje o pozycji etykiety względem obiektu. Dwie litery określają położenie pionowe (U - górne; C - środkowe; L - dolne) i poziome (L - lewe; C - środkowe; R - prawe). Czyli na przykład UR oznacza prawy, górny róg.
MINDISTANCE
Minimalna odległość w pikselach w jakiej może powtarzać się ta sama etykieta
BUFFER
Podobnie jak w przypadku MINDISTANCE jednak dotyczy wszystkich etykiet.

Oprócz tworzenia etykiet wewnątrz warstw, można tworzyć osobne warstwy zawierące jedynie etykiety, służy do tego LAYER-TYPE-ANNOTATION.

ZADANIE 5. Zbuduj obiekt LABEL dla dowolnej warstwy

Wykorzystanie klas

Jak wcześniej wspomniano w obrębie jednej warstwy można tworzyć różne klasy. Może to służyć między innymi do rozróżnienia sposobów wyświetlania poszczególnych obiektów z jednej warstwy. Potrzebne są do tego dwa dodatkowe słowa kluczowe:

W obrębie LAYER:
CLASSITEM
Za pomocą tego słowa kluczowego podajemy nazwę atrybutu, który będzię używany do rozróżnienia poszczególnych klas, np. "typ"

Natomiast w obrębie CLASS:
EXPRESSION
Jako wartość może zostać podany ciąg znaków np. "jezioro", jednak obsługiwane są też wyrażenia logiczne.

Warstwy rastrowe

Oprócz warstw wektorowych w aplikacjach Mapservera można stosować także warstwy rastrowe. Obrazy mogą być odczytywane i zapisywane w jednym z licznych formatów obsługowanych przez bibliotekę GDAL. Struktura warstwy rastrowej nie musi posiadać obiektu CLASS, natomiast pozostałe parametry są podobne do warstwy wektorowej z wyjątkiem TYPE - w tym wypadku należy zaznaczyć RASTER. Dodatkowo przydatnym poleceniem OFFSITE, które pozwala uczynić tło obrazka przeźroczystym. Wartości koloru można uzyskać dowolnym programem graficznym. Dla przykładowego podkładu jest to 255 255 206.

OFFSITE
Piksele o danym kolorze, podanym w formacie R G B nie będą wyświetlane
ZADANIE 6. Dodaj warstwę rastrową jako podkład.