En AllTrails hemos derivado segmentos de rutas a partir de los datos de OpenStreetMap y los hemos almacenado en una base de datos derivada separada, que se ha utilizado en la creación de nuestro TileSet de capas de mapa de AllTrails y nuestra herramienta de creación de mapas personalizados.
Este documento pone a disposición del público el método para modificar la «base de datos» original de OSM, como requiere la licencia ODBL de la sección 4.6.b.
A diferencia de la base de datos de OSM, que depende de los nodos y caminos, donde los caminos representan carreteras/rutas enteras y los nodos representan los extremos de estas carreteras/rutas, nosotros nos basamos en la idea de los segmentos (es decir, los segmentos individuales que componen un camino y comienzan/terminan en las intersecciones de los caminos). La base de datos de OSM incluía previamente segmentos, pero estos fueron eliminados en octubre de 2007 para simplificar el modelo de datos (de acuerdo con lo reflejado en la siguiente documentación: https://wiki.openstreetmap.org/wiki/Segment).
El algoritmo para crear nuestra base de datos de derivados es el siguiente:
1. Utiliza la Overpass API para descargar datos caminos de OSM en mosaicos de 2x2 grados de entre -58 y +72 de latitud:
"http://www.overpass-api.de/api/xapi?way[highway=path|track|footway|steps|bridleway|cycleway][bbox=#{lng},#{lat},#{lng+TILE_DIM},#{lat+TILE_DIM}]"
Los datos se descargarán en formato .osm.
2. Convierte cada mosaico de 2x2 en formato.osm a formato .geojson con OsmToGeojson para facilitar el análisis.
3. Repite sobre los caminos que contenga cada mosaico para almacenar información de la ruta en un hash cifrado con el identificador del camino (necesario porque el mismo puede aparecer en múltiples mosaicos 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:
Intersecciones: identificador (arbitrario y único), latitud, longitud.
Segmentos del camino: identificador del camino original de OSM, datos_de_puntos, identificador_inicio_intersección, identificador_fin_intersección, distancia_total, cuadro_delimitador, acceso_privado (access=private, access=no), accesible_bicicleta (bicycle=sí).