Schon vor über einem Jahr habe ich mich etwas ausführlicher mit dem Projekt OpenStreetMap beschäftigt. Damals ging es um das Einlesen der Daten in eine eigene Datenbank und es gab schonmal ein HowTo, dessen Datenbankschema sich aber recht schnell als unnötig groß herausgestellt hat. Wirklich ordentlich beschrieben habe ich die dann folgende Lösung bis dato allerdings nicht, deshalb startet heute eine kleine Artikel-Serie zum Thema.
Im ersten Teil soll es darum gehen die Openstreetmap-Daten in eine MySQL-Datenbank einzulesen. Später wird eine Möglichkeit gezeigt, aus den Daten einen gerichteten Graphen z.B. für eine Wegsuche zu erstellen, danach wird eine Wegsuche realisiert.
Aber zunächst müssen die Daten eingelesen werden. Benötigt wird:
- Eine funktionierende Installation eines MySQL-Servers (> Version 5.0) mit ordentlich Speicherplatz (Ich rede hier mindestens von Gigabyte-Zahlen für Baden-Württemberg, ganz Deutschland dürfte im Bereich um die 10GB liegen) und Administrations-Umgebung
- Eine funktionierende Java-Installation. Das von mir für den Import geschriebene Skript gibt eine SQL-Befehlskette auf der Standardausgabe aus, mit der Bash (Linux-Kommandozeile) lässt sich das direkt in eine MySQL-Verbindung schicken.
Als erstes wollen wir einen Blick auf die Openstreetmap-Daten werfen. Sie liegen im XML-Format vor und können auch auszugsweise z.B. bei Geofabrik heruntergeladen werden. Ich habe mir für das Projekt die Daten von Baden-Württemberg (baden-wuerttemberg.osm) heruntergeladen.
Wenn man die knapp 80MB große bz2-Datei entpackt hat, liegen ca.1 GB Daten auf der Festplatte. In die kann man mal reinschauen (aber bitte mit einem Tool, das Zeilenweise liest, z.B. “less”). Eine Analyse dieser Datei und ein Blick auf diese zwar veraltete, aber für diesen Zweck ausreichende Wikiseite führte mich zum Datenbankschema, wie in der Grafik.
Hier ist die zugehörige MySQL-Import-Datei.
Nachdem man eine Datenbank angelegt hat kann das oben gezeigte Schema erzeugt werden. Jetzt fehlt natürlich noch der Datenimport. Dafür entstand nach mehreren Versuchen ein Java-Programm, das aus einer *.osm-Datei einen entsprechenden Import herstellt.
Der Quellcode des Java-Programms lässt sich hier herunterladen. Seine Benutzung ist einfach. Das Programm erwartet einen Parameter mit dem Pfad/Dateinamen einer *.osm-Datei und erzeugt daraus einen MySQL-Input auf dem Std-Out. Nach dem Kompilieren von osm2sql sollte sich (zumindest auf der Linux-Bash) mit einem entsprechend angepassten Befehl der Art
java osm2sql baden-wuerttemberg.osm | mysql --host=localhost --database=osm --user=osm --password=abc
die Datenbank füllen lassen. Jetzt kann man normalerweise erst mal einen Tee kochen gehen. Ein wenig Zeit sollte man dem Datenbankserver schon gönnen.
Kommentare und Hinweise zum Thema sind hier nicht nur erlaubt, sondern ausdrücklich erwünscht.



[...] 2. Teil des Projektes soll es darum gehen, einen gerichteten Graphen aus den in Teil 1 in die Datenbank eingelesenen OpenStreetMap-Daten zu erstellen, mit dem später z.B. eine Wegsuche [...]
Hi,
erstmal Danke für deine tolle Arbeit. Ich bin schon seit einigen Stunden damit beschäftigt gewesen, eine osm-Datei in meine MySQL-DB zu pflanzen. Habe schon osmosis, anderes java, rails und alles was dazu gehört installiert und kurz vorm Ziel (der vorletzte Befehl laut wiki) dann ein Fehler (*klatschvordiestirn*).
Habe dann per Zufall dein Blog entdeckt und das hier mal versucht. Was soll ich sagen: Es läuft… zumindest kann ich im phpmyadmin entdecken, dass schon eine Menge Datensätze drin sind während auf der console nur Stille herrscht. Da es aber mehr werden, vermute ich, dass es funzt.
Übrigens wollte mein debian das java-script nicht kompilieren. Keine Ahnung warum. Ich habs dann einfach auf dem Win-System kompiliert und rüberkopiert.
Ich werde das hier interessiert weiterverfolgen. ;-D
Gruß
Uli
Hi nochmal,
ein kleiner Bericht, wie es bei mir mit dem Import (zunächst nicht) funktioniert hat:
Ich hatte das zunächst auf meinem Webserver (debian lenny) versucht zu importieren. Allerdings schlug der Import fehl, da auf der Platte “nur” 2,5 GB frei waren. Das osm-File lag auf einer anderen Partition. Resultat war, dass die Platte irgendwann voll war. Die Suche nach der Datei, die diese 2,5 Gig belegten verlief teilweise erfolglos. Ein Teil des Speicherplatzes wurde von der innodb-Datei belegt, der andere Teil wurde aber von einer – vermutlich temporären – Swapdatei belegt, die ich auch leider nicht löschen konnte (erst ein reboot half).
Ich habe dann den Versuch, die Datenbank auf meinem Webserver zu importieren (ist ein Live-System!) erstmal abgebrochen und dann das Ganze unter Windows mit xampp erfolgreich hinbekommen.
Um die Datenbank in ein Windows-System einzulesen geht man wie folgt vor:
1. java-Skript ausführen
> java osm2sql nordrhein-westfalen.osm > ausgabe.dump
Dauerte einige Minuten, also Geduld! Die Datei für NRW wird bei mir 1,6 GB groß.
2. mysql-console starten
> mysql –host=localhost –database=osm –user=osm –password=abc
3. dump-file einlesen
> use osm
> \. /pfad-zur-dump-datei/ausgabe.dump
Das dauert wieder recht lange. Und noch ein Tipp: Das Konsolenfenster minimieren, dann gehts 3 mal so schnell.
Gut zu wissen, dass das auch auf Windows funktioniert.
Meine Größenschätzung ist wohl etwas zu optimistisch. Hier gilt tatsächlich mal wieder: Mehr ist besser.