OSM-Daten in PostGIS und QGIS

Ich hatte schon länger die Idee, die mittlerweile recht gut erfassten Daten aus OpenStreetMap (OSM) in eine Datenbank laufen zu lassen und dann gezielt Objekte zu ermitteln. Diese könnte ich dann z. B. in eine Tabelle füllen und zu Vetriebszwecke in unserem Unternehmen nutzen.

Voraussetzungen

Da ich gewohnt bin unter Linux (Ubuntu) zu arbeiten, beziehen sich meine Beschreibungen hier auch auf diese Umgebung. Ich habe auf meinem Notebook eine Standard Ubuntu Installation (aktuell Lucid) zu der ich die zugehörigen Pakete PostgreSQL 8.4, PostGIS 1.4, OSM2PGSQL und QGIS 1.4 installiert habe. Um in PostgreSQL mit einer grafischen Oberfläche arbeiten zu können, habe ich zusätzlich PGAdminIII installiert. Nach der Installation dieser Pakete muss man nur noch ein wenig Hand anlegen und schon hat man ein brauchbares GIS mit OSM-Daten. Aber alles der Reihe nach …

Die Datenbank vorbereiten

Nachdem PostgreSQL und PostGIS installiert sind, ist für den Datenbankserver die Spatial Erweiterung aktiviert. Bei mir war der Zugang zu pgsql (Kommandozeilen-Client für PostgreSQL) an der Kommandozeile zwar sofort möglich, aber nicht per PGAdminIII. Bei PGAdminIII wird ein Passwort erwartet, welches ich zunächst in pgsql setzen musste. Man erzeugt zunächst in einem normalen Linusterminal (z. B. bash) einen neuen Datenbankuser mit dem Befehl createuser gisadmin (sofern sich das Ganze zu Testzwecken auf dem lokalen PC abspielt, beantworte ich die Frage nach dem Superuser mit Ja). Danach erzeugt man eine Datenbank mit dem Befehl createdb meingis. Damit es später keine Probleme in PGAdminIII gibt, sollte man zu diesem Zeitpunkt ein Passwort für den gisadmin-User vergeben. Dazu verbindet man sich mit dem PostgreSQL-Server mit dem Befehl psql -d meingis und benutzt dann den Befel \password gisadmin. Man gibt jetzt zweimal das neue Passwort ein (es erscheint eine Eingabeaufforderung) und meldet sich anschließend mit \q wieder vom PostgreSQL-Server ab.
Die Datenbank muss jetzt um eine Sprachkomponente erweitert werden (PostgreSQL Programmiersprache): createlang plpgsql meingis. Jetzt  sucht man die beiden Dateien postgis.sql und spatial_ref_sys.sql. Bei mir lagen diese im Verzeichnis /usr/share/postgresql/8.4/contrib. Wichtig ist, dass man nicht das postgis-common Paket installiert hat (das enthält nämlich nicht diese beiden Dateien), sondern das von Ubuntu für PostgreSQL 8.4 angepasste. Notwendige Tabellen in der Datenbank meingis erzeugt man mit den beiden Befehlen pgsql -d meingis -f /usr/share/postgresql/8.4/contrib/postgis.sql und pgsql -d meingis -f /usr/share/postgresql/8.4/contrib/spatial_ref_sys.sql.

Detaillierte Infos zur Installation von PostGIS findet man hier…

Her mit den OSM-Daten …

Wir haben zu diesem Zeitpunkt ein schönes neues GIS aber leider noch ohne Daten. Über das normale Webinterface von OpenStreetMap (OSM) (www.openstreetmap.org) kommt man allerdings nicht sehr weit. Man muss hierzu die s. g. XAPI von OSM benutzen. Anfangs dachte ich auch, hier ist wieder was ultrakompliziertes um an die Daten zu kommen, aber weit gefehlt. Die eigentliche Mühe ist die Bestimmung des Bereichs, den ich extrahieren möchte und der Objekte, die ich ggfs. einschränken möchte. Ich werde hier ein Beispiel für einen Bereich in Oberhausen nutzen und einfach alle Objekte extrahieren. Für eine verfeinerte Abfrage benutzen Sie bitte diese Beschreibung.

Ich setze mal voraus, dass Sie die LON- und LAT-Koordinaten für den Bereich (linke untere Ecke und rechte obere Ecke) gerade nicht zur Hand haben. Öffnen Sie das Webinterface von OpenStreetMap und navigieren Sie an die Stelle der Karte, wo sich der auszuwertende bereich befindet. Plazieren Sie die Kartemitte an der linken unteren Ecke (LU) des Bereichs und lesen dann die Koordinaten via Permalink (unten rechts in der Karte) ab. Das wiederholen Sie bitte mit der rechten oberen Ecke (RO). Entweder geben Sie jetzt die folgende Zeile in Ihrem Internetbrowser ein und speichern die angezeigten Daten unter dem Namen data.osm ab (http://xapi.openstreetmap.org/api/0.6/map?bbox=LON-LU,LAT-LU,LON-RO,LAT-RO). Oder Sie benutzen im Linuxterminal den Befehl wget http://xapi.openstreetmap.org/api/0.6/map?bbox=LON-LU,LAT-LU,LON-RO,LAT-RO -O data.osm. Natürlich müssen Sie die Parameter hinter bbox= mit den jeweiligen Werten ersetzen, die Sie ermittelt haben.
Die erzeugte Datei (data.osm) kann zwischen wenigen MB und einem halben GB groß sein, jen achdem, wie groß Sie den Bereich gewählt haben. Hat Ihre data.osm eine Größe von 0kb — ist also leer — dann prüfen Sie bitte, ob Sie die Eckpunktkoordinaten für den Bereich richtig eingetragen haben. Der Fehler soll öfter vorkommen …

OSM-Daten für Datenbank aufbereiten

Mit den OSM-Daten können wir leider immer noch nicht wirklich etwas anfangen. Das ändert sich aber jetzt.  Mit dem Programm OSM2PGSQL übertragen wir die OSM-Daten jetzt in besonders aufbereiteten Tabellen nach PostGIS. Für den erstmaligen Aufruf benutzt man folgende Kommandosyntax: osm2pgsql -c -d meingis -U gisadmin -W -H localhost data.osm. Das -c steht dafür, dass die notwendigen Tabellen neu erzeugt werden (create) oder schon vorhandene Tabellen neu befüllt werden und die alten Daten verworfen werden. Danach folgt der Datenbankname, der Benutzername, die Abfrageoption für das Passwort, der Name des Datenbankhosts und die eigentliche Datendatei, welche transportiert werden soll.
Ist der Befehl fehlerfrei durchgelaufen (wobei bei mir lediglich Fehler bei den Parametern vor dem Dateinamen aufgetreten sind), befinden sich in der Datenbank meingis jetzt die ausgewerteten OSM-Daten.
Neben OSM2PGSQL gibt es noch die Möglichkeit das Programm OSMOSIS zu benutzen. Das werde ich hier aber zu diesem Zeitpunkt nicht beschreiben.

PostGIS mit QGIS verbinden

Der Eine oder Andere findet es sicherlich auch sinnvoll, Abfragen direkt an der Datenbank auszuführen. Die eigentliche Stärke des GIS gegenüber textbasierten Datensammlungen ist aber doch die Visualisierung der Daten in einer Karte. Da PostGIS lediglich eine Datensammlung ist, kann man die Daten nicht ohne ein weiteres Programm als Karte darstellen. Es gibt sicher eine Reihe von anderen GIS, die ich mit PostGIS verbinden kann, traditionell beschäftige ich mich aber mit QGIS. Dies lässt sich sehr einfach mit PostGIS verbinden.
In der Leiste der Schaltflächen findet sich das blaue tonnenförmige Symbol mit dem Pluszeichen, mit dem man einen neuen PostGIS-Layer hinzufügen kann. Nach einem Klick auf das Symbol öffnet sich ein Dialogfenster, in dem ich beim ersten Verbinden über die Schaltfläche Neu eine neue Verbindung erstellen muss. Man gibt der Reihe nach den Namen der Verbindung (z. B. meingis), den Host (localhost), den Datenbanknamen (meingis) den Benutzernamen (gisadmin) und das weiter oben eingegebene Passwort ein. Klicken Sie bitte nach der Eingabe der Informationen zuerst einmal auf  Verbindung testen. Ist dieser Test erfolgreich, können Sie den Dialog mit OK verlassen. Ist der Test nicht erfolgreich, prüfen Sie bitte nochmals die eingegebenen Informationen. Im oberen DropDown-Menü sollte jetzte der soeben erstellte Eintrag erscheinen. Klicken Sie bitte auf Verbinden. In der unteren Tabelle erscheinen jetzt vier Tabellen, deren Namen mit planet_osm_… beginnen. Hier sind Linien (…_line), Punkte (…_point), Flächen (…polygon) und spezielle Straßen (…_roads) abgelegt. In meinen Daten, haben sich allerdings die meisten Straße in der Tabelle der Linien wiedergefunden und nicht in den Roads. Das nur als Hinweis! Klicken Sie jetzt alle Tabellen der Reihe nach anund klicken dann auf Hinzufügen, um Sie in QGIS anzeigen zu lassen.

Schöne Linien …

… machen noch keine ansprechende Karte. Sofern Sie mit QGIS noch nicht vertraut sind, sollten Sie möglicherweise das Tutorial durcharbeiten, in dem die Konfiguration der Eigenschaften der Objekte beschrieben wird. Als kurzen Anhaltspunkt, verrate ich soviel: klicken Sie mit der rechten Maustaste auf einen der Layernamen (z. B. planet_osm_line) und öffnen dort die Eigenschaften. Neben der Darstellung können Sie hier auch die Beschriftung beeinflussen. Setzt man den Haken bei Beschriftung anzeigen, wählt man zunächst das Beschreibungsfeld, welches i. d. R. name heißen wird, sofern Sie keine exotischen Informationen in der Karte benötigen. Probieren Sie einfach verschieden Optionen aus (z. B. Schriftgröße und Freistellung). Sollte ein Layer besser von einem anderen überdeckt werden (Flächen sollten besser von den Straßen überdeckt werden), dann ziehen Sie diesen in der Layerliste einfach bei gedrückter linker Maustaste an die entsprechende Stelle der Liste.

Und jetzt?

Wenn bis hierhin alles geklappt hat, werden sich sicher noch weitere Fragen zu speziellen Anwendungen ergeben. Die OSM-Daten sind teilweise besser, als man denkt. Aber bitte beschweren Sie sich nicht bei mir, wenn gerade in Ihrem Bereich der Karte noch Informationen fehlen: warum haben Sie die denn noch nicht erfasst? OpenStreetMap ist ein offenes Projekt für jeden, der Daten dazu beitragen kann!
Bitte richten Sie Ihre Fragen doch einfach per EMail an mich (siehe Kontaktformular). Entweder kann ich diesen Artikel fortsetzen oder individuelle Antworten geben bzw. meine Unterstützung anbieten.

7 Antworten to “OSM-Daten in PostGIS und QGIS”

  1. pille Says:

    hi, nettes intro

    hier ist der url leider falsch: Webinterface von OpenStreetMap da steht openstrettmap

    gruss
    peter

  2. sophie Says:

    danke…
    das hat mir super weitergeholfen, endlich mal nen post bei dem ich sofort durchsah
    have a nice day
    sophie

  3. Thomas Says:

    Hallo!
    Sehr nettes tutorial!
    Wie sieht es denn hier mit Windows Systemen aus? (Windows 7)

  4. Ludger Steffens Says:

    hi,
    leider funktioniert osm2pgsql nun (Ubuntu 12.04) nicht mehr:
    PREPARE get_way (int4) AS SELECT AsText(way) FROM planet_osm_point WHERE osm_id = $1;
    failed: ERROR: function astext(geometry) does not exist
    LINE 1: PREPARE get_way (int4) AS SELECT AsText(way) FROM planet_osm…

    ausserdem: default.style liegt nun unter /usr/share/osm2pgsql

    Schade, augenblicklich kenn‘ ich kein Tool, was osm-Data in eine postgres-Datenbank einträgt …

    Ludger

  5. Jan alias Lübeck Says:

    Moin !
    ich habe OSM-Daten mit OSMOSIS in PostGIS importiert (siehe Doku: http://wiki.openstreetmap.org/wiki/User:L%C3%BCbeck/Postgis92_Win7_64bit) und wenn ich nun eine Verbindung aufbaue, dann steht bei Typ für die Tabelle Ways und den Geometriespalten bbox bzw. linesting Prüfe ….

    Mehr passiert aber nicht.

    Kannst Du mir vielleicht sagen wie man das behoben bekommt?

    Gruß Jan .-)

  6. gisser Says:

    Moin,

    sehr gut gemacht!

    Eine Frage:

    Wenn ich im PostGIS eine Abfrage gestartet habe, wie kann ich mir das Ergebnis dieser Abfrage im QGIS anzeigen lassen?

    Danke im voraus

Hinterlasse eine Antwort zu Jan alias Lübeck Antwort abbrechen