4 |
delphine |
1 |
/*global L: true */
|
|
|
2 |
|
|
|
3 |
L.GPX = L.FeatureGroup.extend({
|
|
|
4 |
initialize: function(gpx, options) {
|
|
|
5 |
L.Util.setOptions(this, options);
|
|
|
6 |
this._gpx = gpx;
|
|
|
7 |
this._layers = {};
|
|
|
8 |
|
|
|
9 |
if (gpx) {
|
|
|
10 |
this.addGPX(gpx, options, this.options.async);
|
|
|
11 |
}
|
|
|
12 |
},
|
|
|
13 |
|
|
|
14 |
loadXML: function(url, cb, options, async) {
|
|
|
15 |
if (async == undefined) async = this.options.async;
|
|
|
16 |
if (options == undefined) options = this.options;
|
|
|
17 |
|
|
|
18 |
var req = new window.XMLHttpRequest();
|
|
|
19 |
req.open('GET', url, async);
|
|
|
20 |
try {
|
|
|
21 |
req.overrideMimeType('text/xml'); // unsupported by IE
|
|
|
22 |
} catch(e) {}
|
|
|
23 |
req.onreadystatechange = function() {
|
|
|
24 |
if (req.readyState != 4) return;
|
|
|
25 |
if(req.status == 200) cb(req.responseXML, options);
|
|
|
26 |
};
|
|
|
27 |
req.send(null);
|
|
|
28 |
},
|
|
|
29 |
|
|
|
30 |
addGPX: function(url, options, async) {
|
|
|
31 |
var _this = this;
|
|
|
32 |
var cb = function(gpx, options) { _this._addGPX(gpx, options) };
|
|
|
33 |
this.loadXML(url, cb, options, async);
|
|
|
34 |
},
|
|
|
35 |
|
|
|
36 |
_addGPX: function(gpx, options) {
|
|
|
37 |
var layers = this.parseGPX(gpx, options);
|
|
|
38 |
if (!layers) return;
|
|
|
39 |
this.addLayer(layers);
|
|
|
40 |
this.fire("loaded");
|
|
|
41 |
},
|
|
|
42 |
|
|
|
43 |
parseGPX: function(xml, options) {
|
|
|
44 |
var j, i, el, layers = [];
|
|
|
45 |
var named = false, tags = [['rte','rtept'], ['trkseg','trkpt']];
|
|
|
46 |
|
|
|
47 |
for (j = 0; j < tags.length; j++) {
|
|
|
48 |
el = xml.getElementsByTagName(tags[j][0]);
|
|
|
49 |
for (i = 0; i < el.length; i++) {
|
|
|
50 |
var l = this.parse_trkseg(el[i], xml, options, tags[j][1]);
|
|
|
51 |
for (var k = 0; k < l.length; k++) {
|
|
|
52 |
if (this.parse_name(el[i], l[k])) named = true;
|
|
|
53 |
layers.push(l[k]);
|
|
|
54 |
}
|
|
|
55 |
}
|
|
|
56 |
}
|
|
|
57 |
|
|
|
58 |
el = xml.getElementsByTagName('wpt');
|
|
|
59 |
for (i = 0; i < el.length; i++) {
|
|
|
60 |
var l = this.parse_wpt(el[i], xml, options);
|
|
|
61 |
if (!l) continue;
|
|
|
62 |
if (this.parse_name(el[i], l)) named = true;
|
|
|
63 |
layers.push(l);
|
|
|
64 |
}
|
|
|
65 |
|
|
|
66 |
if (!layers.length) return;
|
|
|
67 |
var layer = layers[0];
|
|
|
68 |
if (layers.length > 1)
|
|
|
69 |
layer = new L.FeatureGroup(layers);
|
|
|
70 |
//if (!named) this.parse_name(xml, layer);
|
|
|
71 |
return layer;
|
|
|
72 |
},
|
|
|
73 |
|
|
|
74 |
parse_name: function(xml, layer) {
|
|
|
75 |
var i, el, name, descr="";
|
|
|
76 |
el = xml.getElementsByTagName('name');
|
|
|
77 |
if (el.length) name = el[0].childNodes[0].nodeValue;
|
|
|
78 |
el = xml.getElementsByTagName('desc');
|
|
|
79 |
for (i = 0; i < el.length; i++) {
|
|
|
80 |
for (var j = 0; j < el[i].childNodes.length; j++)
|
|
|
81 |
descr = descr + el[i].childNodes[j].nodeValue;
|
|
|
82 |
}
|
|
|
83 |
if (!name) return;
|
|
|
84 |
var txt = "<h2>" + name + "</h2>" + descr;
|
|
|
85 |
if (layer && layer._popup === undefined) layer.bindPopup(txt);
|
|
|
86 |
return txt;
|
|
|
87 |
},
|
|
|
88 |
|
|
|
89 |
parse_trkseg: function(line, xml, options, tag) {
|
|
|
90 |
var el = line.getElementsByTagName(tag);
|
|
|
91 |
if (!el.length) return [];
|
|
|
92 |
var coords = [];
|
|
|
93 |
for (var i = 0; i < el.length; i++) {
|
|
|
94 |
var ll = new L.LatLng(el[i].getAttribute('lat'),
|
|
|
95 |
el[i].getAttribute('lon'));
|
|
|
96 |
ll.meta = {};
|
|
|
97 |
for (var j in el[i].childNodes) {
|
|
|
98 |
var e = el[i].childNodes[j];
|
|
|
99 |
if (!e.tagName) continue;
|
|
|
100 |
ll.meta[e.tagName] = e.textContent;
|
|
|
101 |
}
|
|
|
102 |
coords.push(ll);
|
|
|
103 |
}
|
|
|
104 |
var l = [new L.Polyline(coords, options)];
|
|
|
105 |
this.fire('addline', {line:l})
|
|
|
106 |
return l;
|
|
|
107 |
},
|
|
|
108 |
|
|
|
109 |
parse_wpt: function(e, xml, options) {
|
|
|
110 |
var m = new L.Marker(new L.LatLng(e.getAttribute('lat'),
|
|
|
111 |
e.getAttribute('lon')), options);
|
|
|
112 |
this.fire('addpoint', {point:m});
|
|
|
113 |
return m;
|
|
|
114 |
}
|
|
|
115 |
});
|