UMN Mapserver & PostgreSQL/PostGIS

GISWiki - Das freie Portal für Geoinformatik (GIS)
Wechseln zu: Navigation, Suche

Quellen:

Diese Anleitung soll die Verbindung zwischen dem UMN MapServer und dem Datenbanksystem PostgreSQL/PostGIS etwas verdeutlichen. Die dargestellten Informationen stammen im Wesentlichen aus den folgenden Quellen:

Literatur:
CCGIS & terrestris (2004): Praxishandbuch WebGIS mit Freier Software, Bonn
Fischer, Thorsten (2003): UMN MapServer 4.0- Handbuch und Referenz, Map Media Gmbh, Berlin

Internet:
http://forum.2lucky.de (Datenbankforum, auch zu PostgreSQL)

http://freegis.org
(Linksammlung und Kurzbeschreibung zu freier GIS-Software und frei zugänglichen Geodaten initiiert   
von der Intevation GmbH)

http://www.mapserver.uni-vechta.de/webgis/webgis.html
(Homepage mit vielen Infos zum Thema WebGIS)

http://www.postgresql.de
(Deutschsprachige Seite zu PostgreSQL, hier gibt es eine sehr gute Einführung in die Geheimnisse  
von PostgreSQL von Stefan Kunick zum Downloaden sowie eine zu empfehlende Installationsanleitung von  
Cornelia Boenigk)
http://www.postgresql.org
(Infos zu PostgreSQL und Download der Versionen)

http://postgis.refractions.net
(PostGIS-Website mit Dokumentation)

http://www.umn-mapserver.de
(Die Standardseite zum Thema UMN Mapserver)

Daten: Die Beispieldaten wurden z. T. durch eigene Bearbeitung, insbesondere aber auf  
Grundlage durch cand. Dipl.-Umw. Daniel Tomowski erstellt. 
All jenen Personen, welche an den oben aufgeführten Quellen mitgewirkt haben, soll an dieser   
Stelle gedankt werden.

PostgreSQL und PostGIS - Eine kurze Einführung

Datenbanken eignen sich herrvorragend zur Verwaltung großer Datensätze, da ein diesbezüglicher Zugriff bzw. eine Speicherung bedeutend schneller als in einem herkömmlichen Dateisystem geschieht. Die Datenverwaltung wird auf ein externes System übertragen. Dieses bedeutet, dass der Rechenaufwand auf dem System, welches z. B. die Karten ausgibt, geringer wird. PostGIS bezeichnet einen Aufsatz für das Datenbanksystem PostgreSQL, dessen Funktion in der Verwaltung von Geodaten liegt. Über PostGIS ist es möglich PostgreSQL als optimale Datenbank für GIS-Anwendungen zu benutzen, gesteuerte Mehrbenutzerfähigkeit und SQL-Abfragen werden möglich. Das bedeutet z. B., dass innerhalb eines Datenbestandes eine Selektion schnell und einfach lediglich die gewünschten Einträge präsentiert. Da es sich um ein relationales Datenbanksystem handelt, werden Redundanz und Inkonsistenz der Daten vermieden. Der UMN Mapserver unterstützt die Implikation von PostGIS-Daten.

Innerhalb von PostGIS sind eine Fülle von Funktionen zur Abfrage und Manipulation von Geodaten enthalten. Somit wird eine OGC (OpenGis Consortium)-konforme Anwendung interessierten Nutzern zur Verfügung gestellt. Es ist sogar möglich, ESRI Shapedateien zu importieren bzw. zu exportieren oder von externen Anwendungen (z.B. MS Access) über die ODBC Schnittstelle (oder aber JDBC) auf PostgreSQL/PostGIS zuzugreifen. Auch ist über Programmiersprachen wie z. B. PHP ein Zugriff auf angelegte Datenbanken problemlos möglich.

Die Installation

Ausgehend davon, dass Sie bei sich bereits den Apache-Webser, PHP sowie den UMN Mapserver installiert haben (sollte dieses nicht der Fall finden Sie eine Anleitung dafür unter http://www.umn-mapserver-communtiy.de.tc) oder aber unter UMN MapServer Installationsanleitung von Kai Behncke, installieren Sie nun bitte auch PostgreSQL mit dem PostGIS-Aufsatz auf Ihrem Rechner. Ob Ihr UMN-Mapserver auch tatsächlich PostGIS unterstützt, können Sie auf der Kommandozeilenebene von MS DOS überprüfen. Gehen Sie in das Verzeichnis, in welchem die Datei "mapserv.exe" liegt und geben Sie ein:

„mapserv -v“.

Sie erhalten nun die Versions-Daten, der Eintrag „INPUT=POSTGIS“ muss erhalten sein. Sollte dieses nicht zutreffen, müssen Sie eventuell eine neuere UMN Mapserver Version installieren oder aber die vorhandene neu kompilieren.

Eine Version von PostgreSQL können Sie sich bei http://www.postgres.org herunterladen (eine Version ab 8.0 sollte es auf jeden Fall sein). Eine ausgezeichnete Installationsanleitung von Cornelia Boenigk finden Sie auf der Seite von http://www.postgresql.de (genauer: http://www.postgresql.de/postgresql8_win.html).


Die Tools

Um mit PostgreSQL Daten zu verarbeiten bzw. zu verwalten, gibt es bei Windows im Wesentlichen drei Möglichkeiten:

1. Die MS-DOS Kommandozeile. Die PostgreSQL Programme werden aus dem PostgreSQL-Unterverzeichnis „bin“ gestartet.


Abbildung 1: Aufruf eines PostgreSQL-Programms (in diesem Fall „createdb“) auf der MS-Dos-Kommandozeilenebene Bild1.gif


2. Die sogenannte psql-Konsole. Ein ganz ausgesprochen nützliches und mächtiges Tool. Sie können es z. B. unter „Start -> Alle Programme -> PostgreSQL 8.0 -> psql zu template1“ aufrufen, oder aber auf der MS-DOS-Ebene im PostgreSQL-Unterverzeichnis „bin“ über den Befehl

„psql –U postgres template1“

(Der Name „postgres“ ist hier Ihr Benutzername, welcher bei der Installation von PostgreSQL angegeben wurde; dieser ist natürlich variabel). Mittels dieser Konsole können SQL-Befehle an den Datenbankserver geliefert werden. Beim Aufruf der psql-Konsole muss, sofern nicht von Ihnen in der Konfigurationsdatei „pg_hba.conf"(liegt im Data-Verzeichnis von PostgreSQL) geändert, ein Passwort eingegeben werden (eben jenes, welches Sie bei der Installation von PostgreSQL vergeben haben). Beim Eintrag dieses Passwortes bewegt sich der Cursor NICHT (das ist normal und kein Programmfehler oder so...).


3. Die Oberfläche von pgAdmin III (wird ab der Version 8.0 standardmäßig mit installiert). Dieses können Sie unter: „Start -> Alle Programme -> PostgreSQL 8.0 -> pgAdmin III“ aufrufen.


Abbildung 2: Die Oberfläche von pgAdmin III Bild2a.gif

3.1 Arbeit auf der MS-DOS-Eingabekonsole

Gehen Sie bitte einmal auf der Eingabekonsole in das PostgreSQL-Unterverzeichnis „bin“ und geben Sie hier

„psql --help“

ein. Sie erhalten anschließend unter anderem Informationen über den aktuellen Standardbenutzer und den Standard-Datenbanknamen (siehe Abbildung 3).

Abbildung 3: MS-Dos-Eingabekonsole mit „psql --help“-Befehl Psql--help.gif


In diesem Beispiel lautet der Name des Standardbenutzers „Kalle“. Windows geht davon aus, dass Sie als der Standard-Windowsbenutzer auf der Eingabekonsole arbeiten (und nicht als der interne PostgreSQL-Benutzer). Geben Sie nun einmal zur Verdeutlichung den Befehl

„createdb Testdatenbank“

ein. Sie werden nach einem Passwort gefragt, geben dieses ein und erhalten eine Fehlermeldung. Die Passwortabfrage geschieht, weil dieses in der Konfigurationsdatei „Pg_hba.conf“ so definiert ist. Öffnen Sie diese Datei einmal mit einem Texteditor und ändern Sie am Ende der Datei den Eintrag von „md5“ in „trust „(siehe Abbildung 4)(Wenn Sie lieber mit Passwörtern arbeiten, dann können Sie diese Datei später natürlich wieder in den Ursprungszustand bringen.....).

Abbildung 4: Auszug aus der Datei pg_hba.conf („md5“ wurde hier in „trust“ geändert’) Pg hba editor.gif

Wenn Sie anschließend noch einmal in der MS-Dos-Eingabekonsole

„createdb Testdatenbank“ 

eingeben, dann erfahren Sie in der Fehlermeldung, was das eigentliche Problem ist: Sie, als Hauptwindowsnutzer (in diesem Beispiel „Kalle“), sind als Benutzer in der PostgreSQL-Datenbank gar nicht angelegt:

“...user „Kalle“ does not exist“ 

(siehe Abbildung 5).

Abbildung 5: Unschöne Fehlermeldung Fehlermeldung.gif


Ok, wie gehen wir damit um? Es gibt verschiedene Möglichkeiten:

1. Sie loggen sich als registrierter PostgreSQL-Benutzer ein. Der Befehl auf der MS-Dos-Ebene:

"psql –U postgres template1" 

(wie gesagt: Sofern Sie bei der Installation den User „postgres“ angelegt haben) und arbeiten dann auf der psql-Ebene.

2. oder: Sie arbeiten als ein registrierter Benutzer durch den Zusatz

„-U [Nutzername]“

,also in diesem Beispiel auf MS-Dos-Ebene z. B.

„createdb -U postgres testdatenbank“ 

(Geben Sie ruhig auch mal „psql --help“ ein, dadurch wird Einiges klarer).

3.oder aber Sie legen in der psql-Konsole einen Benutzer an, welcher den Namen Ihres Standard-Windowsbenutzers trägt (in diesem Fall „Kalle“). Der Befehl dafür lautet:

„Create User “ Kalle“ Createdb Createuser;“ (

mittels des Zusatzes „Createdb Createuser“ erhält der User den Status eines Superadministrators).

Um zu überprüfen, ob der User auch angelegt wurde, bitte auf psql-Ebene einmal

„\du“ 

eingeben. Der neue User müsste jetzt aufgeführt werden (siehe Abbildung 6).


Abbildung 6: Auf psql-Ebene User anlegen und überprüfen Createuser du.gif

Natürlich können Sie diese Funktionen auch mittels des Tools pgAdmin III ausführen.

Nachdem die Grundlagen nun wahrscheinlich geklärt sind, fangen wir mal mit der eigentlichen Arbeit an: Auf der Seite http://www.umn-mapserver-community.de.tc finden Sie im Downloadbereich ein Datenpaket mit der Bezeichnung: "Übungsdaten für PostgreSQGL/PostGIS". Laden Sie sich dieses bitte einmal runter (speichern Sie es z. B. auf D:\PostgreSQL-Lernen) und entpacken Sie es. Es enthält ein Mapfile (mapdatei.map), zwei Templates (template.html & ausgabetemplatefuerpostgis.html), eine Start-datei (Start.html), einen fonts bzw. symbols-Ordner sowie den Ordner „data“, welcher wiederum zwei Shapes (Lan.shp & testdaten.shp) mit den dazu gehörigen Dateien enthält.


Einspielen einer Shape-Datei

Zunächst geht es uns um die Datei „testdaten.shp“. Diese Datei enthält Probedaten aus der wunderschönen Wesermarsch in Norddeutschland. Mittels Punkt-Daten werden zufällig ausgewählte Standorte dargestellt (über Gauß-Krüger-Koordinaten) und mittels einiger zufällig ausgewählter Attribute beschrieben. Selbstredend haben die hier angehängten Daten nichts mit den tatsächlich an dieser Position vorzufindenden Geoobjekten zu tun. Beispielhaft könnte es sich bei diesen Daten um Tourismusanbieter oder dergleichen handeln.

Wir wollen nun im folgenden Beispiel eine Datenbank anlegen und die Daten aus der Shape-Datei dort einspielen (öffnen Sie doch einmal die Attributtabelle der Shapedatei (namentlich: testdaten.dbf) und schauen Sie sich an, was da eigentlich eingetragen wurde).

Wie schon gesagt, es gibt für verschiedene Funktionen verschiedene Wege. Um eine Datenbank (nennen wir sie „Geodaten“) anzulegen, wählen wir in diesem Fall einmal den Weg über die psql-Konsole. Geben Sie dort

„Create Database Geodaten;“ 

ein und kontrollieren Sie mittels des Befehls

„\l“,

ob die Datenbank angelegt wurde.

Unter PostgreSQL gibt es verschiedene prozedurale Sprachen, welche für die Erstellung bestimmter Funktionen notwendig sind. Für PostGIS bedarf es der Sprache „plpgsql“. Normalerweise sollte diese durch die Installation von PostGIS automatisch bei jeder neu angelegten Datenbank vorhanden sein. Damit Sie nicht aus der Übung kommen geben Sie diesmal bitte wieder auf MS-DOS-Ebene

„Createlang –list Geodaten“ 

ein (siehe Abbildung 7).

Abbildung 7: plpgsql vorhanden?

Sprachueberpruefung.gif


Im Normallfall sollte die Datenbank „Geodaten“ auch bereits die PostGIS-Objekte und Funktions-Definitionen sowie die Tabellen „geometry_columns“ und „spatial_ref_sys“ enthalten. Überprüfen Sie dieses bitte sicherheitshalber einmal (z. B. mittels PgAdmin III oder geben Sie auf DOS-Ebende ein:

„psql –d Geodaten“ 

(damit verbinden Sie sich ja mit der Datenbank „Geodaten“), anschließend geben Sie (nun ja auf psql-Ebene)

„\d“ 

ein, und Ihnen werden auch die vorhandenen Tabellen angezeigt.

Sollten die Tabellen“geometry_columns“ und „spatial_ref_sys“ wider Erwarten nicht vorhanden sein, so müssen Sie zunächst einmal die Datei „postgis.sql“ in die Datenbank einladen. Diese liegt im Verzeichnis: C:\Programme\Postgresql\8.0\share\contrib\

Also geben Sie auf MS-DOS Ebene ein:

„Psql –d Geodaten –f C:\Programme\postgresql\8.0\share\contrib\postgis.sql“

Anschließend laden Sie natürlich auch noch die Datei spatial_ref_sys.sql ein:

„Psql –d Geodaten –f C:\Programme\postgresql\8.0\share\contrib\spatial_ref_sys.sql“

Um nun die Shape-Datei in ein für PostgreSQL relevantes Tabellensystem zu bringen, benutzen wir auf MS-DOS-Ebene folgenden Befehl:

„Shp2pgsql D:\PostgreSQL-Lernen\data\testdaten.shp Beispieltabelle Geodaten >     
D:\Postgresql-Lernen\data\testdaten.sql“

Dieser Befehl bewirkt, dass eine SQL-Datei angelegt wird, welche sämtliche Befehle für das Anlegen der Tabelle „Beispieltabelle“ in der Datenbank „Geodaten“ enthält. Diese Datei muß nun in die Datenbank „Geodaten“ eingefügt werden. Dieses geschieht mittels des Befehls:

„psql –d Geodaten –f D:\Postgresql-Lernen\data\testdaten.sql“.

Öffnen Sie doch einmal pgAdmin III, verbinden Sie sich mit dem Datenbank-Server, öffnen Sie die Datenbank „Geodaten“. Dann jeweils Doppelklick auf „Schemata“, „public“ und „Tabellen“ . Hier müsste nun auch die eben angelegte Tabelle „Beispieltabelle“ auftauchen. Öffnen Sie diese (rechte Maustaste -> Daten anzeigen) und schauen Sie mal, ob die Daten auch eingetragen wurden. Die Einträge „Gid“, und „the_geom“ wurden zusätzlich durch PostGIS eingefügt (die Struktur können Sie sich natürlich auch sehr schön mittels psql anschauen. Bei Verbindung mit der Datenbank „Geodaten“ einfach „\d Beispieltabelle“ angeben (siehe Abbildung 8).


Abbildung 8: Überprüfen der Tabelle „Beispieltabelle“ Beispieltabelleueberpruefen.gif

Mapfile und Template

Nachdem Sie das Shapefile in die PostGIS-Datenbank übertragen haben, geht es nun um die Darstellung mittels des UMN-Mapservers. Öffnen Sie doch einmal die heruntergeladene Datei „mapdatei.map“ und versuchen Sie die Einträge nachzuvollziehen. Eventuell werden Sie hier noch einige Pfade anpassen müssen (stimmen SHAPEPATH und IMAGEPATH? Liegen „template.html“ bzw. „ausgabetemplatefuerpostgis.html“ an der richtigen Stelle??).

Öffnen Sie in einem Browser Ihrer Wahl die im heruntergeladenen Verzeichnis liegende Datei „Start.html“ (achten Sie bitte darauf, dass der Link auch wirklich korrekt ist, gegebenenfalls müssen Sie diesen anpassen (je nachdem, wo bei Ihnen die „mapserv.exe“ bzw. die Datei „mapdatei.map“ liegt). Läuft alles korrekt, so müssten Sie folgendes Fenster erhalten (Abbildung 9):


Abbildung 9: Darstellung im Browser Diebrowserabbildung.gif

Der Eintrag in „mapdatei.map“, welcher für uns als PostgreSQL/PostGIS-Lerner besonders von Bedeutung ist, ist folgender:

„CONNECTIONTYPE postgis
CONNECTION „user=postgres dbname=Geodaten
host=localhost port=5432“
DATA „the_geom from beispieltabelle““

Zur Erläuterung: CONNECTIONTYPE postGIS: Hiermit wird deutlich gemacht, dass eine externe Datenquelle vorliegt, eben die zu der PostGIS-Datenbank.

CONNECTION „user=postgres dbname=Geodaten host=localhost port=5432“ Besonders wichtig, um überhaupt eine Verbindung herzustellen (Benutzername, Datenbank, Adresse des Datenbankservers & Port werden hier definiert). In diesem Falle wird ohne Passwort gearbeitet, ansonsten hieße es z. B. „user=postgres password=xyz dbname=Geodaten host=localhost port=5432"

DATA „the_geom from beispieltabelle“ Dieser Parameter zeigt an, wo die Geodaten vorliegen. Diese wurden ja mittels des Befehls „shp2pqsql“ eingespielt. Der Name „the geom“ wird standardmäßig angelegt.

Im Klartext: In der Definition des Layers „Testdaten“ wird die Verbindung zu den Punktgeometriedaten (welche innerhalb dieses Beispiels als Sterne dargestellt werden) in der Tabelle „Beispieltabelle“ der Datenbank „Geodaten“ hergestellt. Diese Daten werden dann im Template „template.html“ (dieses ist ja im Mapfile definiert) visualisiert.

Innerhalb des „Template.html“ (also des aktuellen Browserfensters) gibt es dann noch die Möglichkeit, eine Abfrage durchzuführen, schließlich kann es ja von Interesse sein, sich weitere Daten, welche zu den einzelnen Punkten vorliegen, anzeigen zu lassen. Dieses geschieht mittels eines ganz normalen HTML-Formulars (schauen Sie sich am Besten einmal den Quellcode von „template.html“ an).

Bei einem Klick auf „Abfrage“ wird der Parameter „mode = query“ an das CGI-Skript übermittelt. Damit dann auch wirklich Daten ausgegeben werden, muss im Mapfile (mapdatei.map) ein Ausgabetemplate vorliegen (hier: ausgabetemplatefuerpostgis.html). Klicken Sie auf "Abfrage" und dann auf einen der Sterne, so werden Ihnen die weiteren Daten, welche in der Datenbank gespeichert sind, angezeigt (Abbildung 10).


Abbildung 10: Beispiel für zu einem Geoobjekt zugehörigen Daten

Marthamorgenrot.gif

Weiteres

August 2005
Der Originaltext wurde erstellt von Dipl.-Geogr. Kai Behncke
http://www.umn-mapserver-community.de

Gut, ich hoffe, dass Ihnen das Prinzip der Verbindung zwischen dem UMN Mapserver und PostgreSQL/PostGIS einigermaßen klar geworden ist?

Fragen können jederzeit im Forum auf http://www.selbstverwaltung-bundesweit.de/mapserver/modules.php?name=Forums gestellt werden. Für Anregungen und Verbesserungsvorschläge zu dieser Anleitung bin ich natürlich jederzeit offen.


E.mail: Kai-Behncke@gmx.de