W AllTrails wyprowadziliśmy segmenty szlaków z danych OpenStreetMap i zapisaliśmy je w oddzielnej bazie danych, która jest wykorzystywana do tworzenia naszego zestawu kafelkowego typu map AllTrails i naszego narzędzia do tworzenia map.
Ten dokument udostępnia publicznie metodę wprowadzania zmian w oryginalnej bazie danych OSM, zgodnie z wymaganiami licencji ODBL w sekcji 4.6.b.
W przeciwieństwie do bazy danych OSM, która zależy od węzłów i dróg, gdzie drogi reprezentują całe trasy/szlaki, a węzły reprezentują końce tych tras/szlaków, polegamy na idei segmentów (tj. poszczególnych odcinków, które tworzą trasę i zaczynają/kończą się na skrzyżowaniach). Baza danych OSM wcześniej zawierała segmenty, ale zostały one usunięte w październiku 2007 r. w celu uproszczenia modelu danych (zgodnie z następującą dokumentacją: https://wiki.openstreetmap.org/wiki/Segment).
Algorytm tworzenia naszej pochodnej bazy danych wygląda następująco:
1. Użyj Overpass API, aby pobrać dane tras OSM w kafelkach 2x2 stopni, między -58 a +72 szerokości geograficznej:
"http://www.overpass-api.de/api/xapi?way[highway=path|track|footway|steps|bridleway|cycleway][bbox=#{lng},#{lat},#{lng+TILE_DIM},#{lat+TILE_DIM}]"
Dane zostaną pobrane w formacie .osm.
2. Konwertuj każdy kafelek 2x2 z formatu .osm na .geojson za pomocą OsmToGeojson, aby ułatwić parsowanie.
3. Powtórz na drogach zawartych w każdym kafelku, przechowując informacje o funkcji skrótu z identyfikatorem drogi (konieczne, ponieważ ten sam sposób może pojawić się w wielu kafelkach 2x2).
4. Powtórz na każdej drodze (A) znalezionej w skrócie, dla każdej drogi (A), powtórz na punktach wszystkich innych dróg (B) i porównuj punkty z oryginalną drogą (A), aż zostanie znalezione dopasowanie. W punkcie, w którym drogi są dopasowane, zapisz wpis do innego skrótu, również z identyfikatorem drogi, ale z wartością reprezentującą tablicę wszystkich przecięć tej drogi (A) ze wszystkimi innymi drogami (B).
5. Powtórz w każdym kierunku (A), tym razem, segmentując każdy kierunek według każdego skrzyżowania znalezionego i zapisanego w skrócie utworzonym w ostatnim kroku.
6. Oblicz całkowitą odległość dla każdego odcinka drogi, obliczając odległość kartezjańską między każdym punktem odcinka drogi, a następnie sumując wartości.
7. Oblicz ramkę graniczną odcinka drogi, znajdując minimalną i maksymalną szerokość i długość geograficzną wszystkich punktów na odcinku drogi, a następnie uformuj każdy róg ramki granicznej jako unikalną kombinację czterech wartości min/maks.
8. Prześlij każde skrzyżowanie i/lub segment do formatu geojson lub innego, przechowując w razie potrzeby dane segmentu w unikalny sposób, takie jak:
Skrzyżowania: identyfikator (dowolny, ale unikalny), szerokość geograficzna, długość geograficzna
Segmenty drogi: oryginalny identyfikator drogi OSM, points_data, intersection_start_id, intersection_end_id, distance_total, bounding_box, private_access (access=private, access=no), bicycle_accessible (bicycle=yes)