
\chapter{Dynamische Karten im WWW (Web Mapping)}
\label{web_mapping_de}
\subsubsection{Aufgabenstellung}
Web Mapping bietet die Möglichkeit, Rasterkarten und/oder Vektorkarten
interaktiv in einem Datennetz, meist dem Internet, zu präsentieren.
Typische Grundfunktionen sind zoomen und verschieben der Karte
(Navigation auf der Karte), und das Verbinden von Hyperlinks (URLs)
mit Orten die in der Karte dargestellt sind.

\subsubsection{Beispieldaten}
Bei der Anwendung MapIt! werden die im Programmpaket enthaltenen 
Beispieldaten verwendet.\newline
Für Mapserver werden Daten des Craterlakes aus den Kapiteln \ref{computing_contur_lines_de}
Seite \pageref{computing_contur_lines_de:grass} und \ref{georeferencing_de}
Seite \pageref{georeferencing_de:grass} sowie weitere Datensätze (Shapefiles "uber Stra"sen und
H"ohenlinien) des USGS Crater Lake Data 
Clearinghouse\footnote{http://craterlake.wr.usgs.gov/dlg.html} verwendet.


%\subsubsection{Weitere Verwendung der Beispieldaten}

\section{L"osung mit MapIt!}
\label{web_mapping_de:mapit!}
Es wurde MapIt! 1.0.1-1 unter einer Debian GNU/Linux
Installation (woody) und unter Windows 2000 verwendet.

Das Programm {\em MapIt!} bietet die Möglichkeit via Web-Browser auf
Rasterkarten zu navigieren, hinein- und herauszuzoomen sowie
darzustellende Objekte/Objektklassen auszuwählen und auf der
Karte zu identifizieren. Es können vorhandenen Webserver durch
cgi, fastcgi oder Python-Modul benutzt werden oder um schnell
Ergebnisse zu erzielen, kann der gleich
mitgelieferte, in Python programmierte Webserver benutzt werden.
Da {\em MapIt!} durch die systemunabhängige Programmierung in Python
sowohl unter GNU/Linux als auch unter Windows läuft können
die aufbereiteten Daten problemlos zwischen diesen Systemen getauscht werden. 

\subsection{Vorbereitung}
Um auf schnellem Wege zu Ergebnissen zu kommen bietet es sich sowohl
unter Windows wie auch unter GNU/Linux an, die 
unter\footnote{http://www.mapit.de/download.de.html} vorhandene
Schnellinstallation auszuf"uhren, die gleichzeitig einen
Beispieldatensatz enthält. Diese Beispieldaten ersetzt man Schritt für
Schritt mit den eigenen und hat so sehr schnell und einfach
beispielsweise eine Karte oder ein Luftbild/Orthophoto über
ein Netzwerk serviert.

\paragraph{GNU/Linux}
Nachdem sowohl die Mapit- und python-imaging rpms\index{rpm}
 mit {\tt rpm -i Dateiname} installiert wurden kann das 
Skript {\tt mapitdemo} unter {\em /opt/mapit} ausgeführt werden.\\

  \begin{centering}
  \Fig{
  \includegraphics[width=0.8\textwidth]{web-mapping/mapit-1.eps}}
  {Screenshot MapIt! 1}
  {Vom MapIt! Webserver generierte Seite mit präsentierter Karte "`Herne"'}\label{mapit_1}
  \end{centering}
	
\nomenclature{\bf rpm}{\input{glossary-de/glossary-rpm-de}}
\nomenclature{\bf IP-Adresse}{\input{glossary-de/glossary-ipadresse-de}}
\nomenclature{\bf HTTP}{\input{glossary-de/glossary-http-de}}
\nomenclature{\bf URL}{\input{glossary-de/glossary-url-de}}


\begin{kommando}
\begin{verbatim}
grassuser@xml-2:/opt/mapit > mapitdemo

Open http://127.0.0.1:31415/index.html in your WebBrowser to start.
Hit Ctrl-C twice in this Window to stop.

You will see detailed log information in this window.
If you get an error message, check whether there is an
old mapitdemo still running.
Serving HTTP on port 31415 ...
intevation.de - - [18/Oct/2001 13:57:42] "GET / HTTP/1.1" 200 -
intevation.de - - [18/Oct/2001 13:57:43] code 404, message
File not found
intevation.de - - [18/Oct/2001 13:57:43] "GET /favicon.ico
HTTP/1.1" 404 -
intevation.de - - [18/Oct/2001 13:57:44] "GET /simple/Icons/
top.fancy.png HTTP/1.1" 200 -
intevation.de - - [18/Oct/2001 13:57:44] "GET /simple/Icons/
left_top.fancy.png HTTP/1.1" 200 -
intevation.de - - [18/Oct/2001 13:57:44] "GET /simple/Icons/
right_top.fancy.png HTTP/1.1" 200 -
\end{verbatim}
\end{kommando}

Jetzt kann ausgehend von dem lokalen Server als auch von jedem Rechner, zu dem
eine http - Verbindung besteht, die vom Webserver generierte Seite mit der
präsentierten Karte aufgerufen werden (Abb. \thechapter.\ref{mapit_1}).
Dies geschieht indem man in einem Webbrowser den {\em MapIt!} - Webserver
auf dem Port 31415 anwählt. Laufen Webserver und Webbrowser auf einem
Rechner, so kann MapIt! durch Aufrufe wie {\tt http//:localhost:31415} 
oder  {\tt http//:127.0.0.1:31415} 
oder auch {\tt http//:IP-Adresse des Rechners:31415}. 
Für einen Rechner im Netzwerk wird die IP-Adresse des Rechners
mit angehängtem Port aufgerufen {\tt http//:IP-Adresse des Rechners:31415}.  
Die an der Kommandozeile des Webservers ausgegebenen folgenden
Zeilen , zum Beispiel 
{\em intevation.de - - [18/Oct/2001 11:29:53] "GET / HTTP/1.0" 200 -}
geben Auskunft darüber das von einem Rechner der intevation.de Domain aus 
der {\em MapIt!} - Webserver angesprochen wird.
\paragraph{Windows}
Ist die Installationsroutine unter Windows erfolgreich abgeschlossen
worden, kann aus dem {\em Startmenu} heraus über den Menüpunkt
{\em MapIt!} der Webserver aufgerufen werden.
Gleichzeitig wird der als Grundeinstellung in Windows
konfigurierte Webbrowser gestartet. Auch hier gibt der Webserver Informationen
"uber die ankommenden Anfragen an die Kommandozeile aus (Abb. \thechapter.\ref{mapit_2}).

  \begin{centering}
  \Fig{
  \includegraphics[width=0.8\textwidth]{web-mapping/mapit-2.eps}}
  {Screenshot MapIt! 2 - Status unter Windows}
  {Vom MapIt! Webserver ausgegebene Statusinformationen unter Windows}\label{mapit_2}
  \end{centering}

\subsection{Struktur des Beispieldatensatzes}
Ein erstellter Datensatz für {\em MapIt!} kann sowohl unter Windows als auch
unter GNU/Linux verwendet werden. Die Steuerung von {\em MapIt!}
geschieht durch Konfigurationsdateien.
\paragraph{Die Konfigurationsdatei {\em mapconfig.py}}
In der Datei {\em mapconfig.py} wird die grundlegende
Konfiguration von {\em MapIt!} festgelegt. In der Sektion
{\em The Tile Data} definiert man unter
{\em \_base\_dir = '../../examples/herne/'} den Ort des 
Verzeichnises in dem die {\em Tiles} gespeichert werden.
Die Zeile {\em scale = 250000} gibt die Aufl"osungsstufe an, die als 
Grundeinstellung bei jedem Auffruf der Webseite geladen wird.
Soll das Zentrum der Darstellung nicht in der Mitte der
Bilddatei liegen kann "uber {\em default\_x = , default\_y = }
ein abweichendes Darstellungszentrum definiert werden.
Die Art der Bilddateien wird in der Zeile {\em tile\_ext = '.png'}
in diesem Fall auf .png - Dateien festgelegt.

\begin{kommando}
\begin{verbatim}
#
# The Tile Data
#
# _base_dir is only used within this file
# this path points to the directory containing the data
# (tiles, markers, etc.)
_base_dir = '../../examples/herne/'

# The default scale to use
scale = 250000
\end{verbatim}\\[-\bigskipamount]\begin{verbatim}
# The default location to use. None means the center of the map
default_x = None
default_y = None
\end{verbatim}\\[-\bigskipamount]\begin{verbatim}
# data_dir is the name of the directory where the map tiles can be
# found.
tile_dir = _base_dir + '/tiles'

# The file extension of the tile files
tile_ext = '.png'
\end{verbatim}
\end{kommando}\

Die Sektion {\em \# Output format and size} steuert die Ausgabe des
Webservers, unter anderem wird mit {\em output\_pil\_format = 'JPEG'}
die Python Imaging Libary (pil) angewiesen als Ausgabeformat ein .jpeg
zu erzeugen. {\em \# Default image size in pixels} legt
die Gr"o"se des Kartenfensters fest das vom Webserver an den Browser
geliefert wird.\\

\nomenclature{\bf jpeg}{\input{glossary-de/glossary-jpeg-de}}
\begin{kommando}
\begin{verbatim}
# Output format and size

# The MIME type of the format
output_mime = 'image/jpg'

# The PIL name of the format. This is passed to a PIL Image's save
# method. Obviously the values of output_pil_format and 
# output_mime have to match
output_pil_format = 'JPEG'

# The values needed for PNG output
#output_mime = 'image/png'
#output_pil_format = 'PNG'

# Default image size in pixels
image_width = 400
image_height = 400
\end{verbatim}
\end{kommando}

\paragraph{Das Verzeichnis {\em tiles}}
Die darzustellenden Bilddaten
befinden sich in dem Beispieldatensatz in dem Verzeichnis
{\em examples/herne/tiles}. Hier gibt es nun 4 Unterverzeichnise
in denen sich die Bilddaten für jeweils eine
Vergrößerungsstufe befinden. Diese Vergrößerungsstufen
werden von MapIt! dem numerischen Wert nach geordnet.
Die Benennung muß nicht dem tatsächlichen
Maßstab der Daten folgen, dies h"atte wenig Sinn da sich je nach eingestellter 
Bildschirmaufl"osung die gr"o"se der am Browser ausgegebenen Bilddaten "andert.
In diesen "`Tiles"\ (engl. für Kacheln) - Verzeichnissen befinden sich die 
Bilddaten in Form von einer oder mehreren Kacheln gleicher Gr"o"se.
Das Auseinanderschneiden in Kacheln ist hilfreich, um den Bildaufbau 
durch den Webserver zu beschleunigen. Es muß nicht mehr das ganze Bild
einer Zoomstufe geladen werden, um den angeforderten Teilbereich an den
Webbrowser zu liefern, sondern nur die betroffenene Kacheln.
Dieses wird im Ordner {\em /opt/mapit/examples/herne/tiles/10000} deutlich.
Die Kacheln werden ausgehend von der linken unteren Ecke aufsteigend 
in der Form {\em horizontale Nummerierung x vertikale Nummerierung . Dateierweiterung}
benannt.{\em 1x1.png} ist also die linke untere Kachel in der das Bildmaterial
im PNG - Format gespeichert ist. {\em 5x3.png} wäre somit die Kachel in der 
dritten Zeile von unten an gezählt die fünfte Kachel vom linken 
Rand aus gesehen. 
\paragraph{Informationsdatei zu den Kacheln}
In jedem Ordener Unterhalb des {\em tiles} - Verzeichnises in dem
Bilddaten einer Aufl"osungsstufe gespeichert sind ist eine 
Informationsdatei vorhanden in der Daten zu den Kacheln 
gespeichert sind. Der Aufbau dieser {\em info} - Dateien kann mit jedem
Editor betrachtet werden oder auch mit dem Befehl {\tt cat Dateiname}.\\

  
\begin{kommando}
\begin{verbatim}
bash-2.05$ cat info

2000
2000
# [1,1]
416341578.400
571862863.000
416510911.733
572032196.333
# [1,2]
416341578.400
572032196.333
416510911.733
572201529.667
# [1,3]
416341578.400
572201529.667
416510911.733
572370863.000
\end{verbatim}
\end{kommando}

Die ersten beiden Zahlen bezeichnen die Ausdehnung der einzelnen
Kacheln, angegeben in Pixel, in diesem Fall also 2000 * 2000 Pixel.
Beginnend mit jedem {\em \#} wird in den eckigen Klammern eine 
Kachel benannt für die im folgenden die linke untere und rechte obere
Bildecke mit Koordinatenwerten bezeichnet wird. Hierdurch können
im weiteren Verlauf Symbole direkt über Koordinatenangaben
(in diesem Fall Gau"s-Kr"uger) in der Karte in allen
Aufl"osungsstufen plaziert werden. Da die Auflösungsstufe
100000 Beispielsweise nur durch eine Kachel
repräsentiert wird, hat die info - Datei die folgende Form. Die
Gr"o"se der Kachel Nummer {\em 1x1} ist 1000 * 1000 Pixel,
in den nächsten 4 Zeilen sind jeweils wieder die Koordinatenpaare
der linken unteren und rechten oberen Ecke aufgeführt.\\


\begin{kommando}
\begin{verbatim}
1000
1000
# [1,1]
416341578.400
571862863.000
417188245.067
572709529.667
\end{verbatim}
\end{kommando}

\paragraph{Das Verzeichnis {\em markers}}
In diesem Verzeichnis werden die Symbole im .png - Format gespeichert,
die in der dargestellten Bilddatei einen Ort kennzeichnen. 
\paragraph{Das Verzeichnis {\em icons}}
Das Verzeichnis Icons beeinhaltet alle zur Webseitengenerierung
notwendigen Elemente wie Schalter, Rahmen, Pfeile u.s.w. wiederum
im .png - Format.
\paragraph{Die Konfigurationsdatei {\em markerdefs}}
In dem Beispieldatensatz ist diese Datei einmal in deutsch 
(matkerdefs.de) und in englisch (markerdefs.en) vorhanden.
In ihnen werden die auszugebenen Objekte definiert und es wird
bestimmt wo und wie sie dargestellt werden. Die Datei ist nach Gruppen 
gegliedert aufgebaut. Leere Zeilen und Zeilen, die mit einem Doppelkreuz
(\#) anfangen, werden ignoriert. Eine Gruppe wird durch eine Zeile
definiert, die mit dem Schlüsselwort "group:"\ anfängt, gefolgt von
vier durch Komma getrennten Werten. Der erste Wert {\em db} ist der Name
des zu verwendenden Symbols aus dem Verzeichnis {\em markers}.
Der zweite Wert bezeichnet die Gruppe mit einem eindeutigen Namen {\em bahnhof}.
in dem Leerraum zwischen den beiden folgenden Kommatas kann eine URL
in der Form {\em http://www.mapit.de} eingegeben
werden die beim anklicken eines Objektes der Gruppe aufgerufen
wird f"u das keine spezifische URL angegeben ist. Der vierte Eintrag
schließlich ist der Name unter dem die Gruppe auf der generierten 
Webseite erscheint. 
\\

\begin{kommando}
\begin{verbatim}
group: db,bahnhof,,Bahnhöfe
416837551.50,572293916.00,db,bahnhof,,Herne
416702461.80,572512765.30,db,bahnhof,,Recklinghausen Süd
416738098.40,572018523.00,db,bahnhof,,Bochum-Nokia
416479774.90,572187957.70,db,bahnhof,,WANNE-EICKEL HBF
\end{verbatim}\\[-\bigskipamount]\begin{verbatim}
group: ubahn,ubahn,,U-Bahn Stationen
416851273.00,572306182.00,ubahn,ubahn,,U Herne
416869341.00,572269123.00,ubahn,ubahn,,U Herne Mitte
416823616.00,572396147.00,ubahn,ubahn,,U Schloß Strünkede
416853251.00,572139861.00,ubahn,ubahn,,U Hölkeskampring
416812730.00,572074791.00,ubahn,ubahn,,U Herne-Berninghausstrasse
416895683.00,572206515.00,ubahn,ubahn,,U An der Kreuzkirche
416775106.00,571969359.00,ubahn,ubahn,,U Bochum-Rensingstrasse
416771838.00,571920835.00,ubahn,ubahn,,U Riemke Markt
\end{verbatim}
\end{kommando}

Unterhalb des Gruppendefinition werden Zeilenweise die Objekte jeder 
Gruppe aufgeführt. Begonnen wird dabei mit dem jeweiligen
Koordinatenpaar das die Position des Objektes angibt. Weiter wird wieder
das Symbol aus dem Verzeichnis {\em markers} angegeben, hier kann
durchaus für jedes Objekt einer Gruppe ein unterschiedliches
Symbol definiert werden, der Gruppenname{\em bahnhof},
Platz für einen URL - Aufruf, und als letzte Angabe ein Name
für das Objekt der in der Webseite eingeblendet wird wenn
der Cursor über dem Objekt steht. 
\paragraph{Die Datei {\em simple.de.template}}
Auch diese Datei gibt es im Beispieldatensatz in einer deutschen 
{\em simple.de.template} und englischen {\em simple.en.template} Version.
In ihr wird der Aufbau der HTML - Seite festgelegt, die von
dem Webserver an den Browser "ubermittelt wird.
\nomenclature{\bf HTML}{\input{glossary-de/glossary-html-de}}
\subsection{Bildkacheln selbst erzeugen}
Um aus einer vorhandenen Bilddatei ein {\em tiles} - Verzeichnis
mit beliebig vielen Vergr"o"serungsstufen zu erzeugen kann man das
Bildbearbeitungsprogramm seines Vertrauens bem"uhen, oder man benutzt
das Python - Skript {\em epscut} das sich unter {\em /opt/mapit/src/tools}
befindet. Dieses Skript erzeugt aus einer Postskript (.ps) - Bilddatei
in eine angegebene Anzahl von Auflösungsstufen mit vorher zu definierender
Kachelanzahl. Gleichzeitig wird eine passende Info - Datei erzeugt, so
das anstatt des urspr"unglichen {\em tiles} - Verzeichnisbaumes
einfach der neu erzeugte verwendet werden kann.
\paragraph{Anpassen des {\em epscut} Skriptes}
In Zeile 275 des Skriptes wird die Anzahl der Auflösungsstufen und die 
jeweilig zu erzeugende Anzahl von Kacheln bestimmt. Bei der Angabe
 von {\em factors = (1, 2, 4, 8)} würden also 4 Aufl"osungsstufen mit 
jeweils 1, 4, 16 und 64 Kacheln erzeugt. Die Anzahl der Kacheln ergibt
sich aus dem Quadrat der angegebenen Faktoren. Im folgenden Beispiel sind
als Faktoren {\em factors = (1, 2)} angegeben, m"oglich w"aren aber
auch {\em factors = (1, 2, 3, 5)} was natürlich 1, 4, 9 und 25 Kacheln 
erzeugen würde.
Zum Aufruf wird die zu bearbeitende {\em 179.ps} - Datei einfach mit in das 
Verzeichnis kopiert indem sich {\em epscut} befindet.
Mit dem Aufruf {\tt ./epscut 179.ps} wird das Skript gestarted und liefert 
eine Folge von Textausgaben an der Kommandozeile die mit der Ausgabe 
der benutzten Transformationsparameter abschließt. Die erzeugten
Kacheln liegen in dem {\em /opt/mapit/src/tools} - Verzeichnis 
in einem Ordner {\em 179}.\\

\begin{kommando}
\begin{verbatim}
bash-2.05$ ./epscut 179.ps
gs -sDEVICE=ppmraw -r72 -dNOPAUSE -dSAFER -q  -sOutputFile=/tmp/@821.1
-g400x400 -c "0.035730 0.035733 scale -14.000000 -14.000000 
translate /oldshowpage /showpage load def /showpage {} 
def"  -f179.ps -c oldshowpage quit
writing 179/2/1x1.png
gs -sDEVICE=ppmraw -r72 -dNOPAUSE -dSAFER -q  -sOutputFile=/tmp/@821.2
-g400x400 -c "0.071460 0.071467 scale -14.000000 -14.000000
translate /oldshowpage /showpage load def /showpage {}
def"  -f179.ps -c oldshowpage quit
writing 179/1/1x1.png
gs -sDEVICE=ppmraw -r72 -dNOPAUSE -dSAFER -q  -sOutputFile=/tmp/@821.3
-g400x400 -c "0.071460 0.071467 scale -5611.500000 -14.000000
translate /oldshowpage /showpage load def /showpage {}
def"  -f179.ps -c oldshowpage quit
writing 179/1/2x1.png
gs -sDEVICE=ppmraw -r72 -dNOPAUSE -dSAFER -q  -sOutputFile=/tmp/@821.4
-g400x400 -c "0.071460 0.071467 scale -14.000000 -5611.000000
translate /oldshowpage /showpage load def /showpage {}
def"  -f179.ps -c oldshowpage quit
writing 179/1/1x2.png
gs -sDEVICE=ppmraw -r72 -dNOPAUSE -dSAFER -q  -sOutputFile=/tmp/@821.5
-g400x400 -c "0.071460 0.071467 scale -5611.500000 -5611.000000
translate /oldshowpage /showpage load def /showpage {} 
def"  -f179.ps -c oldshowpage quit
writing 179/1/2x2.png
Transformation from EPS-coordinates (px, py)
to MapIt! coordinates (mx, my):
mx = 0.071460473425636439 * (px - 14)
my = 0.07146685724495265 * (py - 14)
bash-2.05$
\end{verbatim}
\end{kommando}

\subsection{Navigation im Browser}
Wird eine von {\em MapIt!} erzeugte Seite in in einem Webbrowser
aufgerufen, ist die weitere Navigation und Benutzung denkbar einfach.
Das Zoomen geschieht "uber die "`Lupen-Icons"', in einer vergr"o"serten
Ansicht kann der Bildausschnitt mit den "`Pfeil-Icons"'\ oder durch
anklicken des zu zentrierenden Punktes in der Karte gew"ahlt werden.
Die in der "`Markierungsliste"\ angew"ahlten Objektklassen 
({\em groups}) werden durch den Button "`Anzeigen"\ in aufgerufen 
(Abb. \thechapter.\ref{mapit_3}).

  \begin{centering}
  \Fig{
  \includegraphics[width=0.8\textwidth]{web-mapping/mapit-3.eps}}
  {Screenshot MapIt! 3}
  {Vom MapIt! Webserver generierte Seite mit präsentierter Karte "`Herne"\ und aufgerufenen Markierungen für "`Bahnhöfe"\ , "`Krankenh"auser"\ und "`Post"amter"'}\label{mapit_3}
  \end{centering}


\section{L"osung mit MapServer}
\label{web_mapping_de:mapserver}
Es wurde {\em MapServer} 3.5 (nightly build vom 30.Oktober 2001) unter einer SuSE GNU/Linux Installation (7.0) und GRASS 5.0pre2 unter einer Debian GNU/Linux
 Installation (woody) verwendet.\\


Sollen nicht nur reine Bilddateien in einem Netzwerk zug"anglich
gemacht werden sondern auch Vektor- oder Sachdaten, so kann man 
{\em MapServer} benutzen. Einen kleinen Einblick in die Vielzahl der 
mit {\em MapServer} m"oglichen Anwendungen gewinnt man 
unter\footnote{http://mapserver.gis.umn.edu/gallery.html}.
F"ur das FreeGIS Tutorial greifen wir auf die bekannten Daten
des "`Craterlake"'\ zurück\footnote{http://craterlake.wr.usgs.gov/}.
Hier können neben den Bilddateien auch Vektordaten, Beispielsweise
in Form von H"ohenlinien "`Hypsography"'\, Verwaltungsgrenzen 
"`Boundary"\ oder Stra"sen "`Road"'\ als Shapefiles\index{Shapefiles}
 heruntergeladen werden.
\subsection{Vorbereitung}
Zur Installation auf einem GNU/Linux System entpackt man
die {\em MapServer} Distribution mit dem Kommando {\tt tar -zxf ms\_3.5.tar.gz},
wechselt mit {\tt cd mapserver} in das erzeugte Verzeichnis und
erstellt mittels {\tt ./configure} ein Makefile.
Die dem {\tt ./configure} angeh"angten Optionen
ergänzen das eigentlich erzeugte Programm um weitere Funktionen
wie zum Beispiel das Erkennen und Erzeugen von {\tt .tiff} oder{\tt .png}
- Dateien. Eine Liste mit den m"oglichen Optionen erh"alt man durch
den Befehl {\tt ./configure --help}.\\

\nomenclature{\bf Shapefiles}{\input{glossary-de/glossary-shape-de}}
\begin{kommando}
\begin{verbatim}
freegis@xml-2:~/tmp/mapserver > ./configure --with-png --with-jpeg
--with-tiff
loading cache ./config.cache
checking for gcc... (cached) gcc
checking whether the C compiler (gcc  ) works... yes
checking whether the C compiler (gcc  ) is a cross-compiler... no
checking whether we are using GNU C... (cached) yes
checking whether gcc accepts -g... (cached) yes
checking for c++... (cached) c++
checking whether the C++ compiler (c++  ) works... yes
checking whether the C++ compiler (c++  ) is a cross-compiler... no
checking whether we are using GNU C++... (cached) yes
checking whether c++ accepts -g... (cached) yes
checking for ranlib... (cached) ranlib
checking for flex... (cached) lex
checking for yywrap in -ll... (cached) no
checking for bison... no
checking for byacc... no
checking if compiler supports -R... (cached) no
checking if compiler supports -Wl,-rpath,... (cached) yes
checking for exp in -lm... (cached) yes
checking how to run the C preprocessor... (cached) gcc -E
checking for ANSI C header files... (cached) yes
checking for strcasecmp... (cached) yes
checking for strncasecmp... (cached) yes
checking for strdup... (cached) yes
checking whether we should include JPEG support...
checking for jpeg_read_header in -ljpeg... yes
        using libjpeg from system libs.
...
checking for PHP/MapScript module options...
        PHP/MapScript module not configured.
creating ./config.status
creating Makefile
\end{verbatim}
\end{kommando}

Nachdem erfolgreichen Erzeugen eines Makefiles wird die
Übersetzung des Quelltextes in ausführbaren Code mit {\tt make}
gestartet.

\begin{kommando}
\begin{verbatim}
freegis@xml-2:~/tmp/mapserver > make
gcc -c -O2  -Wall -DIGNORE_MISSING_DATA  -DUSE_EPPL -DUSE_TIFF
-DUSE_JPEG -DUSE_GD_PNG -DUSE_GD_JPEG -DUSE_GD_WBMP -DUSE_GD_FT
-I/usr/local/include mapbits.c -o mapbits.o
gcc -c -O2  -Wall -DIGNORE_MISSING_DATA  -DUSE_EPPL
-DUSE_TIFF -DUSE_JPEG -DUSE_GD_PNG -DUSE_GD_JPEG -DUSE_GD_WBMP
-DUSE_GD_FT-I/usr/local/include
...
USE_GD_WBMP -DUSE_GD_FT       -I/usr/local/include
tile4ms.c -o tile4ms.o
gcc -O2  -Wall -DIGNORE_MISSING_DATA  -DUSE_EPPL -DUSE_TIFF
-DUSE_JPEG -DUSE_GD_PNG -DUSE_GD_JPEG -DUSE_GD_WBMP
-DUSE_GD_FT -I/usr/local/include tile4ms.o  -L.
-lmap -lgd -L/usr/local/lib -lgd -ljpeg
-lfreetype -lpng -lz  -ltiff -ljpeg -lfreetype
-lpng -lz  -ljpeg         -lm   -o tile4ms
freegis@xml-2:~/tmp/mapserver > cp mapserv /usr/local/httpd/cgi-bin/ 
\end{verbatim}
\end{kommando}
 
Die so erzeugte binäre "'cgi-Datei"'\ {\em mapserv} wird in
das entsprechende Verzeichnis des Web-Servers für "`cgi-skripte"  
kopiert, der hier angegebene Verzeichnispfad
{\em /usr/local/httpd/cgi-bin/} ist ein m"oglicher Ort.
Es ist darauf zu achten, da"s dieses "'cgi-Skript"'\
von jedermann ausgeführt werden kann. Nötigenfalls
k"onnen mit {\tt chmod 755 mapserv} die nötige
Berechtigung erteilt werden, diese muss natürlich auch für das
Verzeichnis {\em /usr/local/httpd/cgi-bin/} gelten.

\paragraph{Test des cgi-Skriptes}
Um das erstellte cgi-Skript und dessen Installation zu testen,
kann man mit einem beliebigen Browser das Skript direkt aufrufen
und sollte die Ausgabe {\em No query information to decode.
QUERY\_STRING is set, but empty.} bekommen (Abb. \thechapter.\ref{mapserver_1}).

\begin{centering}
\Fig{
\includegraphics[width=0.8\textwidth]{web-mapping/cgi-test.eps}}
{Screenshot der Testausgabe}
{Test des Mapserver cgi-Skriptes}\label{mapserver_1}
\end{centering}

\paragraph{Bildmaterial}Als grundlegende Bilddateien k"onnen die
im Kapitel \ref{sec:rasterdaten_geokodieren} georeferenzierten
Orthophotos und Karten des Gebietes "`Craterlake"\ genutzt werden.
Alternativ liegen die entsprechenden Dateien dem Tutorial bei 
oder k"onnen von der Webseite heruntergeladen werden.
{\em MapServer} unterstützt hierbei zum Beispiel {\em .tiff} - Dateien
mit dazugehörigen {\em .tfw} - Dateien (Tiff World File) deren 
Dateiendung allerdings in {\em .wld} ge"andert werden mu"s.
Beispielhaft wird nun der Export einer Rasterdatei "`karte"'\ mit
zugeh"origer {\em .tfw} - Datei aus dem GIS - Programm GRASS 
beschrieben. Nachdem wie im Kapitel \ref{sec:rasterdaten_geokodieren}
 Seiten \pageref{sec:rasterdaten_geokodieren} ff beschrieben die
Bilddateien in GRASS importiert und georeferenziert wurden, 
geschieht der Export als {\em .tiff} - Datei mit dem Kommando
{\tt r.out.tiff -t input=karte output=karte} wobei die Option
{\em -t} das gew"unschte {\em .tfw} Worldfile erzeugt.

\begin{kommando}
\begin{verbatim}
GRASS:/spare/gisdata/grass/bin > r.out.tiff -t input=karte output=karte 
\end{verbatim}
\end{kommando}

Der Aufbau des Worldfile wird deutlich, wenn man es betrachtet.
Dazu wechselt man mittels {\tt cd } in das entsprechende 
Verzeichnis und ruft das Worldfile in einem Editor oder einem Dateibetrachter auf.

\begin{kommando}
\begin{verbatim}
GRASS:/spare/gisdata/grass/bin > r.out.tiff -t input=karte output=karte 
GRASS:~ > cd /spare/gisdata/craterlake
GRASS:/spare/gisdata/craterlake > cat karte.tfw 

                  30.007278020378457
                   0.000000000000000
                   0.000000000000000
                 -30.004992867332383
              550855.003639010246843
             4775079.997503566555679

GRASS:/spare/gisdata/craterlake >
\end{verbatim}
\end{kommando}

Die erste Zeile {\em 30.0072} gibt die horizontale Pixelgr"o"se
in Metern an, die n"achste 2 Zeilen sind Rotations - Koeffizienten
die im Normalfall gleich Null sind. In der vierten Zeile ist die 
vertikale Ausdehnung eines Pixels angegeben, da bei Bilddateien
im allgemeinen der Ursprung in der oberen linken Ecke ist hat 
diese Angabe ein negatives Vorzeichen. Die beiden letzten Zeilen
enthalten die Koordinaten des Zentums des obersten linken Pixels,
in diesem Fall UTM Koordinaten der Zone 10.

\subsection{Erstellung der {\em MapServer} - Anwendung}
In einem für den Webserver zug"anglichen Verzeichnis,
Beispielsweise\newline{\em /usr/local/httpd/htdocs/mapserver/ms\_demo} wird eine
Verzeichnisstruktur mit den Verzeichnisen {\em data}, {\em
graphics} und {\em symbols} erzeugt. Dies geschieht durch den Befehl
{\tt mkdir}. In das Verzeichnis {\em data} werden die Shapefiles
abgelegt, in {\em graphics} die {\em .tiff} - Files und {\em .wld} -
Files. Das Umbenennen der {\em .twf} in {\em .wld} - Dateien
geschieht mittels des Move Kommandos {\tt mv karte.twf karte.wld}.
Das Verzeichnis {\em symbols} enth"alt die n"otige Symboldateien.
Weiter werden 3 {\em .html} Dateien vom cgi - Skript benötigt, um mit
ihrer Hilfe die Webseiten zu generieren und sie vom Webserver an den 
Browser zu servieren. Eine mit dem Kommando {\tt dir} erzeugte
Datei"ubersicht sollte "ahnlich der folgenden sein.\\

\begin{kommando}
\begin{verbatim}
freegis@xml-2:/usr/local/httpd/htdocs/mapserver/ms_demo > dir
insgesamt 40
drwxr-xr-x    4 freegis  users        4096 Okt 30 12:35 data
-rwxr-xr-x    1 freegis  users        1875 Okt 30 15:13 demo.html
-rwxr-xr-x    1 freegis  users        4021 Okt 30 16:44 demo.map
-rwxr-xr-x    1 freegis  users          83 Okt 30 09:46 demo_header.html
-rwxr-xr-x    1 freegis  users        1276 Okt 30 10:49 demo_init.html
drwxr-xr-x    3 freegis  users        4096 Okt 30 15:29 graphics
drwxr-xr-x    2 freegis  users        4096 Okt 30 09:46 symbols
\end{verbatim}
\end{kommando}

\paragraph{demo\_init.html}Das führende {\em d} in einigen 
Zeilen zeigt, dass es sich um
Verzeichnisse (directories) und nicht um Dateien handelt.
Beginnen wir mit der Datei {\em demo\_init.html}, um sie zu
erstellen, "offnet man den Editor der Wahl und erzeugt folgenden
Text, oder man kopiert die Datei von der dem Buch beiliegenden CD
oder von der Webseite des Free GIS Tutorials.\\

\begin{kommando}
\begin{verbatim}
freegis@xml-2:/usr/local/httpd/htdocs/mapserver/ms_demo > cat \
demo_init.html

<html>
<head><title>MapServer Demo Interface</title></head>
<body bgcolor="#FFFFFF">
 
<center><h2>MapServer Demo Interface</h2></center>
<p><hr><p>
Click on the initialize button to fire up the demo. 
<p>
 
<form method=GET action="/cgi-bin/mapserv">
 
<input type="hidden" name="map" value="/usr/local/httpd
/htdocs/mapserver/demo.map">
<input type="hidden" name="zoomsize" value=2>

<center><input type="submit" value="Initialize"></center>
\end{verbatim}\\[-\bigskipamount]\begin{verbatim}  
</form>

<p><hr><p>
 
</body></html>
\end{verbatim}
\end{kommando}

Wird diese in einem Webbrowser mit
{\em http://localhost/msdemo/mapserver/demo\_init.html} aufgerufen
sollte sich ein Bild "ahnlich (Abb \thechapter.\ref{mapserver_2}) ergeben.

\begin{centering}
\Fig{
\includegraphics[width=0.8\textwidth]{web-mapping/demo-init.eps}}
{Screenshot Mapserver Aufruf}
{Vom Webserver generierte startseite demo\_init.html}\label{mapserver_2}
\end{centering}

\paragraph{demo\_header.html}Weiter wird eine Datei
{\em demo\_header.html} ben"otigt, die aber
nur den Text der Kopfzeile und die Grundfarbe zu generierenden
Webseite enth"alt. Entsprechend kurz ist der eigentliche Text
der Datei.

\begin{kommando}
\begin{verbatim}
freegis@xml-2:/usr/local/httpd/htdocs/mapserver/ms_demo > cat \
demo_header.html


<html>

<head><title>MapServer Demo Interface</title></head>
<body bgcolor=#FFFFFF>
\end{verbatim}
\end{kommando}

Die wichtigeren Dateien sind die {\em demo.html} in der das
eigentliche Aussehen der Webseite beschrieben wird und die {\em
demo.map} die die Verbindungen zu den darzustellenden Daten
definiert. Zuerst die {\em demo.html}\, die ein Template also 
ein Muster oder eine Schablone der Webseite beinhaltet. 

\begin{kommando}
\begin{verbatim}
freegis@xml-2:/usr/local/httpd/htdocs/mapserver/ms_demo > cat demo.html

<html>
<head><title>MapServer Demo Interface</title></head>
<body bgcolor=#FFFFFF>

<center><h1>MapServer Demo Interface</h1></center>
<hr>
<form method=GET action="/cgi-bin/mapserver/mapserv">

<center>
<table border=2 cellpadding=10 width=100%>
<tr>
<td align=center>
<INPUT NAME="img" TYPE="image" SRC="[img]" width=600 height=600></A><p>
<img src="[scalebar]">
</td>
<td>

<input type="submit" value="Refresh/Query"><p>

<input type="radio" name="mode" value="browse" checked>
<b>Browse map</b><br>
<input type="radio" name="mode" value="query"> <b>Query feature</b><br>
<input type="radio" name="mode" value="nquery"> 
<b>Query multiple features</b>

<hr>
<center><a href="/scripts/mapserv?map=[map]&mapext=
[minx]+[miny]+[maxx]+[maxy]
&mode=nquery&[get_layers]">summarize</a></center>
<hr>

<p>
<b>Select Layers to Display: </b><br>
<select multiple name="layer" size=3>
<option value="crater" [crater_select]> Craterlake
<option value="craterluft" [craterluft_select]> Craterluft
<option value="contour" [contour_select]> Cratercontour
<option value="road" [road_select]> Road
<option value="boundaryline" [boundaryline_select]> Boundaryline 
<option value="boundarypolyline" [boundarypolyline_select]>
Boundarypolyline 
</select>

<p>
Zoom In <input type=radio name=zoomdir value=1 [zoomdir_1_check]> 
Pan <input type=radio name=zoomdir value=0 [zoomdir_0_check]>
Zoom Out <input type=radio name=zoomdir value=-1 [zoomdir_-1_check]>
<p>
Zoom Size <input type=text name=zoomsize size=4 value=[zoomsize]>
<p>
\end{verbatim}\\[-\bigskipamount]\begin{verbatim}
<font size=+1><b>Legend</b></font><br><hr>
<img src="[legend]"><hr>
<p>

<INPUT NAME="ref" TYPE="image" SRC="[ref]" border="0"></A><p>

</td>
</tr>
</table>
</center>

<input type="hidden" name="imgxy" value="299.5 299.5">
<input type="hidden" name="imgext" value="[mapext]">
<input type="hidden" name="map" value="[map]">

</form>

<p><hr><p>

</body></html>

freegis@xml-2:/usr/local/httpd/htdocs/mapserver/ms_demo >
\end{verbatim}
\end{kommando}

Jede einzelne Zeile erkl"aren zu wollen, würde den Rahmen diese
Kapitels sicherlich sprengen, deshalb wird nur auf die Zeilen
eingegangen, deren Editierung für diese MapServer Anwendung wichtig
erscheinen. Zu nennen wären hier:

\begin{kommando}
\begin{verbatim}
<option value="crater" [crater_select]> Craterlake
\end{verbatim}
\end{kommando}

Mit dieser Zeile wird ein "'Layer"\ aus der {\em demo.map} Datei
angegeben dessen Darstellung in Mapserver angew"ahlt werden kann.
Das "`crater"\ ist hierbei der Name des "`Layers"\ w"ahrend
"`Craterlake"\ der in MapServer erscheinende Name im Auswahlmenü
ist. Betrachtet man die Datei {\em demo.html} im Browser ohne Bearbeitung
durch das cgi - Skript, s"ahe sie so aus (Abb. \thechapter\ref{mapserver_3}).
Um diese leere Schablone nun mit Daten zu füllen, wird vom Webserver,
oder besser vom cgi - Skript, das der Webserver ausf"uhrt, die Datei
{\em demo.map} gelesen und die dort angegebenen Daten in die {\em
demo.html} eingetragen. Die {\em demo.html} für dieses Beispiel
sieht folgenderma"sen aus:

\begin{centering}
\Fig{
\includegraphics[width=0.8\textwidth]{web-mapping/demo-html.eps}}
{Screenshot der demo.html Datei}
{Ausgabe der demo.html Datei im Webserver}\label{mapserver_3}
\end{centering}


\begin{kommando}
\begin{verbatim}
freegis@xml-2:/usr/local/httpd/htdocs/mapserver/ms_demo > cat demo.map

# Start of map file
NAME DEMO
STATUS ON
SIZE 600 600
IMAGETYPE PNG 
EXTENT 550840.000000 4733028.000000 592070.000000 4775095.000000
UNITS METERS
SHAPEPATH "/usr/local/httpd/htdocs/mapserver/ms_demo/data/"
IMAGECOLOR 255 255 255

#LABELOVERLAP FALSE

# Start of web interface definition
WEB
  HEADER demo_header.html
  TEMPLATE demo.html
  MINSCALE 100
  MAXSCALE 1550000
  IMAGEPATH "/usr/local/httpd/htdocs/mapserver/tmp/"
  IMAGEURL "/mapserver/tmp/"
  LOG "/tmp/mapserver.log"
END
\end{verbatim}\\[-\bigskipamount]\begin{verbatim}
# Start of reference map
REFERENCE
  IMAGE graphics/karte.png
EXTENT 550840.000000 4733028.000000 592070.000000 4775095.000000
  SIZE 169 172
  STATUS ON
  COLOR -1 -1 -1
  OUTLINECOLOR 255 0 0
END

# Start of legend
LEGEND
  KEYSIZE 18 12
  LABEL
    TYPE BITMAP
    SIZE MEDIUM
    COLOR 0 0 89
  END
  STATUS ON
END

# Start of scalebar
SCALEBAR
  IMAGECOLOR 255 255 255
  LABEL
    COLOR 0 0 0 
    SIZE SMALL
  END
  SIZE 350 5
  COLOR 255 255 255
  BACKGROUNDCOLOR 0 0 0
  OUTLINECOLOR 0 0 0
  UNITS KILOMETERS 
  INTERVALS 5
  STATUS ON
END

# Start of layer definitions

LAYER
  NAME karte
  TYPE RASTER
  STATUS ON
  DATA karte.tif
  OFFSITE 0
END#LAYER
\end{verbatim}\\[-\bigskipamount]\begin{verbatim}
LAYER
  NAME road
  TYPE LINE
  STATUS ON
  DATA roadsl
 
  CLASS
    NAME "Road"
    COLOR 255 0 0
  END
END # Layer

END # Map File

freegis@xml-2:/usr/local/httpd/htdocs/mapserver/ms_demo >
\end{verbatim}
\end{kommando}

\paragraph{"`Layer"\ für Rasterdaten}
Ein "`Layer"\ für eine Rasterdatei also zum Beispiel die
ins {\em .tiff} - Format exportierte Karte des USGS wird
durch die {\em LAYER} - Zeile begonnen und mit einem
{\em END} abgeschlossen. {\em NAME karte} bezeichnet den Namen des
"`Layers"\, {\em TYPE RASTER} gibt an, dass es sich in diesem Fall um
eine Rasterdatei handelt. Mit der Zeile {\em STATUS ON} bzw. {\em
STATUS OFF} kann die Darstellung des Layers ein oder auch
abgeschaltet werden. {\em DATA karte.tiff} gibt den Dateinamen der
darzustellenden Bilddatei an.

\paragraph{"`Layer"\ für Shapefiles}
Um die Shapefiles des Craterlake zusammen mit der georeferenzierten
Rasterdatei verarbeiten zu k"onnen, werden für sie ebenfalls Layer
angelegt. Als Beispiel sei hier der "`Layer"\ {\em road} angef"uhrt.
Im Unterschied zu einem Rasterlayer hier {\em TYPE LINE} angegeben,
da es sich um eine Vektordatei handelt. Die Zeile  {\em DATA roadsl}
gibt den entsprechenden Dateinamen des Shapefiles an. Um in der
Legende einen entsprechenden Eintrag für die dargestellten
Vektoren zu erzeugen, die in diesem Fall Straßen darstellen ist dem
"`Layer"\ noch mindestens eine {\em CLASS} zuzuordnen. Das Schl"usselwort 
{\em CLASS} er"offnet einen entsprechenden Eintrag in der {\em demo.map},
anschlie"send wird der Bezeichner des Legendeneintrages
mit der Zeile {\em NAME "`Road"\ } bestimmt. Die Farbe der Eintr"age
wird durch die Zeile {\em COLOR 255 0 0} bestimmt. 

\paragraph{Anzeige im Browser}Als Ergebnis kann im Browser nun
eine Karte optional mit den Straßen, die im Shapefile gespeichert
sind "uberlagert werden. Dazu werden im Menu {\em Select Layers to
Display:} die Layer "`Karte"\ und "`Road"\ ausgew"ahlt.
Mit einem Klick auf {\em Refresh/Query} wird die neu Auswahl an den
Webserver "ubermittelt und die entsprechende Antwort wird 
im Browser angezeigt (Abb. \thechapter\ref{mapserver_3}).

\subsection{Einbinden der erzeugten Höhenlinien aus Kapitel \ref{computing_contur_lines_de} Seite \pageref{computing_contur_lines_de:grass}}
\label{web_mapping_de:mapserver:include_contur_lines}
Um die mit GRASS erzeugten H"ohenlinien in Mapserver einzubinden
werden die im GRASS-Vektorformat vorliegenden H"ohenlinien in
Shapefiles konvertiert. Nachdem GRASS wie in Kapitel
\ref{import_usgs_dem_de:grass} beschrieben ge"offnet wurde
wird das Kommando {\tt v.out.shape} zum Datenexport benutzt.
Übergeben werdem dem Kommando dabei der Name der GRASS-Vektordatei
{\tt map=} und der Name des auszugebenden Shapefiles mit dem
Verzeichnis in das geschrieben werden soll {\tt prefix=}.

\begin{kommando}
\begin{verbatim}
GRASS:/spare/gisdata/grass/bin > v.out.shape map=hlinien\
prefix=/spare/gisdata/test/craterlake/tutorial/hoehenlinien
\end{verbatim}
\end{kommando}

Die erzeugten Dateien {\em hoehenlinien.shp, hoehenlinien.shx,
hoehenlinien.dbf} werden in das {\em data}-Verzeichnis von
{\em MapServer} kopiert.

\begin{kommando}
\begin{verbatim}
GRASS:/spare/gisdata/test/craterlake/tutorial/ > cp hoehenlinien.shp/\
/usr/local/httpd/htdocs/mapserver/ms_demo/
\end{verbatim}
\end{kommando}

In die {\em demo.map} datei wird folgende Zeile eingefügt um die
Höhenlinen für {\em MapServer} zug"anglich zu machen.

\begin{kommando}
\begin{verbatim}
LAYER
  NAME hlinien
  TYPE LINE
  STATUS ON
  DATA hoehenlinien
 
  CLASS
    NAME "Höhenlinien"
    COLOR 255 0 0
  END
END # Layer
\end{verbatim}
\end{kommando}

Damit in dem Auswahlmen"u der {\em MapServer}-Webseite der Eintrag für
diese H"ohenlinien auftaucht wird die {\em demo.html} durch die
Zeile {\em <option value="hlinien" [hlinien\_select]> Höhenlinien} folgt
erg"anzt.

\begin{kommando}
\begin{verbatim}
<b>Select Layers to Display: </b><br>
<select multiple name="layer" size=3>
<option value="crater" [crater_select]> Craterlake
<option value="craterluft" [craterluft_select]> Craterluft
<option value="contour" [contour_select]> Cratercontour
<option value="road" [road_select]> Road
<option value="boundaryline" [boundaryline_select]> Boundaryline 
<option value="boundarypolyline"
[boundarypolyline_select]> Boundarypolyline 
<option value="hlinien" [hlinien_select]> Höhenlinien
</select>
\end{verbatim}
\end{kommando}

Anschlie"send k"onnen die "`GRASS-H"ohenlinien"' zusammen mit der
Karte, Luftbild u.s.w. in {\em MapServer} angezeigt werden.
Interessant ist auch ein Vergleich der "`GRASS-H"ohenlinien"' mit
den vom USGS gelieferten "`Cratercontour"'-Linien.

\begin{centering}
\Fig{
\includegraphics[width=13cm]{web-mapping/mapserver-contur.eps}}
{Screenshot Mapserver H"ohenlinien}
{Vergleich der GRASS-H"ohenlinien (rot) mit den USGS-Contourlines (gr"un) in MapServer}\label{mapserver_5}
\end{centering}

\subsection{Erweiterung der Anwendung}
Zu dem eigentlichen Shapefile geh"ort grundsätzlich auch eine
Datei im {\em .dbf} Datenbankformat, die beliebig viele Attributdaten zu
dem Shapefile beinhalten kann. Diese Daten k"onnen von Mapserver
direkt ausgelesen und verarbeitet d.h. auf Anfrage im Netz
dargestellt werden. Gesteuert wird diese Funktionalit"at durch
Eintr"age in der {\em demo.map} und drei weitere Templatedateien,
in unserem Beispiel die {\em streetspy.html}, die {\em
streetspyheader.html} und die {\em streetspyfooter.html}.
Um aus den {\em .dbf} - Dateien Daten verwenden zu k"onnen ist es
nat"urlich notwendig zu wissen, was für Daten in ihnen gespeichert
werden und vor allem wie sie gespeichert sind. Da heutzutage
Tabellenkalkulationsprogramme (gnumeric, Excel) solche
DBASE ({\em .dbf}) - Dateien
auslesen k"onnen, kann man sie sich auf diese Weise anzeigen lassen.
Die als Beispiel verwendete Datei {\em roadsl.dbf} enth"alt den
Datensatz Nr. 44 mit folgenden Feldern.

\begin{kommando}
\begin{verbatim}
Record: 44
FNODE_:          80
TNODE_:          72
LPOLY_:          20
RPOLY_:          22
LENGTH:            964.58496
ROADS_:          45
ROADS_ID:          44
ENTITY_LAB: 1700209
ENTITY_DEF: CLASS 3
PHOTOREVIS:
RELATION_T:
VERTICAL_R:
BANK:
OPERATIONA:
SALT:
UNSURVEYED:
INTERMITTE:
SUBMERGED:
DRY:
MINERAL_OR:
NAVIGABLE:
EARTHEN:
INTERPOLAT:
ELEVATION:                0.000
ROTATION_A:   0
RIVER_MILE:                0.000
\end{verbatim}\\[-\bigskipamount]\begin{verbatim}
BEST_ESTIM:
COMPOSITIO:
TIDE:
UNDREDGED:
\end{verbatim}
\end{kommando}

\paragraph{streetspyheader.html}In dieser Datei werden die
darzustellenden "Uberschriften der Tabellenspalten definiert.

\begin{kommando}
\begin{verbatim}
<font size+1><b>Layer: Road</b></font><p>
<table cellpadding=5 cellspacing=2 border=0>
<tr bgcolor=#CCCCCC><th>Straßen Identifizierer</th>
<th>Zustandsstufe/Klassifizierung der Straße</th>
<th>Straßenlänge</th></tr>
\end{verbatim}
\end{kommando}

\paragraph{streetspy.html}Hier werden den Tabellenspalten die
jeweiligen Inhalte aus der {\em .dbf} - Datei zugewiesen indem das
entsprechende Feld aufgerufen wird. Zus"atzlich k"onnen hier wie in
jeder anderen HTML - Seite z.B. Hyperlinks gesetzt werden.

\begin{kommando}
\begin{verbatim}
<tr><td>[ROADS_ID]</td><td>[ENTITY_DEF]</td><td>[LENGTH]</td></tr>
\end{verbatim}
\end{kommando}

\paragraph{streetspyfooter.html}Mit dieser Datei wird die Tabelle
beendet und zur besseren Übersicht werden noch zwei Kartenfenster
generiert.

\begin{kommando}
\begin{verbatim}
</table><p>
 <font size=+1 face=arial,helvetica><b>Query Map Examples</b></font>
  <p>

  <table cellpadding="3" cellspacing="0" border="0">
    <tr>
      <td><img border="2" src="[img]"></td>
      <td><img border="2" src="/cgi-bin/mapserver/mapserv?
      map=[map]&queryfile=/usr/local/httpd/htdocs/mapserver/tmp/DEMO
      [id].qy[get_layers]&mode=map&size=200+200"></td>
    </tr>
\end{verbatim}\\[-\bigskipamount]\begin{verbatim}
    <tr>
      <th align="center">standard querymap</th>
      <th align="center">cached query</th>
    </tr>
  </table>

  </body>
</html>
\end{verbatim}
\end{kommando}

Abschlie"send mu"s nun noch die {\em demo.map} modifiziert werden.
So werden dem "`Layer"\ {\em Road} die Namen der neu erzeugten
Templatedateien hinzugefügt, die Zeile {\em TOLERANCE 3} gibt an, da"s
der User bis zu drei Pixel daneben klicken kann, und trotzdem die
gew"unschte Information angezeigt bekommt.

\begin{kommando}
\begin{verbatim}
LAYER

  NAME road
  TYPE LINE
  STATUS ON
  DATA roadsl
 
  CLASS

    NAME "Road"
    TEMPLATE "streetspy.html"
    COLOR 255 0 0

  END
  
  HEADER "streetspyheader.html"
  FOOTER "streetspyfooter.html"
  TOLERANCE 3

END # Layer
\end{verbatim}
\end{kommando}

Um die "Ubersichtskarten in der Abfrageseite generieren zu k"onnen,
werden ihre Ausma"se durch folgende Zeilen festgelegt, die
beispielsweise in dem Abschnitt "'\# Start of web interface definition"\
gespeichert werden kann. Die Zeile {\em COLOR 255 255 0} beschreibt 
die Farbe des ausgew"ahlten Objektes in der "Ubersichtskarte, diese sollte sich von der eigentlichen Darstellungsfarbe des "'Layers"\ {\em roads} 
unterscheiden. Die Gr"o"se der Fenster kann durch die Zeile
{\em SIZE 200 200} gesteuert werden.\\ 

\begin{kommando}
\begin{verbatim}
QUERYMAP

  SIZE 200 200
  STATUS ON
  STYLE HILITE
  COLOR 0 0 255

END
\end{verbatim}
\end{kommando}

Nachdem {\em MapServer} neu in einem Webbrowser gestartet wurde, kann eine
Abfrage durch Ausw"ahlen des Knopfes {\em Query feature} und
anschließendem Mausklick auf ein entsprechendes Objekt im
Kartenfenster von {\em MapServer} ausgel"ost werden. Im besprochenen Fall
k"onnen also die drei ausgew"ahlten Einträge angezeigt werden,
wenn man die gewünschte Stra"se in einem Abstand von h"ochstens drei
Pixeln anklickt. Die erzeugte Webseite sollte "ahnlich der folgenden
sein (Abb. \thechapter.\ref{mapserver_4}).\\ 

\begin{centering}
\Fig{
\includegraphics[width=0.8\textwidth]{web-mapping/mapserver-query.eps}}
{Screenshot der MapServer Query "`Road"'}
{Ausgabeseite der Abfrage in MapServer}\label{mapserver_4}
\end{centering}\\

Die so erstellten Seiten k"onnen natürlich mit allen M"oglichkeiten,
die HTML, Java(-skript) und PHP bieten, weiter ausgebaut werden. Auch sind die
M"oglichkeiten von {\em MapServer} hier nur ansatzweise benutzt worden,
wie man an den am Anfang angegebenen Beispielen sieht. Ausgehend von
dem hier besprochenen Beispiel können die vielfältigsten Anwendungen
erstellt werden. Auf der {\em MapServer} - Homepage\footnote{http://mapserver.gis.umn.edu/} finden sich eine Vielzahl
von Beispielen und Dokumentationen. 

\subsection{L"oschen der tempor"aren Bilddateien}
Durch die Definition von
{\em  IMAGEPATH "/usr/local/httpd/htdocs/mapserver/tmp/"\ }
als Verzeichnis in das Mapserver die erzeugten Bilddateien 
für den Webserver schreibt, wird sich dieses Verzeichnis im Laufe
der Zeit mit Bilddaten f"ullen, die nicht mehr ben"otigt werden.
Um die zu verhindern, kann auf Rechnern mit dem Betriebssystem
GNU/Linux ein einfaches Shell-Skript\index{Shell-Skript}
geschrieben werden, das in diesem
Verzeichnis alle Dateien l"oscht die "Alter als Beispielsweise
60 min sind. Erstellt wird ein solches Skript mit einem beliebigen Editor.

\begin{kommando}
\begin{verbatim}
freegis@xml-2:/usr/local/httpd/htdocs/mapserver > vim ex.sh
\end{verbatim}
\end{kommando}

Dieses Kommando ruft den Editor {\tt vim} an der Kommandozeile auf.
Das eigentliche Skript besteht hier in aus einem Kommando, dem
verschiedene Parameter mitgegeben werden und die es veranlassen
, alle Dateien, deren Name mit Demo beginnt und die "alter als
60 min sind, zu l"oschen.
Um {\em vim} zu verlassen wird mit {\tt Esc} in den Kommandomodus gewechselt
und mit {\tt :wq} das Programm mit vorherigem speichern beendet.


\begin{kommando}
\begin{verbatim}
#!/bin/sh
# löscht die von mapserver erzeugten dateien in
# /usr/local/httpd/htdocs/mapserver/tmp/ die älter als 60 min sind
 
find /usr/local/httpd/htdocs/mapserver/tmp/ -name 'DEMO*.*' -type f/
-cmin +60 -exec rm -f -- '{}' ';'
\end{verbatim}
\end{kommando}

Die erste Zeile gibt an, da"s als Kommadointerpreter die sh - Shell benutzt
wird. Die n"achsten zwei Zeilen sind Kommentare die die Funktion dieses
Skriptes beschreiben. Der eigentliche Befehl dieses Skriptes ist in
der Zeile \newline {\tt find /usr/local/httpd/htdocs/mapserver/tmp/
-name 'DEMO*.*' -type f -cmin +60 -exec rm -f -- '{}' ';'\ } zu finden.
Hier wird das Kommando {\tt find} veranlasst auf alle Dateien (Files)
{\tt -type f} deren Name mit "`DEMO"\ beginnt {\tt -name 'DEMO*.*'}
und die "alter als 60 Minuten sind {\tt -cmin +60} den
L"oschbefehl {\tt rm } anzuwenden.
Dieses Skript kann jetzt von der sogenannten Crontab des jeweiligen Users
stündlich aufgerufen werden. Dazu wird die Crontab mit dem Befehl
{\tt crontab -e} editierbar aufgerufen.

\begin{kommando}
\begin{verbatim}
freegis@xml-2:/usr/local/httpd/htdocs/mapserver > crontab -e  
\end{verbatim}
\end{kommando}

Nun wird eine Zeile wie die Folgende erstellt. Die erste Null führt
das Kommando zu jeder vollen Stunde aus. Anzahl der Minuten = 0.
Weiter wird das erzeugte Skript {\em ex.sh} von dem entsprechenden
Pfad aus aufgerufen an dem es liegt.

\begin{kommando}
\begin{verbatim}
0 * * * * /usr/local/httpd/htdocs/mapserver/ex.sh
~
~
~
~
~
~
~
~ "/tmp/crontab.24701" 1L, 50C      1,1      All 
\end{verbatim} 
\end{kommando} 


