DE:Openlayers Track example
Dieses Beispiel zeigt, wie man einen, oder mehrere .gpx Tracks mit Openlayer in einer Karte darstellen kann.
Contents |
Ergebnis
Das Ganze basiert auf dem OpenLayers_Simple_Example (englisch).
Das Ergebnis als zoombare Karte.
Das folgende Bild ist lediglich ein Bildschirmfoto:
Anleitung
Voraussetzungen
- Track im .gpx Dateiformat
- Texteditor (z.B. Notepad, oder Wordpad bei Windows)
- ca. drei Minuten Zeit
GPX-Datei erstellen
Erstelle einen neuen Ordner an einem beliebigen Ort auf der Festplatte.
Speichere im neuen Ordner deine GPX-Dateien (in denen die Geo-Daten liegen).
- GPX-Datei "Bruderholz"
Wenn du noch keine fertige GPX-Datei hast, kannst du diese selbst erstellen.
Oder auch untenstehende Testdatei kopieren. Dazu klickt man auf "Datei" → "Neu" → "Textdokument". Als Dateinamen gibt man "mb_bruderholz.gpx" (ohne die "") ein. Wichtig: Damit aus der Textdatei auch eine .gpx Datei wird, muss man sich über Extras → Ordneroptionen → Karteireiter "Ansicht" die Option "Erweiterungen bei bekannten Dateitypen ausblenden" deaktivieren (Haken entfernen und auf Ok klicken). Das sollte allerdings erst am Ende gemacht werden, damit die Datei problemlos mit dem Texteditor geöffnet werden kann.
Folgender Code wird nun in die neue .gpx-Datei kopiert:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <gpx version="1.0" creator="Turbo GPS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd"> <wpt lat="47.545" lon="7.586"> <name>Beispiel-Marker</name> <desc> Man kann auch way points in den GPX-Trace aufnehmen. Wichtig dabei ist, dass <b>UTF8</b> verwendet wird, wenn Umlaute oder HTML-Code verwendet werden soll (z.B. ß, ä, ö ... siehe dieses Beispiel hier) <br><br>Unicode-Tabelle: <a href="http://de.selfhtml.org/html/referenz/zeichen.htm">hier</a>. </desc> </wpt> <trk> <name>mb bruderholz basel reinach</name> <number>1</number> <trkseg> <trkpt lat="47.547855" lon="7.589664"> <ele>0.000000</ele> <name>p #1</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.546871" lon="7.592068"> <ele>0.000000</ele> <name>p #2</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.546379" lon="7.593312"> <ele>0.000000</ele> <name>p #3</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.545338" lon="7.592540"> <ele>0.000000</ele> <name>p #4</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.545685" lon="7.591596"> <ele>0.000000</ele> <name>p #5</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.545395" lon="7.591381"> <ele>0.000000</ele> <name>p #6</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.546089" lon="7.588205"> <ele>0.000000</ele> <name>p #7</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.545338" lon="7.587776"> <ele>0.000000</ele> <name>p #8</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.545799" lon="7.586532"> <ele>0.000000</ele> <name>p #9</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.542873" lon="7.584171"> <ele>0.000000</ele> <name>p #10</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.541889" lon="7.587175"> <ele>0.000000</ele> <name>p #11</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.540615" lon="7.586489"> <ele>0.000000</ele> <name>p #12</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.540062" lon="7.586532"> <ele>0.000000</ele> <name>p #13</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.539688" lon="7.587090"> <ele>0.000000</ele> <name>p #14</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.539600" lon="7.587647"> <ele>0.000000</ele> <name>p #15</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.539425" lon="7.587733"> <ele>0.000000</ele> <name>p #16</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.539455" lon="7.586617"> <ele>0.000000</ele> <name>p #17</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.539425" lon="7.586060"> <ele>0.000000</ele> <name>p #18</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.539165" lon="7.585630"> <ele>0.000000</ele> <name>p #19</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.538528" lon="7.585545"> <ele>0.000000</ele> <name>p #20</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.538269" lon="7.585545"> <ele>0.000000</ele> <name>p #21</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.537746" lon="7.585888"> <ele>0.000000</ele> <name>p #22</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.537281" lon="7.586360"> <ele>0.000000</ele> <name>p #23</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.536209" lon="7.586617"> <ele>0.000000</ele> <name>p #24</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.535717" lon="7.587218"> <ele>0.000000</ele> <name>p #25</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.534210" lon="7.587347"> <ele>0.000000</ele> <name>p #26</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.533283" lon="7.587090"> <ele>0.000000</ele> <name>p #27</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.532269" lon="7.587218"> <ele>0.000000</ele> <name>p #28</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.531895" lon="7.588162"> <ele>0.000000</ele> <name>p #29</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.530994" lon="7.588634"> <ele>0.000000</ele> <name>p #30</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.529545" lon="7.588549"> <ele>0.000000</ele> <name>p #31</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.528214" lon="7.588592"> <ele>0.000000</ele> <name>p #32</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.528069" lon="7.588978"> <ele>0.000000</ele> <name>p #33</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.527809" lon="7.589536"> <ele>0.000000</ele> <name>p #34</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.525894" lon="7.589922"> <ele>0.000000</ele> <name>p #35</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.523083" lon="7.589407"> <ele>0.000000</ele> <name>p #36</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.521778" lon="7.589793"> <ele>0.000000</ele> <name>p #37</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.519577" lon="7.590308"> <ele>0.000000</ele> <name>p #38</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.516304" lon="7.589750"> <ele>0.000000</ele> <name>p #39</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.513142" lon="7.588634"> <ele>0.000000</ele> <name>p #40</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.509953" lon="7.587004"> <ele>0.000000</ele> <name>p #41</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.509434" lon="7.583227"> <ele>0.000000</ele> <name>p #42</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.508156" lon="7.583055"> <ele>0.000000</ele> <name>p #43</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.507172" lon="7.583184"> <ele>0.000000</ele> <name>p #44</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.507141" lon="7.581425"> <ele>0.000000</ele> <name>p #45</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.506882" lon="7.580566"> <ele>0.000000</ele> <name>p #46</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.506359" lon="7.580180"> <ele>0.000000</ele> <name>p #47</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.505230" lon="7.579536"> <ele>0.000000</ele> <name>p #48</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.503838" lon="7.579408"> <ele>0.000000</ele> <name>p #49</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.502911" lon="7.578421"> <ele>0.000000</ele> <name>p #50</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.502880" lon="7.580566"> <ele>0.000000</ele> <name>p #51</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.502968" lon="7.582669"> <ele>0.000000</ele> <name>p #52</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.501228" lon="7.581553"> <ele>0.000000</ele> <name>p #53</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.501053" lon="7.581811"> <ele>0.000000</ele> <name>p #54</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.500126" lon="7.577734"> <ele>0.000000</ele> <name>p #55</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.498940" lon="7.575459"> <ele>0.000000</ele> <name>p #56</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.498619" lon="7.575030"> <ele>0.000000</ele> <name>p #57</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.496880" lon="7.572412"> <ele>0.000000</ele> <name>p #58</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.496792" lon="7.571726"> <ele>0.000000</ele> <name>p #59</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.495140" lon="7.570610"> <ele>0.000000</ele> <name>p #60</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.494995" lon="7.571082"> <ele>0.000000</ele> <name>p #61</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> <trkpt lat="47.493950" lon="7.570095"> <ele>0.000000</ele> <name>p #62</name> <time>60056-05-28T03:36:54Z</time> <speed>0.000000</speed> <course>0.000000</course> </trkpt> </trkseg> </trk> </gpx>
CSS-Datei erstellen
Kopiere folgenden Code (achte darauf, dass du auch das erste und letzte Zeichen kopiert hast!), füge ihn mit dem Texteditor in eine neue Seite, speichere den Text im neu angelegten Ordner unter dem Dateinamen "map.css" (ohne ""):
html,body {
background-color: #000000;
height: 100%;
width: 100%;
margin: 1%; padding: 0;
font-family: Helvetica,Arial,sans-serif;
overflow: hidden;
color: #000000;
}
div#map {
height: 81%;
width: 96%;
padding: 0;
margin: 0;
}
.olControlAttribution {
font-size: smaller;
right: 3px;
top: 1000px;
color: #000000;
}
JavaScript-Datei erstellen
Kopiere folgenden Code (achte darauf, dass du auch das erste und letzte Zeichen kopiert hast!), füge ihn mit dem Texteditor in eine neue Seite, speichere den Text im neu angelegten Ordner unter dem Dateinamen "GPX.js" (ohne ""):
/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
* See http://svn.openlayers.org/trunk/openlayers/release-license.txt
* for the full text of the license. */
/**
* @class
*
* @requires OpenLayers/Layer/Markers.js
* @requires OpenLayers/Ajax.js
*/
OpenLayers.Layer.GPX = OpenLayers.Class.create();
OpenLayers.Layer.GPX.prototype =
OpenLayers.Class.inherit( OpenLayers.Layer.Markers, OpenLayers.Layer.Vector, {
/** store url of text file
* @type str */
url:null,
icolor:null,
/** @type Array(OpenLayers.Feature) */
features: null,
/** @type OpenLayers.Feature */
selectedFeature: null,
/**
* @constructor
*
* @param {String} name
* @param {String} location
*/
initialize: function(name, url, icolor, options) {
var newArguments = new Array();
newArguments.push(name, options);
OpenLayers.Layer.Vector.prototype.initialize.apply(this, newArguments);
OpenLayers.Layer.Markers.prototype.initialize.apply(this, [name]);
this.url = url;
this.icolor = icolor;
this.features = new Array();
var results = OpenLayers.loadURL(this.url, null, this, this.requestSuccess, this.requestFailure);
},
/**
*
*/
destroy: function() {
this.clearFeatures();
this.features = null;
OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments);
},
/**
* @param {XMLHttpRequest} ajaxRequest
*/
requestSuccess:function(request) {
var gpxns = "http://www.topografix.com/GPX/1/0";
var doc = request.responseXML;
if (!doc || request.fileType!="XML") {
doc = OpenLayers.parseXMLString(request.responseText);
}
if (typeof doc == "string") {
doc = OpenLayers.parseXMLString(doc);
}
/* search and display track */
// var trk = OpenLayers.Ajax.getElementsByTagNameNS(doc, gpxns, "", "trk");
var trk = doc.getElementsByTagName("trk");
var featureTRK = [];
for (var i = 0; i< trk.length; i++) {
// var color = '#00FF00'; // Fix Color
// var color=this.randomColor(); // Random Color
var color=this.icolor; // Random Color
for (var j = 0; j < trk[i].childNodes.length; j++) {
switch (trk[i].childNodes[j].nodeName)
{
case 'topografix:color':
color = '#' + OpenLayers.Util.getXmlNodeValue(trk[i].childNodes[j]);
break;
case 'trkseg':
if (color == '')
color=this.randomColor();
featureTRK.push(this.addLineGPX(trk[i].childNodes[j], color));
break;
case '#text':
break;
case 'name':
//FIXME: label the way
break;
default:
// alert('unknown ' + trk[i].childNodes[j].nodeName);
break;
}
}
}
this.addFeatures(featureTRK);
/* search and display route */
// var rte = OpenLayers.Ajax.getElementsByTagNameNS(doc, gpxns, "", "rte");
var rte = doc.getElementsByTagName("rte");
var featureRTE = [];
for (var i = 0; i< rte.length; i++) {
var color = this.randomColor();
var style_green = {
strokeColor: color,
strokeOpacity: 1,
strokeWidth: 4,
pointRadius: 6,
pointerEvents: "visiblePainted"
};
var pointList = [];
for (var j = 0; j < rte[i].childNodes.length; j++) {
switch (rte[i].childNodes[j].nodeName)
{
case 'rtept':
var feature = this.parseFeature(rte[i].childNodes[j]);
if (feature) {
pointList.push(feature);
}
break;
default:
break;
}
}
featureRTE.push(new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(pointList),null,style_green));
};
this.addFeatures(featureRTE);
/* search and display waypoint */
// var wpt = OpenLayers.Ajax.getElementsByTagNameNS(doc, gpxns, "", "wpt");
var wpt = doc.getElementsByTagName("wpt");
var featuresWPT = [];
for (var i = 0; i< wpt.length; i++) {
var data = {};
var point = this.setToMercator(wpt[i].getAttribute('lon'),wpt[i].getAttribute('lat'));
var location = new OpenLayers.LonLat(point[0], point[1]);
/* Provide defaults for title and description */
var title = "Untitled";
try {
title = OpenLayers.Util.getNodes(wpt[i],
'name')[0].firstChild.nodeValue;
}
catch (e) { title="Untitled"; }
/* GPX descriptions */
var description = "No description.";
try {
description = OpenLayers.Util.getNodes(wpt[i],
'desc')[0].firstChild.nodeValue;
}catch (e) {
var description = "No description.";
}
data.icon = OpenLayers.Marker.defaultIcon();
// data.popupSize = new OpenLayers.Size(250, 120);
if ((title != null) && (description != null)) {
// if (link) contentHTML += '<a class="link" href="'+link+'" target="_blank">';
// contentHTML += '<p>' + title + '</p>';
// if (link) contentHTML += '</a>';
contentHTML = '<p><strong>' + title + '</strong><br />' + description + '</p>';
data['popupContentHTML'] = contentHTML;
}
var featureWPT = new OpenLayers.Feature(this, location, data);
featuresWPT.push(featureWPT);
var marker = featureWPT.createMarker();
marker.events.register('click', featureWPT, this.markerClick);
this.addMarker(marker);
}
// for (var i = 0; i < itemlist.length; i++) {
//---
//
// /* If no link URL is found in the first child node, try the
// href attribute */
// try {
// var link = OpenLayers.Util.getNodes(itemlist[i], "link")[0].firstChild.nodeValue;
// }
// catch (e) {
// try {
// var link = OpenLayers.Util.getNodes(itemlist[i], "link")[0].getAttribute("href");
// }
// catch (e) {}
// }
// }
},
/**
* @param {Event} evt
*/
randomColor: function() {
var hex=new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
var color = '#';
for (i=0;i<6;i++){
color += hex[Math.floor(Math.random()*hex.length)];
}
return color;
},
markerClick: function(evt) {
sameMarkerClicked = (this == this.layer.selectedFeature);
this.layer.selectedFeature = (!sameMarkerClicked) ? this : null;
for(var i=0; i < this.layer.map.popups.length; i++) {
this.layer.map.removePopup(this.layer.map.popups[i]);
}
if (!sameMarkerClicked) {
var popup = this.createPopup(true);
OpenLayers.Event.observe(popup.div, "click",
function() {
for(var i=0; i < this.layer.map.popups.length; i++) {
this.layer.map.removePopup(this.layer.map.popups[i]);
}
}.bindAsEventListener(this));
this.layer.map.addPopup(popup);
}
OpenLayers.Event.stop(evt);
},
addLineGPX: function(xmlNode, color) {
var style_green = {
strokeColor: color,
strokeOpacity: 0.6,
strokeWidth: 5,
pointRadius: 6,
pointerEvents: "visiblePainted"
};
var pointList = [];
for (var i = 0; i < xmlNode.childNodes.length; i++) {
// for (var i = 0; i < 4; i++) {
if (xmlNode.childNodes[i].nodeName == "trkpt")
{
var feature = this.parseFeature(xmlNode.childNodes[i]);
if (feature) {
pointList.push(feature);
}
}
};
return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(pointList),null,style_green);
},
/**
* This function is the core of the GPX parsing code in OpenLayers.
* It creates the geometries that are then attached to the returned
* feature, and calls parseAttributes() to get attribute data out.
* @param DOMElement xmlNode
*/
parseFeature: function(xmlNode) {
if (xmlNode.getAttribute('lat') && xmlNode.getAttribute('lon')) {
var point = this.setToMercator(xmlNode.getAttribute('lon'),xmlNode.getAttribute('lat'));
return new OpenLayers.Geometry.Point(point[0], point[1]);
}
return false;
},
setToMercator: function(lon, lat) {
x = parseFloat(lon);
y = parseFloat(lat);
var PI = 3.14159265358979323846;
x = x * 20037508.34 / 180;
y = Math.log (Math.tan ((90 + y) * PI / 360)) / (PI / 180);
y = y * 20037508.34 / 180;
return new Array(x,y);
},
/**
*
*/
clearFeatures: function() {
if (this.features != null) {
while(this.features.length > 0) {
var feature = this.features[0];
OpenLayers.Util.removeItem(this.features, feature);
feature.destroy();
}
}
},
requestFailure: function(request) {
},
moveTo:function(bounds, zoomChanged, dragging) {
OpenLayers.Layer.Vector.prototype.moveTo.apply(this, arguments);
// OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments);
if (!dragging) {
this.div.style.left = - parseInt(this.map.layerContainerDiv.style.left) + "px";
this.div.style.top = - parseInt(this.map.layerContainerDiv.style.top) + "px";
var extent = this.map.getExtent();
this.renderer.setExtent(extent);
for(i=0; i < this.markers.length; i++) {
marker = this.markers[i];
lonlat = this.map.getLayerPxFromLonLat(marker.lonlat);
if (marker.icon.calculateOffset) {
marker.icon.offset = marker.icon.calculateOffset(marker.icon.size);
}
var offsetPx = lonlat.offset(marker.icon.offset);
marker.icon.imageDiv.style.left = offsetPx.x+parseInt(this.map.layerContainerDiv.style.left) + "px";
marker.icon.imageDiv.style.top = offsetPx.y+parseInt(this.map.layerContainerDiv.style.top) + "px";
}
}
if (!this.drawn || zoomChanged) {
this.drawn = true;
for(var i = 0; i < this.features.length; i++) {
var feature = this.features[i];
this.drawFeature(feature);
}
}
},
setMap: function(map) {
// OpenLayers.Layer.Markers.prototype.setMap.apply(this, arguments);
OpenLayers.Layer.prototype.setMap.apply(this, arguments);
if (!this.renderer) {
this.map.removeLayer(this);
} else {
this.renderer.map = this.map;
this.renderer.setSize(this.map.getSize());
}
},
/** @final @type String */
CLASS_NAME: "OpenLayers.Layer.GPX"
});
HTML-Datei erstellen
Kopiere folgenden Code (achte darauf, dass du auch das erste und letzte Zeichen kopiert hast! Alles von <html> bis </html> einschließlich), füge ihn mit dem Texteditor in eine neue Seite, speichere den Text im neu angelegten Ordner unter dem Dateinamen "ol_track.htm" (ohne ""):
<html> <head> <title>Simple OSM GpX Track</title> <!-- bring in the OpenLayers javascript library (here we bring it from the remote site, but you could easily serve up this javascript yourself) --> <script src="http://www.openlayers.org/api/OpenLayers.js"></script> <!-- bring in the OpenStreetMap OpenLayers layers. Using this hosted file will make sure we are kept up to date with any necessary changes --> <script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script> <script src="http://www.openlayers.org/api/Ajax.js"></script> <script src="GPX.js"></script> <script type="text/javascript"> // Start position for the map (hardcoded here for simplicity, // but maybe you want to get from URL params) var lat=47.496792 var lon=7.571726 var zoom=13 var map; //complex object of type OpenLayers.Map //Initialise the 'map' object function init() { map = new OpenLayers.Map ("map", { controls:[ new OpenLayers.Control.Navigation(), new OpenLayers.Control.PanZoomBar(), new OpenLayers.Control.LayerSwitcher(), new OpenLayers.Control.Attribution()], maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), maxResolution: 156543.0399, numZoomLevels: 19, units: 'm', projection: new OpenLayers.Projection("EPSG:900913"), displayProjection: new OpenLayers.Projection("EPSG:4326") } ); // Define the map layer // Note that we use a predefined layer that will be // kept up to date with URL changes // Here we define just one layer, but providing a choice // of several layers is also quite simple // Other defined layers are OpenLayers.Layer.OSM.Mapnik, OpenLayers.Layer.OSM.Maplint and OpenLayers.Layer.OSM.CycleMap layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"); map.addLayer(layerMapnik); layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Osmarender"); map.addLayer(layerTilesAtHome); layerCycleMap = new OpenLayers.Layer.OSM.CycleMap("CycleMap"); map.addLayer(layerCycleMap); layerMarkers = new OpenLayers.Layer.Markers("Markers"); map.addLayer(layerMarkers); // Add the Layer with GPX Track choose the color of the Track (replace #00FF00 by the HTML code of the color you want) var lgpx = new OpenLayers.Layer.GPX("MB Bruderholz", "mb_bruderholz.GPX", "#00FF00"); map.addLayer(lgpx); var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); map.setCenter (lonLat, zoom); var size = new OpenLayers.Size(21,25); var offset = new OpenLayers.Pixel(-(size.w/2), -size.h); var icon = new OpenLayers.Icon('http://www.openstreetmap.org/openlayers/img/marker.png',size,offset); layerMarkers.addMarker(new OpenLayers.Marker(lonLat,icon)); } </script> <link rel="stylesheet" type="text/css" href="map.css"> </head> <!-- body.onload is called once the page is loaded (call the 'init' function) --> <body onload="init();"> <!-- define a DIV into which the map will appear. Make it take up the whole window --> <div style="width:90%; height:90%" id="map"></div> </body> </html>
HTML-Datei anpassen
Die HTML-Datei kannst du nach deinen Wünschen und Bedürfnissen anpassen.
Dazu öffnest Du mit einem Texteditor die Datei "ol_track.htm" und änderst die einzelnen Zeilen:
- Kartenmitte und Zoomstufe definieren
var lon = 47.496792; var lat = 7.571726; var zoom = 13;
Die Koordinaten für die gewünschte Kartenmitte und der Wert für die Zoomstufe sind entsprechend anzupassen.
- Track anpassen
// Add the Layer with GPX Track var GPX-Variable = new OpenLayers.Layer.GPX("angezeigter Name des Layers", "../Pfad/Dateiname.gpx", "#00FF00");
Die Werte für den anzuzeigenden Layer-Namen, die GPX-Datei und die Farben sind entsprechend anzupassen. (Farbtabelle)
- mehrere Layer
Wenn mehrere Layer angezeigt werden sollen, kann die Zeile mehrfach eingefügt werden.
Jede Zeile benötigt eine eigene GPX-Variable: GPX-Variable-1, GPX-Variable-2, etc.
Im Aufruf der Funktion map.addLayers müssen alle GPX-Variablen eingebunden werden.
- Layer aufrufen
map.addLayer(GPX-Variable);
Bei mehreren Layern müssen mehrere GPX-Variablen eingebunden werden.