En AllTrails, hemos derivado segmentos de senderos de los datos de OpenStreetMap y los hemos almacenado en una base de datos derivada separada, utilizada en la creación de nuestro AllTrails Map Type TileSet y nuestra herramienta de creación de mapas personalizados.
Este documento pone a disposición del público el método para realizar las alteraciones en la base de datos original de OSM, tal y como se exige en la licencia de ODBL en la sección 4.6.b.
A diferencia de la base de datos de OSM, que depende de los nodos y los caminos, donde los caminos representan carreteras/trayectos enteros y los nodos representan los extremos de estas carreteras/trayectos, nosotros dependemos de la idea de segmentos (es decir, segmentos individuales que componen una vía y comienzan/terminan en las intersecciones de las vías). La base de datos OSM incluía anteriormente segmentos, pero éstos se eliminaron en octubre de 2007 para simplificar el modelo de datos (según la siguiente documentación: https://wiki.openstreetmap.org/wiki/Segment).
El algoritmo para crear nuestra base de datos derivada es el siguiente:
1. Utiliza la API Overpass para descargar los datos de la vía OSM en mosaicos de 2x2 grados, 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. Convertir cada baldosa 2x2 de formato .osm a .geojson utilizando OsmToGeojson para facilitar la capacidad de análisis.
3. Iterar sobre los caminos contenidos en cada baldosa, almacenando la información de los caminos en un hash con clave de identificación de camino (necesario porque el mismo camino puede aparecer en múltiples baldosas de 2x2)
4. Iterar sobre cada camino (A) encontrado en el hash, para cada camino (A), iterar sobre los puntos de todos los demás caminos (B) y comparar los puntos con el camino original (A), hasta encontrar una coincidencia. En el punto en el que estos caminos coinciden, almacena una entrada en otro hash, también con clave de identificación de camino, pero con un valor que representa una matriz de todas las intersecciones de este camino (A) con todos los demás caminos (B).
5. Iterar sobre cada camino (A) de nuevo, esta vez, segmentando cada camino por cada intersección encontrada y almacenada en el hash creado en el último paso.
6. Calcular la distancia total para 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 del camino encontrando las latitudes y longitudes mínimas y máximas de todos los puntos del segmento del camino y formando después cada esquina del cuadro delimitador como cada combinación única de los cuatro mínimos/máximos.
8. Enviar cada intersección y/o segmento a Geojson u otro formato, almacenando los datos del segmento de manera única según sea necesario como por ejemplo:
Intersecciones - id (arbitrario, pero único), latitud, longitud
Segmentos del camino - id original del camino OSM, points_data, intersection_start_id, intersection_end_id, distance_total, bounding_box, private_access (access=private, access=no), bicycle_accessible (bicycle=yes)