Complicatie: in de xml staan de ways niet noodzakelijk in de goede volgorde, en evenmin zijn zij altijd aaneengesloten. Het lijkt me niet zinvol om het wiel opnieuw te gaan uitvinden. Er moet al over nagedacht zijn.
Ik hoop dat iemand mij kan helpen aan javascript hiervoor. Zovast bedankt!
Update: OpenLayers heeft een GPX parser: OpenLayers.Format.GPX. Ik kan hiermee een GPX string maken:
Openlayers.Format.GPX.write(feature.vector)
Hartstikke mooi, ware het niet dat deze parser iedere way omzet in een apart . Dat zijn er al gauw honderden. Bovendien is de volgorde van deze segmenten niet opeenvolgend.
Voordat ik me stort op een javascript functie om de segmenten aan elkaar te plakken, toch even een check bij jullie of ik het wiel niet opnieuw aan het uitvinden ben… Ik zoek een client side oplossing, omdat openlayers immers client side werkt; alles staat zo’n beetje klaar in de client’s browser…
Op het forum van de wereldfietsers is ook al opgemerkt dat de tracks van Waymarked trails een beperkte waarde hebben (als de tracks uit teveel segmenten bestaat is die op de garmin gps niet bruikbaar).
Misschien op het development forum eens vragen, http://forum.openstreetmap.org/viewforum.php?id=13
Er is zeker een behoefte aan goed bruikbare GPX track op basis van OSM route relaties, dus je bent goed bezig!
De GPX.write methode zou moeten worden aangepast. Dat moeten de mensen van OpenLayers doen. Wat ze nu doen, is ieder stukje way omzetten in een eigen track segment, inclusief de richting van de way.
Ik denk dat er niets anders op zit dan zelf een algoritme maken om de segmenten in de goede volgorde aan elkaar te plakken… tenzij iemand dat al gedaan heeft.
Om te beginnen. GPX == XML. Het is alleen geodata in XML ( XML beschrijft enkel een datastructuur, geen inhoud ).
Je kunt data van overpass rechtstreeks als GPX downloaden, daar heb je geen openlayers voor nodig. Het bestand dat je dan krijgt is overigens precies hetzelfde, want openlayers schrijft gewoon de data van overpass weg.
Dat je een verzameling wegen met tracksegmenten krijgt klopt, dat is waar je overpass om vraagt. Een relatie is binnen OSM nu eenmaal geen route, maar een verzameling van wegen die bij elkaar horen. Overpass kan niet weten in welke volgorde je die wegen wilt lopen/fietsen. Dat geldt ook voor waymarked trails, dat is een visuele interface, maar verschilt niet van overpass in de manier waarop de data is opgeslagen.
Omzetten is in principe minder moeilijk dan het lijkt. Omdat GPX==XML kun je gewoon de XML data bewerken vanuit javascript/PHP.
Je moet dan beginnen het startpunt uit te kiezen. Dit kan het eerste of laatste punt van een weg zijn ( je weet niet in welke richting die weg getekend is … ).
Als je alle punten van die weg hebt gehad moet er een andere weg (tracksegment) zijn waar het eerste of laatste punt dezelfde coordinaten heeft. Dat is dan de volgende weg.
Zo kun je de hele xml-tree doorlopen en de punten wegschrijven in de volgorde waarin je ze doorloopt.
Vooropgesteld dat de relatie compleet is ( lang niet altijd helaas ) ben je er dan zo uit.
Er zit wel een grote valkuit in: als je route twee keer hetzelfde punt passeert kan het zijn dat er 3 of 4 wegen in het bestand staan met een gemeenschappelijk punt. Dan wordt het onmogelijk om uit te zoeken welke route je wilt nemen. Gelukkig zijn de meeste routes niet kruisend.
Een andere valkuil is cirkelvormige routes, zoals MTB-tracks. Daar kan het zijn dat het eerste en laatste punt identiek zijn. Je weet dan niet welke kant je op moet. En bij het begin van de conversie moet je het eerste punt onthouden zodat je kunt stoppen als je dit weer tegenkomt, anders loop/fiets je in cirkeltjes.
Altijd leuk om een elegant algoritme te bedenken. Bizar dat dit nog niet gedaan is. Ik ga er mijn tanden inzetten, en leg tzt graag een proeve hiervan aan je voor via dit forum.