Chez AllTrails, nous avons extrait des segments de randonnée depuis les données OpenStreetMap. Nous les avons ensuite stockés dans une base de données dérivée séparée, qui a servi à la création de l'outil Map Layer TileSet d'AllTrails et de notre générateur de cartes personnalisées.
Ce document met à la disposition du public la méthode de modification de la « base de données » originale d'OSM, comme l'exige le paragraphe 4.6.b. de la licence ODBL.
Contrairement à la base de données d'OSM, qui dépend de nœuds et de chemins, où les chemins représentent des routes/sentiers entiers et les nœuds les extrémités de ces routes/sentiers, notre projet repose sur le concept de « segments » (c'est-à-dire des segments individuels qui composent un chemin et débutent/se terminent à l'intersection des chemins). La base de données d'OSM comprenait auparavant des segments, mais ceux-ci ont été supprimés en octobre 2007 pour simplifier le modèle de données (voir la documentation suivante : https://wiki.openstreetmap.org/wiki/Segment).
Voici l'algorithme que nous avons utilisé pour créer notre base de données dérivée :
1. Utiliser l'API Overpass pour télécharger les données de chemins d'OSM en tuiles de 2x2 degrés, entre -58 et +72 de latitude :
"http://www.overpass-api.de/api/xapi?way[highway=path|track|footway|steps|bridleway|cycleway][bbox=#{lng},#{lat},#{lng+TILE_DIM},#{lat+TILE_DIM}]"
Les données seront téléchargées au format .osm.
2. Convertir chaque tuile de 2x2 du format .osm au format .geojson en utilisant OsmToGeojson pour faciliter l'analyse.
3. Repasser sur les chemins contenus dans chaque tuile en stockant l'information de chemin dans une clé de hachage par ID de chemin (opération nécessaire, car le même chemin peut apparaître dans plusieurs tuiles de 2x2).
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:
Intersections – ID (arbitraire, mais unique), latitude, longitude
Segments de chemin - ID original du chemin OSM, points_data, intersection_start_id, intersection_end_id, distance_total, bounding_box, private_access (access=private, access=no), bicycle_accessible (bicycle=yes)