Mapstraction.prototype.getXmlHttp = function() {
var req = false;
if(window.XMLHttpRequest) {
try {
req = new XMLHttpRequest();
} catch(e) {
req = false;
}
} else if(window.ActiveXObject) {
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
req = false;
}
}
}
return req;
}
Mapstraction.prototype.openGPX = function(url) {
var request = this.getXmlHttp();
var mapstractionplot = this.plotGPX;
request.onreadystatechange = function() {
if (request.readyState == 4) {
var xmlDoc = request.responseXML; // relies on correct mimetype
mapstractionplot(xmlDoc);
}
}
request.setRequestHeader('Content-Type','text/xml');
request.open("GET", url, true);
request.send("");
}
Mapstraction.prototype.addPolyLine = function(points) {
switch(this.api) {
case 'google':
var gpoints = [];
for (var i = 0; i < points.length; i++) {
gpoints[i] = new GLatLng(points[i].lat,points[i].lon);
}
map.addOverlay(new GPolyline(gpoints));
break;
default:
alert('polyline not supported by Mapstraction for ' + api);
}
}
Mapstraction.prototype.plotGPX = function(xmlDoc) {
// parse tracks from GPX file...
var trks = xmlDoc.documentElement.getElementsByTagName("trk");
var lastPoint;
for (var i = 0; i < trks.length; i++) {
var trksegs = trks[i].getElementsByTagName("trkseg");
for (var j = 0; j < trksegs.length; j++) {
var trkpts = trksegs[j].getElementsByTagName("trkpt");
if (trkpts.length > 1) {
var points;
for (var diff = 0.000000001, count = 201; count > 200; diff *= 5) {
points = [];
var first = true;
var oldlon = 0.0;
var oldlat = 0.0;
var oldvx = 0.0;
var oldvy = 0.0;
var lat = parseFloat(trkpts[0].getAttribute("lat"));
var lon = parseFloat(trkpts[0].getAttribute("lon"));
points[points.length] = new LatLonPoint(lat,lon);
count = 1;
for (var k = 1; k < trkpts.length; k++) {
lat = parseFloat(trkpts[k].getAttribute("lat"));
lon = parseFloat(trkpts[k].getAttribute("lon"));
vx = oldlon - lon;
vy = oldlat - lat;
if ( ((oldvx - vx)*(oldvx - vx))+((oldvy - vy)*(oldvy - vy)) > diff ) {
count += 1;
points[points.length] = new LatLonPoint( lat, lon );
oldvx = vx;
oldvy = vy;
oldlat = lat;
oldlon = lon;
}
}
} // for trkpts
this.addOverlay(points);
lastPoint = points[0];
} // if
} // for trksegs
} // for trks
// parse waypoints from GPX file
var wpts = xmlDoc.documentElement.getElementsByTagName("wpt");
for (var i = 0; i < wpts.length; i++) {
var text = "Waypoint info:
"
for (var child = wpts[i].firstChild; child; child = child.nextSibling) {
if (child.text) {
text += child.nodeName + ": " + child.text + "
";
}
else if (child.nodeType != 3) {
text += child.nodeName + ": " + child.firstChild.nodeValue + "
";
}
}
var point = new LatLonPoint(parseFloat(wpts[i].getAttribute("lat")), parseFloat(wpts[i].getAttribute("lon")));
var marker = new Marker(point);
marker.setInfoBubble(text);
this.addMarker(marker);
lastPoint = point;
}
}