Rohdaten aus GPX-Layer weiterverwenden

Guten Morgen zusammen,

ich habe (mal wieder) eine kleine Frage an die OpenLayers-Experten hier. Ich arbeite zur Zeit daran, GPX-Track auf einer OSM Karte darzustellen.
Bislang funktioniert alles wirklich einwandfrei. Ich veararbeite die GPX-Datei momentan wie folgt:


           var gpxTrack = new OpenLayers.Layer.Vector("Track",{
                    protocol: new OpenLayers.Protocol.HTTP({
                        url: "http://www.walking-away.de/wp-content/uploads/2011/06/Foersterstieg.gpx",
                        format: new OpenLayers.Format.GPX({extractWaypoints: true, extractRoutes: true, extractAttributes: true})
                    }),
                    strategies: [new OpenLayers.Strategy.Fixed()],
                    style: {strokeColor: "#ff8400", strokeWidth: 3, fillColor: "#ff8400", pointRadius: 5},
                    projection: new OpenLayers.Projection("EPSG:4326")
                });

Das funktioniert auch soweit.
Somit habe ich einen Vector-Layer namens “gpxTrack” mit den Daten der geladenen GPX-Datei. Ich benötige jetzt jedoch, nachdem der Layer auf der OSM Karte angezeigt wurde, die Rohdaten der GPX-Datei, um sie auf meiner Website per XML-Parser weiterverarbeiten zu können (ich möchte ein Höhenprofil mit Hilfe von jqPlot generieren etc.).
Gibt es daher eine Funktion, mit der ich die Rohdaten (also den reinen XML-Code) aus dem GPX-Track herausziehen kann?

Also etwas wie:

var rohdaten = gpxTrack.getRohdaten();

Momentan behelfe ich mir, indem ich die GPX-Datei einmal von OpenLayers zur Kartendarstellung laden lasse und zum weiterverarbeiten das Ganze per Ajax noch einmal laden lasse. Somit wird bei jedem Seitenaufruf die GPX-Datei (teilweise mehrere MB groß) zweimal geladen. Das ist nicht wirklich der Hit.

Vielleicht liegt die Lösung wieder so nah, dass ich sie selbst nicht sehe.

Ich hoffe, ich habe einigermaßen verständlich ausgedrückt was ich suche. :wink:

Vielen Dank schonmal :slight_smile:

Gruß,

Timo

nur so ne kleine idee:
besorg dir erst das Gpx vom externen Server, verarbeite es auf deinem Server und schick es dann nach openlayers. eventuell klappt das so.

Gruss
Walter

Das ist natürlich auch eine Möglichkeit. Da bin ich noch gar nicht drauf gekommen, danke! :slight_smile:
Jetzt muss ich nur wissen, wie ich den GPX-Layer erstelle, wenn ich die GPX-Daten (XML) in form einer Variable habe. Die Daten an sich habe ich bereits vom Server geladen und in einer Variable “xml” gespeichert. Doch wie erstelle ich daraus den entsprechenden Layer?

Gibt es ein Code-Beispiel, wo ich nachlesen kann, wie ich meinen jetzigen Code (siehe oben) abändern müsste?

Gruß,
Timo

Vielleicht hilft Dir das hier weiter:
http://php-baustelle.de/openlayers/step-by-step/ step 12 und 13

Danke für die Antwort.
Ich habe mir das gerade mal bei Step 12 angeschaut, allerdings scheint es wohl so, als könne man das, was auf GeoJSON zutrifft, nicht ohne weiteres auf GPX anwenden. die read()-Funktion von OpenLayers.Format.GPX() ist nicht gleich der von OpenLayers.Format.GeoJSON(). Zumindest sieht es für mich mit meinem bescheidenen Verständnis von OpenLayers momentan so aus.

Ich kann zwar mit read() die GPX-Rohdaten in XML-Form einlesen - sie werden auch verarbeitet - allerdings wird kein Track angezeigt, wenn ich weiter machen möchte.

Hat noch jemand Ideen?

Gruß,

Timo

vielleicht die GPX Daten per eigener Funktion in GeoJSON wandeln?

Hallo Timo,

das hat mir jetzt keine Ruhe gelassen, dass das nicht gehen soll. Und da ich sowas eh auch noch benötigen werde, musste ich mir das mal anschauen.

Der Trick ist wohl, dass man dem GPX Format die Ziel-Projektion mitgeben muss, wenn dieses nicht innerhalb der Vector Layer Initialisierung verwendet wird (als externalProjection wird fix EPSG:4326 gesetzt, siehe Format.GPX.initialize) :


new OpenLayers.Format.GPX({ internalProjection: map.getProjectionObject(), ... });

Bei mir hat es damit dann mit folgendem Code funktioniert:


var gpxTrack = new OpenLayers.Layer.Vector("Track",{
    style: {strokeColor: "#ff8400", strokeWidth: 3, fillColor: "#ff8400", pointRadius: 5}
});

var request = OpenLayers.Request.GET({
    url: "Track.gpx",
    //url: "http://www.walking-away.de/wp-content/uploads/2011/06/Foersterstieg.gpx",
    async: false
});
var gpxFormat = new OpenLayers.Format.GPX({
    internalProjection: map.getProjectionObject(), 
    extractWaypoints: true, 
    extractRoutes: true, 
    extractAttributes: true});
var features = gpxFormat.read(request.responseXML);
gpxTrack.addFeatures(features);
map.addLayer(gpxTrack);
map.zoomToExtent(gpxTrack.getDataExtent());

Bezüglich Höhenprofil fand ich kürzlich das ganz nett:
http://osm.santolibre.net/routeinfo.aspx?relationid=1145205

Gruß,
ikonor

@ikonor
Wenn ich könnte, würde ich dir jetzt ein Bier ausgeben :wink:
So wie du es beschrieben hast, funktioniert es absolut einwandfrei. Wirklich klasse :slight_smile:
Den OpenLayers.Request.GET()-Teil habe ich weg gelassen, da ich die GPX-Rohdaten einfach als Parameter an die init()-Funktion übergebe, das ist in meinem Fall einfacher. Der Rest funktioniert einfach nur super. Vielen Dank.

Das Höhenprofil sieht auch wirklich gut aus. Das schaue ich mir noch einmal genauer an.

Ich habe bereits seit einiger Zeit ein eigenes Höhenprofil erstellt. Ich nutze dazu (noch) die Google Chart API. Das Ergebnis (inkl. der Änderung von heute) gibt es zum Beispiel hier zu sehen: http://www.walking-away.de/harzer-foersterstieg-riefensbeek-kamschlacken-goslar/

Ich werde das Höhenprofil allerdings demnächst mit jqPlot realisieren. Das nutzt das HTML5 Canvas Element und bietet einige wirklich interessante Funktionen.

Vielen Dank noch mal für die Hilfe an euch alle! :slight_smile:

Gute Nacht,

Timo

hi,

schöne Karte.

baust du bitte noch in die Karte die Attributierung für ospenstreetmap ein. das ist nämlich die einzige Bedingung, die wir an Kartenersteller stellen, die OSM-Daten verwenden.
Geht mit openlayers ganz einfach.

http://wiki.openstreetmap.org/wiki/DE:Legal_FAQ#Ich_m.C3.B6chte_OpenStreetMap_verwenden._Wie_soll_ich_auf_euch_hinweisen.3F

“Wenn Du OpenStreetMap-Karten (zum Beispiel Kartenbilder von Mapnik oder Osmarender/tiles@home) verwendest, möchten wir, dass der Lizenzhinweis zumindest “(c) OpenStreetMap (und) Mitwirkende, CC-BY-SA” oder die englische Variante “(c) OpenStreetMap (and) contributors, CC-BY-SA” enthält.”

“Bei einer interaktiven elektronischen Karte (zum Beispiel auf einer Website oder in einer Handy-Anwendung), sollte der Lizenzhinweis in einer der Ecken stehen — genauso wie man es von anderen Kartenanbietern wie z.B. GoogleMaps kennt.”

mfg

Walter

Ich habe den Hinweis nachgepflegt. Das soll ja alles seine Richtigkeit haben :slight_smile:

Gruß,

Timo