Hos AllTrails har vi afledt rutesegmenter fra OpenStreetMap-data og gemt dem i en separat afledt database, der bruges i oprettelsen af vores kortfelter til AllTrails-korttyper (AllTrails Map Type TileSet) og vores tilpassede værktøj til kortoprettelse.
Dette dokument gør metoden til at foretage ændringerne af den oprindelige "OSM-database" offentligt tilgængelig, som krævet i ODBL-licensen, afsnit 4.6.b.
I modsætning til OSM-databasen, som er afhængig af knudepunkter (noder) og ruter, hvor ruter repræsenterer hele veje/ruter og knudepunkter repræsenterer enderne af disse veje/ruter, har vi brug for idéen om segmenter (dvs. individuelle segmenter, der udgør en rute, og som starter/slutter ved ruters skæringspunkter). OSM-databasen indeholdt tidligere segmenter, men disse blev fjernet i oktober 2007 for at forenkle datamodellen (i henhold til følgende dokumentation: https://wiki.openstreetmap.org/wiki/Segment).
Algoritmen til oprettelse af vores afledte database er som følger:
1. Brug Overpass API'en til at downloade OSM-vejdata i 2x2 graders felter mellem breddegraderne -58 og +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}]"
Data vil blive downloadet i .osm-format.
2. Konverter hver 2x2 kortfelt fra .osm- til .geojson- format ved hjælp af OsmToGeojson for at gøre det lettere at analysere.
3. Iterér over de ruter, der er indeholdt i hver flise, og gem ruteoplysningerne i en hash med nøgle efter rute-ID (nødvendigt, fordi den samme rute kan forekomme i flere 2x2-felter)
4. Iterér over hver rute (A), der findes i hash'en, for hver rute (A), iterér over punkterne for alle andre ruter (B) og sammenlign punkterne med den oprindelige rute (A), indtil der findes et match. På det punkt, hvor disse ruter matcher, lagres en post i en anden hash, også med nøgle efter rute-ID, men med en værdi, der repræsenterer et udvalg af alle skæringspunkter af denne rute (A) med alle andre ruter (B).
5. Iterér over hver rute (A) igen, denne gang ved at segmentere hver rute efter hver krydsning, der er fundet og gemt i den hash, der blev oprettet ved forrige trin.
6. Beregn den samlede afstand for hvert rutesegment ved at beregne den kartesiske afstand mellem hvert punkt i rutesegmentet og derefter sammenlægge værdierne.
7. Beregn rutesegmentets afgrænsende kasse ved at finde de mindste og største bredde- og længdegrader for alle punkter i rutesegmentet og derefter skabe hvert hjørne af den afgrænsende kasse som hver unik kombination af de fire mindste/største værdier.
8. Output hver skæringspunkt og/eller segment til Geojson eller et andet format, og gem unikke rutesegmentdata efter behov, f.eks:
Skæringspunkter - ID (vilkårlig, men unik), breddegrad, længdegrad
Rutesegmenter - 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)