Der Basisdatensatz von openstreetmap.org wird durch die Overpass API im XML-Format exportiert.
Hier ein (kleiner) Ausschnitt aus der Datei:
<?xml version="1.0" encoding="UTF-8"?> <osm version="0.6" generator="Overpass API"> <note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note> <meta osm_base="2016-06-02T12:09:02Z"/> <bounds minlat="52.4923" minlon="13.2803" maxlat="52.5305" maxlon="13.3876"/> <node id="458336" lat="52.5156249" lon="13.2857315" version="7" timestamp="2011-01-08T22:05:59Z" changeset="6909611" uid="59428" user="Plan_A"/> <node id="458337" lat="52.5165218" lon="13.2845663" version="6" timestamp="2010-12-04T16:49:59Z" changeset="6539809" uid="6669" user="Elwood"/> <node id="458338" lat="52.5165773" lon="13.2844970" version="10" timestamp="2015-08-02T19:50:46Z" changeset="33055381" uid="2572053" user="Chrisi_LE"> <tag k="exit_to" v="Spandauer Damm"/> <tag k="highway" v="motorway_junction"/> <tag k="name" v="Spandauer Damm"/> <tag k="ref" v="6"/> </node> <node id="458364" lat="52.4999593" lon="13.2797587" version="8" timestamp="2016-04-05T13:22:37Z" changeset="38317115" uid="1879543" user="glibbertorsten"/> <node id="458365" lat="52.5002536" lon="13.2803717" version="8" timestamp="2016-04-05T13:22:37Z" changeset="38317115" uid="1879543" user="glibbertorsten"/> <node id="458366" lat="52.5010638" lon="13.2808783" version="8" timestamp="2015-11-12T20:55:15Z" changeset="35271226" uid="43566" user="anbr"> <tag k="ele" v="47.242"/> </node> <node id="458367" lat="52.5014781" lon="13.2807581" version="6" timestamp="2015-11-12T20:55:15Z" changeset="35271226" uid="43566" user="anbr"> <tag k="ele" v="47.242"/> </node> <node id="484110" lat="52.5082793" lon="13.2833158" version="5" timestamp="2015-08-02T19:56:27Z" changeset="33055481" uid="2572053" user="Chrisi_LE"> <tag k="TMC:cid_58:tabcd_1:Class" v="Point"/> <tag k="TMC:cid_58:tabcd_1:Direction" v="positive"/> <tag k="TMC:cid_58:tabcd_1:LCLversion" v="9.00"/> <tag k="TMC:cid_58:tabcd_1:LocationCode" v="10223"/> <tag k="TMC:cid_58:tabcd_1:NextLocationCode" v="10224"/> <tag k="TMC:cid_58:tabcd_1:PrevLocationCode" v="10222"/> <tag k="exit_to" v="Kaiserdamm-Süd"/> <tag k="highway" v="motorway_junction"/> <tag k="name" v="Kaiserdamm-Süd"/> <tag k="ref" v="8"/> </node> <node id="20246257" lat="52.5156494" lon="13.3890366" version="6" timestamp="2015-03-01T20:34:36Z" changeset="29185491" uid="43566" user="anbr"/> <node id="20246259" lat="52.5091123" lon="13.3708190" version="8" timestamp="2014-10-25T21:13:28Z" changeset="26330463" uid="18123" user="BlackMagic"/> <node id="20246260" lat="52.5085046" lon="13.3696005" version="7" timestamp="2014-10-25T21:13:28Z" changeset="26330463" uid="18123" user="BlackMagic"> <tag k="highway" v="traffic_signals"/> </node> <node id="20246262" lat="52.5062991" lon="13.3683645" version="13" timestamp="2016-05-13T08:34:15Z" changeset="39285752" uid="43566" user="anbr"/> <node id="20246263" lat="52.5059574" lon="13.3617190" version="7" timestamp="2014-10-25T16:17:47Z" changeset="26324703" uid="18123" user="BlackMagic"/> <node id="21302157" lat="52.5142085" lon="13.3364598" version="24" timestamp="2015-12-22T12:17:48Z" changeset="36104033" uid="881429" user="atpl_pilot"> <tag k="addr:city" v="Berlin"/> <tag k="addr:country" v="DE"/> <tag k="addr:postcode" v="10555"/> <tag k="addr:street" v="Bachstraße"/> <tag k="addr:suburb" v="Tiergarten"/> <tag k="contact:phone" v="030 29743333"/> <tag k="contact:website" v="http://www.s-bahn-berlin.de/fahrplanundnetz/bahnhof/uebersicht/151"/> <tag k="description" v="S Tiergarten, Gleis 3"/> <tag k="light_rail" v="yes"/> <tag k="name" v="S Tiergarten"/> <tag k="network" v="VBB"/> <tag k="public_transport" v="stop_position"/> <tag k="railway" v="station"/> <tag k="railway:station_category" v="4"/> <tag k="ref" v="3"/> <tag k="station" v="light_rail"/> <tag k="train" v="yes"/> <tag k="wheelchair" v="yes"/> <tag k="wikidata" v="Q572112"/> <tag k="wikipedia" v="de:Bahnhof Berlin-Tiergarten"/> </node> <way id="4495210" version="10" timestamp="2015-08-30T20:34:12Z" changeset="33690663" uid="720759" user="Rassow"> <nd ref="458336"/> <nd ref="154701170"/> <nd ref="458337"/> <tag k="bridge" v="yes"/> <tag k="highway" v="motorway"/> <tag k="lanes" v="3"/> <tag k="layer" v="1"/> <tag k="lit" v="yes"/> <tag k="maxspeed" v="60"/> <tag k="note:name" v="Der reg_name, sowie ggf. der loc_name sind dem zugehörigen Wikipediaartikel entnommen."/> <tag k="oneway" v="yes"/> <tag k="ref" v="A 100"/> <tag k="reg_name" v="Berliner Stadtring"/> <tag k="source:lit" v="http://www.autobahn-bilder.de"/> <tag k="surface" v="asphalt"/> </way> </osm>
Man sieht hier 2 von den 3 Hauptobjekten, die Nodes (Knoten) und die Ways (Kanten). Die Knoten sind voller Tags die hier nicht brauchbar sind, wie die Höhe (k=„ele“
), die ganzen TMC Tags oder auch ob ein Punkt Rollstuhlzugang hat (k=„wheelchair“
). Dazu kommen noch die ganzen Meta-Informationen wie die Version, der Zeitstempel, die Änderungsgruppe, die User-ID und der Username. Zusätzlich zu den Nodes und Ways gibt es Relations, die hier aber keine große Rolle spielen.
Unten ist ein Beispiel eines Ways, der eine Straße (bzw. Weg) zwischen Knoten deklariert. In diesem Format gehören zu einem Way mehrere (>2) Wege, was nicht ganz mit unserer Implementierung der Graphentheorie kompatibel ist (1 Weg zwischen 2 Knoten).
Im ersten Bearbeitungsschritt wurden nicht befahrbare Knoten und Wege gelöscht. Dabei wurde osmosis gesagt, es solle alle Punkte die Teile der Eisenbahn sind, alle Wege auf denen kein Fahrradfahren erlaubt/möglich ist und alle Wege die im Bau,Treppen oder Autobahn sind rausschmeißen. Außerdem wurden auch alle Relationen entfernt.
bash „osmosis“ –read-xml file=„smallmap“ –tf reject-nodes railway=* –tf accept-ways highway=* –tf reject-ways cycleway=no –tf reject-ways bicycle=no –tf reject-ways highway=service,proposed,steps,motorway,motorway_link,construction –tf reject-relations –used-node –write-xml file=„bearbeitet.osm“
Die bearbeitete Datei war dann nur noch ~11% so groß wie die ursprüngliche Datei, hatte aber immer noch die Meta-Informationen + Tags und der Wegformat hat das einlesen komplizierter/langsamer gemacht.
Deswegen wurde entschieden, ein eigenes Format zu erstellen in dem auch die ganze Python-Datenstruktur einfacher gespeichert werden konnte.
n 16541471 52.506378 13.280219 inf None True n 17777144 52.511593 13.305222 inf None True n 17777145 52.511862 13.309330 inf None True e 26732947 16541471 5 4574.357160 e 16541471 26745972 5 15.172248 e 17777144 26736187 5 18.176934 e 26745972 26868066 5 18.587288 e 26868066 26868067 5 15.500474 e 26868067 16541471 5 18.172270 e 16541471 26868066 5 25.930405
Der erste Buchstabe sagt, ob das was folgt entweder eine Node oder eine Edge ist. Bei den Nodes folgt darauf der Name des Knoten, die geographische Breite, die geographische Länge und einige Informationen die nur beim Wegfinden nötig sind (um den Graphen auch mitten in der Arbeit speichern zu können). Die Edges sind simpler, da folgen auf das e
einfach die beiden Knoten(namen) zwischen denen der Weg ist, der Typ des Weges (bestimmt die durchschnittliche Geschwindigkeit) und die Länge des Weges (würde zu lange daueren das jedesmal beim Laden zu berechnen).
Diese Datei ist dann ingesamt nur noch ~4% so groß wie die Basiskarte, und obwohl das immer noch 822919 Nodes und 911886 Edges sind, wird sie auch sehr viel schneller geladen.