Uncategorized

Eigener Tileserver mit Daten aus der Openstreetmap

OSMIn diesem Beitrag möchte ich euch beschreiben wie sich eine eigene Karte aus den Daten von Openstreetmap rendern lässt.  Anschließend wird diese Karte dann auf einem Webserver veröffentlicht von dem die Karte dann per Openlayers-Script eingebunden werden kann. Es gibt viele Wege wie man so etwas anstellt, ich habe mich für eine Kombination von PostgrgeSQL mit Postgis, osm2pgsql, Tilemill und mb-util entschieden.

Ich habe das alles auf einem Computer mit Windows 7 ausprobiert. Für Linux bzw MacOS sind unter Umständen andere Tools notwendig. 

1. Die Datenbank

Um eine Karte zu erstellen, benötigen wir einen Haufen Tools. Im einzelnen wären dies eine Datenbank, ein Programm zum Karten rendern sowie Im- und Exporttools für die Daten.

Die Daten unserer Karte werden wir uns aus einer Datenbank holen. Dazu installieren wir als erstes PostreSQL. Als nächstes benötigen wir einen „GIS Aufsatz“ für Datenbank um darin geografische Informationen speichern zu können. Das machen wir nachdem wir die PostgeSQL Datenbank installiert haben über den mitgelieferten „Stack Builder“. Wie das genau geht steht hier. Bei der Installation sollte gleich eine Datenbank angelegt werden. Bitte den Datenbanknamen und das Passwort merken die brauchen wir im nächsten Schritt.

1.1 Import der Daten

Jetzt werden wir die Openstreetmap Daten in die Datenbank importieren. Startet vorher im Startmenü pgAdminIII und verbindet euch mit der Datenbank so das der Datenbankserver läuft. Ladet euch als nächstes die Daten runter. Das kann sowohl ein planet-File, also die ganze Erde, als auch ein regionales Gebiet sein. Daten bekommt ihr von folgenden Quellen: Geofabrik oder Planet von Openstreetmap. Zum testen ob alles funktioniert ist es besser erstmal einen möglichst kleinen Bereich runterzuladen bspw. Bremen oder ein kleines Bundesland. Nehmt die Dateien mit der Endung .bz2.

Jetzt „schütten“ wir die Rohdaten in die Datenbank. Ladet euch dazu osm2pgsql von hier herunter. Dieses Tool macht nichts anderes, als die Rohdaten die ihr vorher heruntergeladen habt, in die Datenbank zu schieben. Nachdem ihr das Paket entpackt habt, öffnet ihr eine Kommandozeile in dem Verzeichnis und gebt folgendes Kommando ein:

osm2pgsql -s -c -d osm -U postgres -W -S C:\Pfad zur style Datei\default.style -H localhost -P 5432 mv.osm.bz2

Dabei ist „osm“ der Name eurer Datenbank und „postgres“ der Nutzername. Wenn ihr „osm2pgsql -h“ eingebt werden die möglichen Schalter erklärt. Unter Windows müsst ihr unbedingt den Pfad zur default.sytle angeben. Die liegt normalerweise dort, wo auch die osm2pgsql.exe liegt und bestimmt, welche Daten vom plantet-File beim Import in die Datenbank wandern.

Der Import dauert eine Weile und während dessen seht ihr verschiedene Statistiken wie Anzahl der Nodes etc. die importiert werden.  Beim Import mit osm2pgsql werden vorher alle Tabellen aus der Datenbank gelöscht, lasst euch also nicht von etwaigen Meldungen das er irgendwelche Tabellen zum löschen nicht gefunden hat nicht verwirren. Beim ersten einspielen ist die Datenbank nun einmal leer.

2. Die Karte

Für das Erstellen der Karte gibt es unterschiedlich Tools, ich habe mich für Tilemill entschieden. Man kann sich einbe Karte auch mit maperitive oder Mapnik rendern. Ich finde Tilemill sehr einfach zu bedienen außerdem hat es eine Benutzeroberfläche und man sieht die Auswirkungen der Rendereinstellungen sofort. Ladet euch nun Tilemill herunter und installiert es. Das Aussehen der Karte wird per Carto beeinflusst eine css-ähnliche Programmiersprache. Beispiele dazu gibt es bei Mapbox und den mitgelieferten Beispielen in Tilemill. Wenn ihr eure Karte fertigt habt exportiert diese als mbtiles File. Das ist ein Dateiformat von Mapbox welches man direkt bei Mapbox hochladen und dort hosten kann. Man kann es aber auch entpacken und hat dann alle Tiles welche man lokal oder auf seinen eigenen Server/Webspace hochladen kann.

2.1 Entpacken des mbtiles

Um die Karte im mbtiles Format zu entpacken benötigen wir das Tool mbutil. mbutil läuft nur unter Python. Wenn ihr Python noch nicht installiert habt ladet es euch von hier herunter. Ich nutze bei mir Version 2.7.2 und damit läuft es. Zu neueren Versionen kann ich nichts sagen. Nun ladet ihr euch mbutil von hier herunter. Dann ggf. entpacken und in den Installationsordner von Python unter C:\Programme\Python27   kopieren. Im selben verzeichnis muss auch die python.exe liegen. Wenn das Skript irgendwo außerhalb von Python liegen soll müsst ihr die Systemvariablen setzten damit Windows die Python.exe beim Aufruf findet.  Jetzt kopiert ihr noch eure erzeugte mbtiles Datei ins selbe Verzeichnis, öffnet eine Eingabeaufforderung und gebt folgendes Kommando ein.

[yellow_box]python mb-util –scheme=osm test1.mbtiles /tmp[/yellow_box] test1.mbitels steht dabei für den Dateinamen eurer erzeugten mbtiles Datei.

Wenn ihr nicht immer die Befehle in der Shell eingeben wollt könnt ihr euch auch Batchdateien erstellen, die lassen sich dann mit Doppelklick starten.

Ihr solltet nun unter C:\tmp die erzeugten Tiles finden. Die lassen sich nun einfach auf euren Server/Webspace hochladen und per Openlayers in eine html Seite einbinden.

 

10 Kommentare

  1. Habe 1 u. 1.1 wie oben beschrieben ausgeführt u. bekomme folgenden Output:

    ——————————————————————————————-
    C:\osm2pgsql>osm2pgsql -s -c -d osm -U postgres -W -S C:\osm2pgsql\default.style
    -H localhost -P 5432 detmold-regbez.osm.bz2
    osm2pgsql SVN version 0.69-21289M

    Password:
    Using projection SRS 900913 (Spherical Mercator)
    Setting up table: planet_osm_point
    HINWEIS: Tabelle »planet_osm_point« existiert nicht, wird übersprungen
    HINWEIS: Tabelle »planet_osm_point_tmp« existiert nicht, wird übersprungen
    PREPARE get_way (int4) AS SELECT AsText(way) FROM planet_osm_point WHERE osm_id
    = $1;
    failed: FEHLER: Funktion astext(geometry) existiert nicht
    LINE 1: PREPARE get_way (int4) AS SELECT AsText(way) FROM planet_osm…
    ^
    HINT: Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen ├╝b
    erein. Sie m├╝ssen m├Âglicherweise ausdr├╝ckliche Typumwandlungen hinzuf├╝gen.

    Error occurred, cleaning up
    ————————————————————————————————

    Was sagt mir das?

    • Heißt denn deine Datenbak auch „osm“ oder welchen Namen hast du bei der Einrichtung von Postgree angegeben.

      Hast du auch PostGIS installiert nachdem du PostgreeSQL installiert hast?

      Manchmal überspringt er beim einlesen ein paar Tabellen, die nicht vorhanden sind. Das macht aber nichts, die Daten sollten trotzdem eingelesen werden.
      Das müsstest du dann aber an den hochlaufenden Prozenten sehen wenn er die Daten einliest. Ansonsten sagt mir diese Fehlermeldung leider nichts.

      • Hallo Mike,
        viele Dank für deine schnelle Antwort!

        PostGIS habe ich direkt über „Stack Builder“ installiert und dabei auch die Datenbank „osm“ eingerichtet.

        PostgreSQL-Version ist 9.2.1 Winx86-64. Läuft bei mir unter Win7 64Bit.

        Nach obigen Meldungen geht das Konsole-Fenster wieder zu und es passiert gar nichts.

        • Ich könnte mir vorstellen, dass es daran liegt, dass du eine 64-bit Version benutzt.
          Ich habe das damals bei mir alles unter 32-bit gemacht.

          Du kannst auch mal im osm Forum (http://forum.openstreetmap.org/viewforum.php?id=14) das Problem posten vielleicht weiß dort jemand was mit der Fehlermeldung anzufangen.

          • Habe hier: http://wiki.openstreetmap.org/wiki/Osm2pgsql
            einen Hinweis auf eine neuere Windows-Version von Osm2pgsql gefunden, die man hier laden kann: http://osm4windows.org/downloads/osm2pgsql-2012-08-09.zip (inofficial alpha Version (0.80.0) from August 9, 2012).

            Damit scheint der Import geklappt zu haben. Mich wundert nur, das es funktionierte, ohne dass ich pgAdminIII gestartet und die Datenbank verbunden hatte (hatte ich vergessen).

            • Das freut mich das es nun geklappt hat. Machst du deine Karten mit Tilemill?
              Es gibt für Tilemill auch ein pyhton skript welches eine Karte im OSM Mapnik Look einrichtet. Nennt sich OSM Bright (https://github.com/mapbox/osm-bright)
              Dann hast du quasi eine OSM Karte und kannst die Renderregeln anpassen oder du machst dir komplett etwas eigenes.

              Das mit pgAdmin ist komisch. Ich hatte es bei mir immer gestartet. Habe aber nicht getestet ob es auch ohne starten funktioniert. Vielleicht läuft die DB bei Dir als Dienst, dann wäre die quasi immer an.

              • Tilemill habe ich gestern abend installiert und nur mal kurz reingeschaut. Habe die Programmlogik aber noch nicht verstanden.

                Wenn man nach Änderung der default.style die osm-Datenbank neu laden will, führt man Osm2pgsql dann einfach nochmal genauso aus wie oben, oder muss man die Datenbank erstmal leeren?

                • Meiner Meinung nach wird die db beim Import per osm2pgsql automatisch geleert. Ich kann mir denken das dafür irgend ein Schalter den du beim Importkommando mit übergibst zuständig ist.
                  Wenn ich bei mir einen Neuimport mache, spiele ich einfach die aktuellen Daten ein. Das hat bisher immer geklappt.
                  In der default.style steht ja nur drin was importiert werden soll und was nicht.
                  tilemill ist übrigens zeimlich einfach zu bedienen. Auf der Mapbox Seite gibt es für Carto, eine gute Hilfe. Den Rest bekommt man durch probieren raus.

  2. Danke für die leicht verständliche Anleitung! Hat prima funktioniert.

    Eine Frage: Wie groß sollte denn die Festplatte sein?
    Ich möchte komplette planet.osm in die Datenbank schreiben.

    • Puuh gute Frage. Ich habe bisher immer nur Mecklenburg Vorpommern importiert. Da dauert ja der Import ca. 15min mit einem Core i3 und 4GB RAM.
      Lt. Wiki hat der Planet entpackt ca. 171 GB. In der Datenbank kommt aber durch osm2pgsql m.M. nach nicht so viel an weil da einiges rausgefiltert wird.

      Ich denke wenn du nicht grad ne kleine SSD benutzt ist die Festplattengröße relativ egal. Mit 500GB bist du auf der sehr sicheren Seite. Problematischer wird es die Änderungen als diffs einzuspielen weil du ja nicht jedesmal um deine Karte zu aktualisieren das komplette Planetfile einspielen kannst. Und das Rendern einer Weltkarte dauert auch, je nach Anzahl der Zoomstufen, ein paar Stunden.

      Gruß

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.