Su AllTrails, i segmenti dei sentieri sono derivati dai dati di OpenStreetMap e vengono memorizzati in un database derivato separato utilizzato per la creazione del tipo di mappa AllTrails TileSet e del nostro strumento di creazione di mappe personalizzate.
Questo documento rende disponibile al pubblico il metodo per apportare le modifiche al "database" originale OSM, come previsto dalla licenza ODBL nella sezione 4.6.b.
A differenza del database OSM, che dipende da nodi e vie, dove le vie rappresentano intere strade/percorsi e i nodi rappresentano le estremità di queste strade/percorsi, noi abbiamo adottato l'idea dei segmenti (ad esempio singoli segmenti che compongono una via e che iniziano/finiscono alle intersezioni delle vie). Il database OSM in precedenza includeva i segmenti, che però sono stati rimossi nell'ottobre 2007 per semplificare il modello dei dati (secondo la seguente documentazione: https://wiki.openstreetmap.org/wiki/Segment).
L'algoritmo per creare il nostro database derivato è il seguente:
1. Utilizzare l'API per scaricare i dati di via OSM in tile da 2x2 gradi, fra i -58 e i +72 di latitudine:
"http://www.overpass-api.de/api/xapi?way[highway=path|track|footway|steps|bridleway|cycleway][bbox=#{lng},#{lat},#{lng+TILE_DIM},#{lat+TILE_DIM}]"
I dati verranno scaricati in formato .osm.
2. Convertire ogni tile 2x2 da .osm a .geojson utilizzando OsmToGeojson per facilitare l'analisi.
3. Iterare le vie contenute in ciascun tile, memorizzando le informazioni sulle vie in un hash codificato dall'id della via (necessario perché la stessa via può apparire in più tile 2x2).
4. Iterare su ogni via (A) trovata nell'hash, per ogni via (A), iterare sui punti di tutte le altre vie (B) e confrontare i punti con la via originale (A), finché non viene trovata una corrispondenza. Nel punto in cui queste vie coincidono, memorizzare una voce in un altro hash, anch'esso codificato dall'id della via, ma con un valore che rappresenta un array di tutte le intersezioni di questa via (A) con tutte le altre (B).
5. Iterare nuovamente su ogni via (A), questa volta segmentando ogni via in base a ogni intersezione trovata e memorizzata nell'hash creato nell'ultimo passaggio.
6. Calcolare la distanza totale per ogni segmento di strada calcolando la distanza cartesiana tra ogni punto del segmento e sommando poi i valori.
Calcolare il rettangolo di selezione del segmento di via trovando le latitudini e le longitudini minime e massime di tutti i punti del segmento e formando ogni angolo del rettangolo di selezione come ogni combinazione unica dei quattro valori minimi e massimi.
8. Emettere ogni intersezione e/o segmento in formato Geojson o in altro formato, memorizzando i dati dei segmenti di via unici come necessario, ad esempio:
Intersezioni: id (arbitrario ma univoco), latitudine, longitudine
Segmenti di percorso: id originale del percorso OSM, points_data, intersection_start_id, intersection_end_id, distance_total, bounding_box, private_access (access=private, access=no), bicycle_accessible (bicycle=yes)