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. Iterate over each way (A) found in the hash, for each way (A), iterate over the points of all other ways (B) and compare points to the original way (A), until a match has been found. At the point where these ways match, store an entry into another hash, also keyed by way id, but with a value representing an array of all intersections of this way (A) with all other ways (B).
5. Iterate over each way (A) again, this time, segmenting each way by each intersection found and stored in the hash created in the last step.
6. Calculate total distance for each way segment by calculating the cartesian distance between each point of the way segment and then summing the values.
7. Calculate the bounding box of the way segment by find the minimum and maximum latitudes and longitudes of all points in the way segment and then forming each corner of the bounding box as each unique combination of the four min/maxes.
8. Output each intersection and/or segment to Geojson or other format, storing unique way segment data as needed, such as:
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)