À AllTrails, nous avons extrait des segments de randonnées 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 type de carte 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ées :
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. Itérer sur chaque chemin (A) trouvé dans le hachage, pour chaque chemin (A), itérer sur les points de tous les autres chemins (B) et comparer les points au chemin original (A), jusqu'à ce qu'une correspondance ait été trouvée. Au point où ces chemins correspondent, stocker une entrée dans un autre hachage, également saisi par le chemin id, mais avec une valeur représentant un tableau de toutes les intersections de ce chemin (A) avec tous les autres chemins (B).
5. Répéter à nouveau dans chaque sens (A), cette fois, en segmentant chaque chemin par chaque intersection trouvée et stockée dans le hachage créé à la dernière étape.
6. Calculer la distance totale pour chaque segment de chemin en calculant la distance cartésienne entre chaque point du segment de chemin, puis en additionnant les valeurs.
7. Calculer le cadre de délimitation du segment de voie en trouvant les latitudes et longitudes minimales et maximales de tous les points du segment de voie, puis en formant chaque coin du cadre de délimitation comme chaque combinaison unique des quatre min / max.
8. Exporter chaque intersection et / ou segment au format Geojson ou à un autre format, en stockant des données de segment de manière unique selon les besoins, telles que:
Intersections – ID (arbitraire, mais unique), latitude, longitude
Segments de chemin - ID original du chemin OSM, points_données, intersection_début_id, intersection_fin_id, distance_totale, bounding_box, accès_privé (accès=privé, accès=non), accessible_vélo (vélo=oui)