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).
5. Iteriere über jeden Weg (A), der im Hash gefunden wurde. Iteriere für jeden Weg (A) über die Punkte aller anderen Wege (B) und vergleiche Punkte mit dem ursprünglichen Weg (A), bis eine Übereinstimmung gefunden wurde. An dem Punkt, an dem diese Wege übereinstimmen, speicher einen Eintrag in einen anderen Hash, der ebenfalls als Weg-ID kodiert ist, aber mit einem Wert, der ein Array aller Kreuzungen dieser Wege (A) mit allen anderen Wegen (B) darstellt.
6. Iteriere wieder über jeden Weg (A) und glieder dieses mal jeden Weg nach jeder Kreuzung in Abschnitte, die im Hash, der im letzten Schritt erstellt wurde, gefunden und gespeichert wurden.
7. Berechne die Gesamtstrecke für jeden Wegabschnitt, indem du die kartesische Entfernung zwischen jedem Punkt des Wegabschnitts berechnest und dann die Werte summierst.
8. Berechne den Begrenzungsrahmen des Wegabschnitts, indem du die minimalen und maximalen Breitengrade und Längengrade aller Punkte im Wegabschnitt ermittelst und dann jede Ecke des Begrenzungsrahmens als jede eindeutige Kombination der vier Minimal-/Maximalwerte bildest.
9. Gebe jeden Schnittpunkt und/oder jeden Abschnitt in Geojson oder einem anderen Format aus und speicher bei Bedarf einzigartige Abschnittsdaten, wie z. B.:
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)