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; } }