Difference between revisions of "HBUMNMapServer ger Capter 7"
(New page: = 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 folge...) |
Wiki-Mikee63 (talk | contribs) |
||
(4 intermediate revisions by 3 users not shown) | |||
Line 10: | Line 10: | ||
<br><code> | <br><code> | ||
− | # make | + | # make |
− | # cd contrib | + | # cd contrib |
− | # make | + | # make |
</code><br> | </code><br> | ||
Line 24: | Line 24: | ||
<br><code> | <br><code> | ||
− | # shpdump lakespy2.shp | + | # shpdump lakespy2.shp |
− | Shapefile Type: Polygon # of Shapes: 1379 | + | Shapefile Type: Polygon # of Shapes: 1379 |
− | File Bounds: ( 393234.394, 5208170.531,0,0) | + | File Bounds: ( 393234.394, 5208170.531,0,0) |
− | + | to ( 495403.171, 5303964.877,0,0) | |
− | Shape:0 (Polygon) nVertices=38, nParts=1 | + | 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) | |
− | ... | + | ... |
</code><br> | </code><br> | ||
Line 50: | Line 50: | ||
<br><code> | <br><code> | ||
− | # shpcreate bla.shp polygon | + | # shpcreate bla.shp polygon |
</code><br> | </code><br> | ||
Line 58: | Line 58: | ||
<br><code> | <br><code> | ||
− | # shpadd bla.shp 1000 2000 2000 3000 3000 4000 | + | # shpadd bla.shp 1000 2000 2000 3000 3000 4000 |
</code><br> | </code><br> | ||
Line 66: | Line 66: | ||
<br><code> | <br><code> | ||
− | # dbfcreate bla.dbf -s NAME 20 -n FLAECHE 10 5 | + | # dbfcreate bla.dbf -s NAME 20 -n FLAECHE 10 5 |
</code><br> | </code><br> | ||
Line 74: | Line 74: | ||
<br><code> | <br><code> | ||
− | # dbfadd bla.dbf Mesopotamien 20.4 | + | # dbfadd bla.dbf Mesopotamien 20.4 |
</code><br> | </code><br> | ||
Line 84: | Line 84: | ||
<br><code> | <br><code> | ||
− | # dbfdump -h airports.dbf | + | # dbfdump -h airports.dbf |
− | Field 0: Type=String, Title=`NAME', Width=64, Decimals=0 | + | Field 0: Type=String, Title=`NAME', Width=64, Decimals=0 |
− | Field 1: Type=Double, Title=`LAT', Width=12, Decimals=4 | + | Field 1: Type=Double, Title=`LAT', Width=12, Decimals=4 |
− | Field 2: Type=Double, Title=`LON', 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 3: Type=Double, Title=`ELEVATION', Width=12, Decimals=4 |
− | Field 4: Type=String, Title=`QUADNAME', Width=32, Decimals=0 | + | Field 4: Type=String, Title=`QUADNAME', Width=32, Decimals=0 |
− | NAME LAT LON ELEVATION QUADNAME | + | NAME LAT LON ELEVATION QUADNAME |
− | Bigfork Municipal Airport 47.7789 -93.6500 1343.0000 Effie | + | Bigfork Municipal Airport 47.7789 -93.6500 1343.0000 Effie |
− | Bolduc Seaplane Base 47.5975 -93.4106 1325.0000 Balsam Lake | + | Bolduc Seaplane Base 47.5975 -93.4106 1325.0000 Balsam Lake |
− | ... | + | ... |
</code><br> | </code><br> | ||
Line 103: | Line 103: | ||
<br><code> | <br><code> | ||
− | # shpinfo airports.shp | + | # shpinfo airports.shp |
− | Info for airports.shp | + | Info for airports.shp |
− | Point(1), 12 Records in file | + | Point(1), 12 Records in file |
− | File Bounds: ( 0, 0) | + | File Bounds: ( 0, 0) |
− | ( 496393, 5291930) | + | ( 496393, 5291930) |
</code><br> | </code><br> | ||
Line 120: | Line 120: | ||
<br><code> | <br><code> | ||
# dbfinfo airports.dbf | # dbfinfo airports.dbf | ||
− | Info for airports.dbf | + | Info for airports.dbf |
− | 5 Columns, 12 Records in file | + | 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) | |
</code><br> | </code><br> | ||
Line 138: | Line 138: | ||
<br><code> | <br><code> | ||
− | # shp2img -m mapfile.map -i PNG -e 13.0 44.5 33.3 59.6 | + | # shp2img -m mapfile.map -i PNG -e 13.0 44.5 33.3 59.6 |
</code><br> | </code><br> | ||
Line 158: | Line 158: | ||
<br><code> | <br><code> | ||
− | # shptree shapefile.shp | + | # shptree shapefile.shp |
</code><br> | </code><br> | ||
Line 164: | Line 164: | ||
<br><code> | <br><code> | ||
− | shptree [shapefile] <tiefe> <byteorder> | + | shptree [shapefile] <tiefe> <byteorder> |
</code><br> | </code><br> | ||
Line 180: | Line 180: | ||
<br><code> | <br><code> | ||
− | # shptreevis shapefile neu.shp | + | # shptreevis shapefile neu.shp |
</code><br> | </code><br> | ||
Line 196: | Line 196: | ||
<br><code> | <br><code> | ||
− | # gdaltindex -tileindex IMAGE index.shp luftbilder/*.tif | + | # gdaltindex -tileindex IMAGE index.shp luftbilder/*.tif |
</code><br> | </code><br> | ||
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. | 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 | + | 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. | 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. | ||
Line 217: | Line 217: | ||
==kein bild im browser== | ==kein bild im browser== | ||
+ | |||
+ | [[Category:UMN MapServer Handbuch]] |
Latest revision as of 02:22, 23 January 2009
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)