No AllTrails, derivamos trechos de trilhas a partir de dados OpenStreetMap e armazenamos em um banco de dados separado que é usado na criação do nosso Tipo de mapa AllTrails TileSet e em nossa ferramenta de criação de mapas personalizados.
Este documento torna público o método para fazer as alterações no "banco de dados" original do OSM, conforme requerido pela licença ODBL na seção 4.6.b.
Ao contrário do banco de dados OSM, que depende dos nós e caminhos, em que os caminhos representam estradas/trilhas inteiras e os nós representam as extremidades dessas estradas/trilhas, dependemos da ideia de trechos (ou seja trechos individuais que compõem um caminho e começam/terminam nas interseções dos caminhos). O banco de dados da OSM incluía anteriormente trechos, mas estes foram removidos em outubro de 2007 para simplificar o modelo de dados (de acordo com a seguinte documentação: https://wiki.openstreetmap.org/wiki/Segment).
O algoritmo para criar nosso banco de dados de derivados é o seguinte:
1. Use o Overpass API para fazer o download de dados de trilhas OSM em mosaicos de 2x2 graus, entre latitude -58 e +72:
"http://www.overpass-api.de/api/xapi?way[highway=path|track|footway|steps|bridleway|cycleway][bbox=#{lng},#{lat},#{lng+TILE_DIM},#{lat+TILE_DIM}]"
Os dados serão baixados no formato .osm.
2. Converter cada mosaico 2x2 de .osm para .geojson usando OsmToGeojson para facilitar a análise.
3. Repita os caminhos contidos em cada mosaico para armazenar as informações do caminho num código hash que tem a chave do ID do caminho (necessário porque o mesmo caminho pode aparecer em vários mosaicos de 2x2)
4. Repita cada caminho (A) encontrado no hash, para cada caminho (A), repetir os pontos de todos os outros caminhos (B) e comparar pontos com o caminho original (A), até que uma combinação tenha sido encontrada. No ponto em que estes caminhos coincidem, armazenar uma entrada em outro hash, também digitado por meio de identificação, mas com um valor que representa um conjunto de todas as interseções deste caminho (A) com todos os outros caminhos (B).
5. Repetir sobre cada caminho (A) novamente, desta vez, segmentando cada caminho em cada cruzamento encontrado e armazenado no hash criado na última etapa.
6. Calcule a distância total para cada trecho do caminho calculando a distância cartesiana entre cada ponto do trecho do caminho e depois somando os valores.
7. Calcule a caixa delimitadora do trecho do caminho encontrando as latitudes mínima e máxima e longitudes de todos os pontos do trecho do caminho e depois formando cada canto da caixa delimitadora conforme cada combinação única dos quatro mín/máx.
8. Produza cada interseção e/ou trecho para Geojson ou outro formato, armazenando dados do trecho de forma única, conforme necessário, como por exemplo:
Intersecções - id (arbitrária, mas única), latitude, longitude
Trechos de caminho - identificação original do caminho OSM, points_data, intersection_start_id, intersection_end_id, distance_total, bounding_box, private_access (access=private, access=no), bicycle_accessible (bicycle=yes)