Hos AllTrails har vi avledet stisegmenter fra OpenStreetMap-data og lagret dem i en egen avledet database, brukt i opprettelsen av flisesettet vårt med AllTrails-karttyper samt verktøyet vårt for laging av egendefinerte kart.
Dette dokumentet gjør metoden for endringer av den originale OSM-«databasen» offentlig tilgjengelig, slik ODBL-lisensen i avsnitt 4.6.b krever.
I motsetning til OSM-databasen, som avhenger av noder og veier, hvor veier representerer hele veier/stier og noder representerer endene av disse veiene/stiene, er vi avhengige av ideen om segmenter (dvs. individuelle segmenter som danner en vei og begynner/slutter i skjæringspunktene mellom veier). OSM-databasen inkluderte tidligere segmenter, men disse ble fjernet i oktober 2007 for å forenkle datamodellen (i henhold til følgende dokumentasjon: https://wiki.openstreetmap.org/wiki/Segment).
Algoritmen for å lage den avledede databasen vår er som følger:
1. Bruk Overpass API for å laste ned OSM-veidata i 2x2-graders fliser, mellom –58 og +72 breddegrader:
"http://www.overpass-api.de/api/xapi?way[highway=path|track|footway|steps|bridleway|cycleway][bbox=#{lng},#{lat},#{lng+TILE_DIM},#{lat+TILE_DIM}]"
Data blir lastet ned i .osm-format.
2. Konverter hver 2x2-flis fra .osm til .geojson-format ved å bruke OsmToGeojson for enklere analyseevne.
3. Iterer over veiene i hver flis, slik at veiinformasjon i en hash tastet inn med vei-ID. lagres (nødvendig fordi den samme veien kan vises i flere 2x2-fliser).
4. Iterer over hver vei (A) i hashen, for hver vei (A), iterer over punktene til alle de andre veiene (B), og sammenlign punktene med den opprinnelige veien (A), inntil en match er funnet. På det punktet hvor disse veiene samsvarer, lagrer du en oppføring i en annen hash, også tastet inn med vei-ID, men med en verdi som representerer et sett av alle skjæringspunktene for denne veien (A) med alle andre veier (B).
5. Iterer over hver vei (A) igjen, men denne gangen segmenterer du hver vei etter hvert skjæringspunkt som ble funnet og lagret i hashen som ble opprettet i det siste trinnet.
6. Beregn total avstand for hvert veisegment ved å regne ut den kartesiske avstanden mellom hvert punkt i veisegmentet og deretter legge sammen verdiene.
7. Beregn grenseboksen til veisegmentet ved å finne minimal og maksimal bredde- og lengdegrad for alle punktene i veisegmentet og deretter danne hvert hjørne av grenseboksen som hver unike kombinasjon av de fire minimal-/maksimalverdiene.
8. Send ut hvert skjæringspunkt og/eller segment til Geojson eller et annet format, slik at unike veisegmentdata lagres etter behov, for eksempel:
Skjæringspunkter: ID (vilkårlig, men unik), breddegrad, lengdegrad
Veisegmenter: original OSM way id, points_data, intersection_start_id, intersection_end_id, distance_total, bounding_box, private_access (access=private, access=no), bicycle_accessible (bicycle=yes)