HBUMNMapServer ger Capter 7

= Zusätzliche Werkzeuge =
Viele kleine Werkzeuge stehen bereit, die das Drumherum um eine (potenzielle) MapServer-Anwendung anreichern. Und einige sind sogar ziemlich nützlich. Im folgenden sollen die Kommandozeilenwerkzeuge besprochen werden, die in den Quellcodepaketen der Shapelib, des MapServers und der Bibliothek GDAL bzw. OGR zu finden sind.
=Werkzeuge der Bibliothek Shapelib=\index{Shapelib}
Diese Bibliothek wird auch vom MapServer verwendet, nämlich um -- wenig überraschend -- mit Shapefiles umzugehen. Allerdings wird dabei keine im System installierte Shapelib benutzt. Der MapServer bringt die entsprechenden Dateien in seinem eigenen Quellcodepaket mit.
Das gilt jedoch leider nicht für die ganzen Werkzeuge der Shapelib. Möchte man also die Vorteile dieser kleinen Tools genießen, muß man es auf sich nehmen und die Shapelib extra kompilieren und installieren. Das ist schnell und einfach getan, indem man das Paket auspackt, in das neu entstandene Verzeichnis wechselt und mit
 # make
 # cd contrib
 # make
das Ganze hinter sich bringt.
Man hat dann sowohl im Hauptverzeichnis des Quelltextes als auch im Unterverzeichnis =contrib= jeweils einige kleine Programme, die man sich an entsprechende Stellen im System kopieren muß. Das Verzeichnis =/usr/local/bin= kommt auf Unix-Systemen gerne zum Einsatz.
==shpdump==\index{shpdump}
Das Programm =shpdump= gibt den Inhalt eines Shapefiles in Textform auf der Kommandozeile aus. Das sieht für das Shapefile =lakespy2.shp= aus dem offiziellen Itasca-Demo beispielsweise folgendermaßen aus:
 # shpdump lakespy2.shp
 Shapefile Type: Polygon # of Shapes: 1379
 File Bounds: ( 393234.394, 5208170.531,0,0)
 to ( 495403.171, 5303964.877,0,0)
 Shape:0 (Polygon) nVertices=38, nParts=1
 Bounds:( 404885.933, 5292677.993, 0, 0)
 to ( 405418.198, 5293262.006, 0, 0)
 ( 405040.809, 5292726.997, 0, 0) Ring 
 ( 404949.931, 5292756.498, 0, 0) 
 ...
Besonders schön ist die Angabe der Bounding Box ganz zu Beginn, da man auf diese Weise schnell die Extents eines Shapefiles in Erfahrung bringen kann.
==shpcreate, shpadd, dbfcreate und dbfadd==\index{shpcreate}\index{shpadd}\index{dbfcreate}\index{dbfadd}
Was diese Programme tun, kann man bereits aus ihrem Namen ersehen, und der geneigte Leser mag sich fragen, wer auf die Idee kommt, auf der Kommandozeile von Hand Shapefiles zu erstellen bzw. diesen Shapfiles von Hand Shapes hinzuzufügen?
Diese Frage fußt auf einem Mißverständnis, dem viele Menschen erliegen, die es nicht gewohnt sind, auf der Kommandozeile zu arbeiten. Tatsächlich benutzt man dieses Programm eher selten von Hand. Viel häufiger werden solche Werkzeuge als Kommandos in Skripten eingesetzt, wo sie ihre ganze Macht entfalten können.
Das Programm =shpcreate= erstellt eine neue Shapedatei, etwa folgendermaßen:
 # shpcreate bla.shp polygon
Auf diese Weise wird ein leeres Polygon-Shapefile kreiert. Beachten Sie, dass das noch nicht die dazugehörige .dbf -Datei beinhaltet! Mögliche Shapefiletypen sind =point= , =arc= , =polygon= und =multipoint= .
Das hinzufügen von Punkten zu diesem neuen Shapefile ist ganz einfach:
 # shpadd bla.shp 1000 2000 2000 3000 3000 4000
Dadurch wird dem Shapefile ein einzelnes Shape mit drei Punkten hinzugefügt.
Natürlich möchte man seinem Shapefile auch eine .dbf -Datei an die Seite stellen. Das kann mit =dbfcreate= geschehen:
 # dbfcreate bla.dbf -s NAME 20 -n FLAECHE 10 5
Diese .dbf -Datei erhält zwei Spalten; als erstes eine 20 Zeichen große String-Spalte, und danach eine Spalte für numerische Einträge mit 10 Stellen, von denen 5 Nachkommastellen sind. Mehr Optionen gibt es für dieses Programm auch nicht.
Sodann sollen der Datei selbstverständlich auch Daten hinzufügen:
 # dbfadd bla.dbf Mesopotamien 20.4
Auf diese Weise kann man beispielsweise Daten, die man aus anderen Datenquellen hat, bequem in einem Skript automatisch in ein Shapefile umwandeln.
==dbfdump==\index{dbfdump}
Diese kleine Tool macht für .dbf -Dateien überraschenderweise das, was =shpdump= für Shapefiles tut. Eine kleine Beispielausgabe anhand der Datei =airports.dbf= aus dem offiziellen Itasca-Demo:
 # dbfdump -h airports.dbf
 Field 0: Type=String, Title=`NAME', Width=64, Decimals=0
 Field 1: Type=Double, Title=`LAT', Width=12, Decimals=4
 Field 2: Type=Double, Title=`LON', Width=12, Decimals=4
 Field 3: Type=Double, Title=`ELEVATION', Width=12, Decimals=4
 Field 4: Type=String, Title=`QUADNAME', Width=32, Decimals=0
 NAME LAT LON ELEVATION QUADNAME
 Bigfork Municipal Airport 47.7789 -93.6500 1343.0000 Effie
 Bolduc Seaplane Base 47.5975 -93.4106 1325.0000 Balsam Lake
 ...
Der Parameter =-h= weist das Programm an, zusätzlich noch die Header-Informationen für die Datei auszugeben.
==shpinfo==\index{shpinfo}
Dieses kleine Programm gibt einige grundlegende Informationen über ein Shapefile aus. Am Beispiel der Datei airports.shp aus dem offiziellen Itasca County-Demo:
 # shpinfo airports.shp
 Info for airports.shp
 Point(1), 12 Records in file
 File Bounds: ( 0, 0)
 ( 496393, 5291930)
Wir haben also ein Punkt-Shapefile mit 12 Shapes vor uns.
Beachten Sie, dass dieses Programm als minX/minY-Koordinaten selten etwas anderes ausgibt als 0/0, und für minimale Koordinaten daher nicht wirklich geeignet ist.
==dbfinfo==\index{dbfinfo}
Was shpinfo für Shapedateien ist, ist dieses Werkzeug für die dazugehörigen .dbf -Datensätze. Eine Beispielausgabe:
# dbfinfo airports.dbf
 Info for airports.dbf
 5 Columns, 12 Records in file
 NAME	 string (64,0)
 LAT	 float (12,4)
 LON	 float (12,4)
 ELEVATION	 float (12,4)
 QUADNAME	 string (32,0)
=Werkzeuge des MapServers=
Nach dem Kompilieren des MapServers findet man im Quellverzeichnis das eine oder andere kleine Werkzeug. Zwei sollen uns im folgenden besonders interessieren.
==shp2img==\index{shp2img}
Dieses Programm ist im wesentlichen MapServer für die Kommandozeile. Der Aufruf sieht beispielsweise folgendermaßen aus:
 # shp2img -m mapfile.map -i PNG -e 13.0 44.5 33.3 59.6
Dadurch wird das entsprechende Mapfile dazu benutzt, ein PNG-Bild mit den angegebenen Extents zu erzeugen. Die Kartendarstellung wird dabei aus =mapfile.amp= bezogen.
Sie können dieses Programm beispielsweise dann benutzen, wenn Sie keinen Zugriff auf einen im Webserver installierten MapServer haben können oder möchten. Es eignet vor allen Dingen zum Debuggen von Mapfiles auf Systemen ohne MapServer.
Alle möglichen Kommandozeileparameter werden durch einen Aufruf von =shp2img= ohne Optionen ausgegeben.
==shptree==\index{shptree}(2)
Wenn eine Karte gezeichnet werden soll, muß theoretisch jedes einzelne Shape in einem Shapefile darauf geprüft werden, ob es tatsächlich angezeigt werden soll. Das kann offensichtlich sehr zeitaufwendig sein.
Das Werkzeug shptree schafft hier Abhilfe, indem es einen so genannten Quadtree-Index über den Inhalt des Shapfiles erzeugt. Die Idee ist, dass man das gesamte Shapfile in vier verschiedene Gebiete zerlegt, die ihrerseits wiederum zerlegt werden, und so weiter. Diese Art der Zerlegung wird in einer Indexdatei mit der Endung .qix gespeichert.
Wenn nun eine Karte generiert werden soll, werden zuallererst Vergleiche mit dem Index angestellt, um herauszufinden, auf welche Shapes man sich bei der Darstellung überhaupt konzentrieren soll. Gerade bei großen Datenmengen kann sich die Geschwindigkeit des MapServers dabei signifikant erhöhen. Beachten Sie jedoch, dass sich dieser Index ausschließlich auf die Vektordaten im Shapfile bezieht und keine Geschwindigkeitsverbesserung für zum Beispiel Attributanfragen liefert.
Das Programm wird normalerweise sehr simpel angewendet:
 # shptree shapefile.shp
Es gibt noch zwei weitere Optionen für das Programm, der genaue Aufruf wird definiert als
 shptree [shapefile] <tiefe> <byteorder>
Mit Tiefe ist die Tiefe des Baumes gemeint, der erzeugt werden soll. Davon hat diese Art von Index auch ihren Namen. Man kann sich die Unterteilung des Shapfiles auch als Verzweigung in verschiedene Äste vorstellen, die sich dann wieder verzweigen und so weiter.
Die Byteorder ist eine kleine informatische Spezialität. Alle Daten werden als Bits gespeichert, und 8 solcher Bits werden zu einem Byte zusammengefaßt. 'Normale' ganzzahlige Werte sind auf Intel-Computern beispielsweise 4 Byte lang. Unterschiedlich ist aber nicht nur die Menge an Platz, die Zahlen einnehmen können, sondern auch wie sie abgespeichert werden. Ohne weiter ins Detail gehen zu wollen: es gibt verschiedene Ansätze, beispielsweise zuerst das niederwertigste Bit in einem Byte zu speichern und die anderen dahinter anzuordnen -- oder aber umgekehrt. Diese Ansätze unterscheiden sich von Plattform zu Plattform.
Rufen Sie einmal das Programm ohne jeden Parameter auf, um eine Liste der möglichen Byteorders zu Gesicht zu bekommen. Generell kann man sagen, dass es am sinnvollsten ist, keine Byteorder anzugeben und das Programm shptree ganz einfach einmal für alle Daten auf dem Zielsystem aufzurufen, dass die Applikation beherbergt.
Hinweis : Beachten Sie bitte, das sich das Dateiformat der Indizes mit dem Versionssprung von MapServer von 3.6 auf 4.0 geändert hat, sodass die neue Version nicht mit Ihren alten Indizes anfangen kann. Erzeugen Sie bei einer Migration auf die neue Version Ihre Indizes neu.
==shptreevis==\index{shptreevis}
Ein kleines Visualisierungswerkzeug für die Indizes, die mit =shptree= erzeugt worden sind. Es erzeugt wiederum ein Shapefile, das die Gebiete, in die die indizierten Daten eingeteilt worden sind, enhält.
 # shptreevis shapefile neu.shp 
Sie können dieses Shapefile natürlich auch wieder als eigenen Layer in ihre Karte einbinden. Die Flächen in dem Shapefile befinden sich allesamt innerhalb der Extents der Ursprungskarte.
=Werkzeuge der GDAL-Bibliothek=
Aus der Vielzahl kleiner Werkzeuge der GDAL-Bibliothek sticht vor allen Dingen =gdaltindex= hervor, mit dem sich Kataloge für Rasterdaten erstellen lassen können.
==gdaltindex==(3)\index{gdaltindex}
Der Umgang mit Katalogen für Rasterdaten ist in Abschnitt~\ref{text:mapfile:catalogs} beschrieben. Das Format dieser Kataloge ist propretär, d.\,h. Sie werden wohl keine andere Software finden, die mit dieser Art von Katalog etwas anfangen kann.
Nehmen wir an, sie haben in einem Unterverzeichnis =luftbilder= einige Bilder im .tif -Format samt Worldfiles abgelegt, die Sie in einem Katalog zusammenfassen möchten. Der Aufruf von =gdaltindex= könnte dann zum Beispiel folgendermaßen aussehen:
 # gdaltindex -tileindex IMAGE index.shp luftbilder/*.tif
Mit dem Parameter =tileindex= wird die Spalte in der .dbf -Datei bestimmt, die den Namen der Bild-Files enthalten soll. Es folgt der Name des zu erstellenden Index, und natürlich die Namen der georeferenzierten Daten, für die der Katalog erstellt werden soll.
Beachten Sie bitte, dass Sie auch nach Erstellung des Katalogs immer noch die Worldfiles für die Daten vorhalten müssen, obwohl ja eigentlich eben diese Angaben jetzt im Katalog stehen sollten.
Ebenfalls zu beachten sind =OFFSITE= -Angaben des Layers im Mapfile, in dem der Bildkatalog eingebunden werden soll. Da für diesen Parameter der Index der Farbe in der Farbpalette der Bilder angegeben werden muß, der transparent geschaltet werden soll, muß peinlichst genau darauf geachtet werden, dass alle Bilder im Katalog die gleiche Farbpalette haben, beziehungsweise dass sie alle die transparente Farbe an der gleichen Stelle in der Palette haben müssen.
\chapter{FAQ}\index{FAQ}(1)
=fehlermeldungen=
==projection: system file not found==
=verhalten=
==kein bild im browser==
Category:UMN MapServer Handbuch