UMN Mapserver - Verstehen & Anwenden

© Christian Aden und Ingo Lünsmann - zuletzt bearbeitet am 20.09.2010

Im folgenden werden grundlegende Konzepte und die Funktionsweise des UMN Mapservers dargelegt. Nach der Erläuterung der zentralen Konfigurationsdatei - des Mapfiles - richtet sich das Augenmerk auf die Verwendung des 'Kartenlieferanten' als CGI-Programm. Dabei wird auch der Umgang mit HTML-Templates behandelt. Anhand von Beispielen, die in Form kurzer handhabbarer Rezepte Einzelaspekte beleuchten, nähert man sich sodann Schritt für Schritt den Details. Alle Beispiele ergänzen sich zum Schluss zu einer Anwendung, die die grundsätzlichen Funktionalitäten des Mapservers nutzt und als Basis für individuelle Applikationen dienen kann.

  • entstanden als Begleitskript für Mapserver-Kurse
  • soll als Wegweiser dienen. Die Erfahrung zeigt, dass lern- und arbeitswillige Mapserver-Anfänger oft den Wald vor lauter Bäumen nicht sehen. Sie wissen nicht, wo sie beginnen sollen. Häufig wird dann an irgendeiner Stelle begonnen, was im Resultat nicht die gewünschten Fortschritte bringt und zur Frustation führt.
  • Unter dem Grundsatz, das Rad nicht ständig neu zu erfinden und wiederzukäuen, sind im Internet zugängliche Dokumentationen genutzt worden. dieses Dokument liefert also lediglich einen roten Faden inklusive zusammenfassender Erläuterungen.
  • empfohlenes Vorgehen: Zunächst die grundlegenden Erläuterungen bis zu den Beispielen lesen und die verlinkten Dokumente einem 'Brainstorming' unterwerfen. Es genügt, sich im ersten Schritt einen Überblick zu verschaffen, wie der Mapserver grundlegend arbeitet und wo man was findet. Anhand der Beispiele Details nachvollziehen und anhand der vorgegebenen oder selbst gestellter Aufgaben mittels der Referenzen das Wissen vertiefen.
  • Ziel ist es also, ein fundiertes Grundverständnis zu schaffen, auf Basis dessen man in der Lage ist, eigene spezielle Aufgaben zu bewältigen.

 

Mapfiles

Die zentralen Konfigurationsdateien für den Mapserver sind Mapfiles. In ihnen wird die auszuliefernde Karte mittels einer festgelegten hierarchischen Textstruktur definiert, die der Form eines 'gerichteten azyklischen Graphen' folgt. Dieser repräsentiert eine baumähnliche Struktur zur Organisation der zu einer Anwendung gehörigen Objekte (hier eine Karte und dessen Bestandteile). Die Basiselemente werden dabei als Knoten bezeichnet. 'Gerichtet' bedeutet, dass Knotenverbindungen durch sogenannte 'Eltern-Kind-Beziehungen' angeordnet sind. Es bestehen also eindeutige Verhältnisse zwischen einem Elternknoten und einem Kindknoten. Der Begriff 'azyklisch' meint die Untersagung einer Schleifenbildung zwischen diesen Relationen. Ein Kindknoten darf sich also z.B. nicht auf sich selbst beziehen. Der oberste Knoten, auch Wurzelknoten genannt, ist das Kartenobjekt (MAP). Diesem sind alle anderen Objekte untergeordnet. Ferner ist genau definiert, welcher Elternknoten welche Kindknoten sowie welches Objekt welche Attribute besitzen darf. Der 'Kartengraph' ist grob in der Abbildung 1 zu sehen. Weitere Beschreibungen und die Auflistung der zu den Objekten definierbaren Attribute sind der Mapfile-Reference entnehmbar.

Abb. 1: Der 'Kartengraph'

Im Mapfile werden die Ausgangsbedingungen in Form von Startparametern festgelegt. Diese können zur Programmlaufzeit modifiziert werden. Bei Aufruf des Mapservers 'parst' dieser den angegebenen Mapfile d.h. er durchläuft den Text und zerlegt ihn anhand von Schlüsselwörtern in einzelne Bestandteile, die er sodann in das ihm zugrundeliegende Objektmodell überführt, aus der die Kartengenerierung und -ausgabe erfolgt.

 

Der Mapserver als CGI-Programm

Das in einem Webserver (HTTP-Server) implementierte Konzept des CGI (Common Gateway Interface) stellt eine 'einfache' Möglichkeit bereit, über einen Webserver mit externen Programmen zu kommunizieren. Diese externen Programme erhalten also erst durch die Verbindung mit einem Webserver die benötigte Funktionalität, um ihre produzierten Ergebnisse über das Internet an Clients zu liefern. So gesehen ist ist der Mapserver kein Server, sondern wird erst durch die Zusammenarbeit mit HTTP-Server zu einem solchen qualifiziert.

CGI-Programme haben ihren Einsatzzweck vorrangig im Bereich dynamischer Inhalte, die als Webseiten ausgeliefert werden sollen. In Form übergebener Parameter stellen Clients Anfragen an einen Webserver, der das zuständige CGI-Programm startet und mit den Parametern füttert. Daraufhin generiert das CGI-Programm ein Ergebnis, das der Webserver dann Clients ausliefert.
Weitere Informationen zur Nutzung von CGI-Programmen im Apache HTTP-Server und die zugrundeliegende Funktionsweise finden sich in der CGI-Dokumentation zum Apache HTTP-Server.

Der Mapserver befindet sich also als ausführbares Programm in einem Verzeichnis, das dem HTTP-Server als CGI-Bereich bekannt ist. Über das HTTP (mittels POST oder GET-Anfrage) werden Parameter an den Mapserver übergeben, die die Programmausgabe (die zu generierende Karte) definieren. Der gängige Weg ist, diese Parameter mittels Form-Tags in einem HTML-Formular zu definieren. Die in bezug auf den UMN Mapserver definierbaren CGI-Parameter sind in der CGI-Reference zu finden.

Mann kann den Mapserver in verschiedenen Modi ansprechen. Der Modus 'map' liefert Karten als Bilder, wohingegen der Modus 'browse' HTML mit eingebettetem Kartenmaterial liefert. Der letztgenannte Modus ist die Standardeinstellung. Zur Verdeutlichung folgen drei simple Beispiele:



a) http://server/cgi-bin/mapserv?mode=map&map=mapfile.map

Die im Mapfile 'mapfile.map' definierte Karte wird
als Grafik zurückgeliefert.


b) http://server/cgi-bin/mapserv?map=mapfile.map&layers=all

Alle im Mapfile 'mapfile.map' definierten Layer werden angezeigt.


c) http://server/cgi-bin/mapserv?map=mapfile.map?layer=layername

Der Layer 'layername' im Mapfile 'mapfile.map' wird angezeigt.

 

Das Konzept der Templates und die Umsetzung im UMN Mapserver

Analog zu einer Schablone, in der die ausgestanzen Formen bereits festlegen, an welchen Stellen sich bestimmte Elemente befinden sollen, aber noch offen gelassen wird, wie genau diese Elemente gestaltet sind, legt man mittels Templates die Stellen in einem Internetdokument (bspw. einer HTML-Datei) fest, in die später Inhalte eingefügt werden sollen und lässt die Ausprägung dieses Inhalts offen.
Im Falle des UMN Mapservers stehen spezielle Schlüsselwörter zur Verfügung, die als 'Platzhalter' in ein HTML-Dokument gesetzt werden können. Der Mapserver liest dieses HTML-Template ein, ersetzt die Platzhalter auf Basis ihm zur Verfügung stehender Parameter und liefert dann reines HTML mit den generierten Inhalten zurück. Die dabei möglichen Schlüsselwörter sind der Template-Referenceentnehmbar.

Abbildung 2 fasst die oben erläuterten Aspekte noch einmal in einer Skizze zusammen.

Abb. 2: Verwendung des UMN Mapservers als CGI-Programm und die grundlegenden Abläufe

 

Beispiele in Form kleiner 'Rezepte'

Durch die einzelnen Links gelangt man jeweils zur Kartenansicht. Dort kann man sich dann jeweils die zugrundliegenden Dateien (Mapfile und HTML-Template) in dokumentierter Form anzeigen lassen.

1. Anzeigen einer Karte mit einem Layer

2. Hinzufügen von Maßstab und Referenzkarte

3. Einbinden einer Legende (in unterschiedlicher Weise)

Die anzuzeigenden Bestandteile der zu erzeugenden Legende werden hauptsächlich über die Klassendefinitionen in den Layern des Mapfiles definiert. Legenden können auf drei unterschiedliche Arten in das auszuliefernde HTML-Dokument einbettet werden:

1. direkt in der Karte

2. als separate Grafik

3. als eigenständiger HTML-Block

Bei der Erzeugung einer HTML-Legende kommt das Konzept der Templates erneut ins Spiel. Den Vorgaben des Mapserver HTML Legend HOWTO folgend kann ein 'Legenden-Template' erstellt werden, das über das Schlüsselwort TEMPLATE dem Legend-Objekt im Mapfile zugeordnet wird.

4. Einbinden unterschiedlicher Geodatenbestände (Vektor- und Rasterdaten, GeoDB, Grass-Intern)

Natürlich möchte man auch andere Geodatenformate als nur Shapefiles in Mapserver-Anwendungen einbinden. Der UMN Mapserver unterstützt direkt sowie unter Nutzung der Softwarebibliotheken GDAL (für Rasterdaten) und OGR (für Vektordaten) viele gängige Formate. Dokumentiert ist dies im Raster-Howto und im OGR-Howto. Im letztgenannten Dokument wird auch auf die Einbindung von Geodatenbeständen aus Datenbanken eingegangen. Weiterhin ist es möglich, Raster- und Vektordaten direkt aus einer GRASS-Datenbank in eine Mapserver-Anwendung einzubinden.

5. Navigation

Nun kommen Formulare zum Einsatz, um das Zoomen in die Karte und das Verschieben (PAN) der Karte zu ermöglichen. Es ist allerdings Vorsicht geboten: Nachdem die Webseite hoch-/runtergescrollt wurde, sind nicht alle Browser in der Lage, die Imagekoordinaten nach Klick in die Karte korrekt an den Server weiterzugeben! Teilweise wird "0" für img.y angegeben und es folgt eine ungewollte Kartendarstellung!

6. Labels und Symbole

Nach dem hereinzoomen in die Landkreise werden die Labels (Landkreisnamen) auf denSymbolen angezeigt, die Symbole bestehen in diesem Beispiel nur aus weissen Rechtecken, die hinter den Labels erscheinen. Die Beschriftungen und das Layout für die Seen bestehen hier nur aus Label-Definitionen.

7. Abfragen/Datenausgabe aus dbf-files

Auch hier werden wieder Templates eingesetzt. Es muss mindestens ein Abfragedokument erstellt werden. In diesem Beispiel werden zusätzlich ein Header und ein Footer (zur Mehrfachnutzung) eingesetzt. Ebenfalls besteht hier das unter 5. angesprochene Browser-Problem, nach dem Scrollen der Webseite wird nach einem Klick auf das gesuchte Objekt eine Fehlermeldung ausgegeben!