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.
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.
Das ist natürlich auch eine Möglichkeit. Da bin ich noch gar nicht drauf gekommen, danke!
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?
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.
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());
@ikonor
Wenn ich könnte, würde ich dir jetzt ein Bier ausgeben
So wie du es beschrieben hast, funktioniert es absolut einwandfrei. Wirklich klasse
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 werde das Höhenprofil allerdings demnächst mit jqPlot realisieren. Das nutzt das HTML5 Canvas Element und bietet einige wirklich interessante Funktionen.
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.
“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.”