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. Iterar sobre cada vía (A) encontrada en el hash, para cada vía (A), iterar sobre los puntos de todas las demás vías (B) y comparar los puntos con la vía original (A), hasta encontrar una coincidencia. En el punto en que estos caminos coinciden, almacena una entrada en otro hash, también codificado por la identificación del camino, pero con un valor que representa una matriz de todas las intersecciones de este camino (A) con todos los otros caminos (B).
5. Iterar sobre cada vía (A) de nuevo, esta vez, segmentando cada vía por cada intersección encontrada y almacenada en el hash creado en el último paso.
6. Calcular la distancia total de cada segmento de camino calculando la distancia cartesiana entre cada punto del segmento de camino y luego sumando los valores.
7. Calcule el cuadro delimitador del segmento de camino encontrando las latitudes y longitudes mínimas y máximas de todos los puntos del segmento de camino y luego formando cada esquina del cuadro delimitador como cada combinación única de los cuatro min/max.
8. Envíe cada intersección y / o segmento a Geojson u otro formato, almacenando datos de segmento de forma única según sea necesario, como:
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í).