Bei AllTrails haben wir Wegabschnitte aus OpenStreetMap-Daten abgeleitet und in einer separaten abgeleiteten Datenbank gespeichert, die bei der Erstellung unseres AllTrails-Kartenebene-TileSet und unseres benutzerdefinierten Kartenerstellungs-Tools verwendet werden.
Dieses Dokument stellt die Methode zur Verfügung, mit der die Änderungen an der ursprünglichen OSM-„Datenbank“ vorgenommen werden, wie sie von der ODBL-Lizenz in Abschnitt 4.6.b gefordert wird.
Im Gegensatz zur OSM-Datenbank, die von Knoten und Wegen abhängt, bei der Wege ganze Straßen/Wege darstellen und Knoten die Enden dieser Straßen/Wege darstellen, sind wir auf die Idee von Abschnitten angewiesen (d .h. einzelne Abschnitte, die einen Weg bilden und an den Kreuzungen von Wegen beginnen/enden). Die OSM-Datenbank enthielt zuvor Abschnitte, die jedoch im Oktober 2007 zur Vereinfachung des Datenmodells entfernt wurden (gemäß der folgenden Dokumentation: https://wiki.openstreetmap.org/wiki/Segment).
Der Algorithmus zur Erstellung unserer abgeleiteten Datenbank ist wie folgt:
1. Verwende die Overpass-API, um OSM-Wegdaten in 2x2-großen Kacheln zwischen den Breitengraden -58 und +72 herunterzuladen:
"http://www.overpass-api.de/api/xapi?way[highway=path|track|footway|steps|bridleway|cycleway][bbox=#{lng},#{lat},#{lng+TILE_DIM},#{lat+TILE_DIM}]"
Die Daten werden im .osm-Format heruntergeladen.
2. Konvertiere jede 2x2-Kachel vom.osm- in das .geojson-Format mit OsmToGeojson, um das Parsen zu erleichtern.
3. Iteriere über die in jeder Kachel enthaltenen Wege und speichere Weginformationen in einem Hash, der als Weg-ID kodiert wird (notwendig, da der gleiche Weg in mehreren 2x2-Kacheln erscheinen kann).
4. Durchlaufe jeden gefundenen Weg (A) in der Raute, für jeden Weg (A), durchlaufe die Punkte aller anderen Wege (B) und vergleiche die Punkte mit dem ursprünglichen Weg (A), bis eine Übereinstimmung gefunden wurde. Speicher an dem Punkt, an dem diese Wege übereinstimmen, einen Eintrag in einer anderen Raute, die ebenfalls durch die Weg-ID verschlüsselt ist, jedoch einen Wert enthält, der ein Array aller Schnittpunkte dieses Weges (A) mit allen anderen Wegen (B) darstellt.
5. Iteriere diesmal erneut über jeden Weg (A) und segmentiere jeden Weg nach jeder Kreuzung, die in der letzt erstellte Raute gefunden und gespeichert wurden ist.
6. Berechne die Gesamtentfernung für jedes Wegesegment, indem du die kartesische Entfernung zwischen jedem Punkt des Wegesegments berechnest und dann die Werte summierst.
7. Berechne den Begrenzungsrahmen des Wegesegments, indem du die minimalen und maximalen Breiten- und Längengrade aller Punkte im Wegesegment ermittelst und dann jede Ecke des Begrenzungsrahmens als eindeutige Kombination der vier Min / Max bildest.
8. Gebe jeden Schnittpunkt und / oder jedes Segment in Geojson oder einem anderen Format aus und speicher nach Bedarf Segmentdaten auf eindeutige Weise, bzw.:
Wegkreuzungen - ID (beliebig, aber einzigartig), Breitengrad, Längengrad
Wegabschnitte - originale OSM-Weg-ID, points_data, intersection_start_id, intersection_end_id, distance_total, bounding_box, private_access (access=private, access=no), bicycle_accessible (bicycle=yes)