[PLUGINS] +clavettes et dependances
[lhc/web/clavette_www.git] / www / plugins / gis / lib / leaflet / plugins / GPX.js
1 L.GPX = L.FeatureGroup.extend({
2 initialize: function(gpx, options) {
3 L.Util.setOptions(this, options);
4 this._gpx = gpx;
5 this._layers = {};
6
7 if (gpx) {
8 this.addGPX(gpx, options, this.options.async);
9 }
10 },
11
12 loadXML: function(url, cb, options, async) {
13 if (async === undefined) async = this.options.async;
14 if (options === undefined) options = this.options;
15
16 var req = new window.XMLHttpRequest();
17 req.open('GET', url, async);
18 try {
19 req.overrideMimeType('text/xml'); // unsupported by IE
20 } catch(e) {}
21 req.onreadystatechange = function() {
22 if (req.readyState !== 4) return;
23 if(req.status === 200) cb(req.responseXML, options);
24 };
25 req.send(null);
26 },
27
28 _humanLen: function(l) {
29 if (l < 2000)
30 return l.toFixed(0) + ' m';
31 else
32 return (l/1000).toFixed(1) + ' km';
33 },
34
35 _polylineLen: function(line)//line is a L.Polyline()
36 {
37 var ll = line._latlngs;
38 var d = 0, p = null;
39 for (var i = 0; i < ll.length; i++)
40 {
41 if(i && p)
42 d += p.distanceTo(ll[i]);
43 p = ll[i];
44 }
45 return d;
46 },
47
48 addGPX: function(url, options, async) {
49 var _this = this;
50 var cb = function(gpx, options) { _this._addGPX(gpx, options); };
51 this.loadXML(url, cb, options, async);
52 },
53
54 _addGPX: function(gpx, options) {
55 var layers = this.parseGPX(gpx, options);
56 if (!layers) return;
57 this.addLayer(layers);
58 this.fire('loaded');
59 },
60
61 parseGPX: function(xml, options) {
62 var j, i, el, layers = [];
63 var named = false, tags = [['rte','rtept'], ['trkseg','trkpt']];
64
65 for (j = 0; j < tags.length; j++) {
66 el = xml.getElementsByTagName(tags[j][0]);
67 for (i = 0; i < el.length; i++) {
68 var l = this.parse_trkseg(el[i], xml, options, tags[j][1]);
69 for (var k = 0; k < l.length; k++) {
70 if (this.parse_name(el[i], l[k])) named = true;
71 layers.push(l[k]);
72 }
73 }
74 }
75
76 el = xml.getElementsByTagName('wpt');
77 if (options.display_wpt !== false) {
78 for (i = 0; i < el.length; i++) {
79 var marker = this.parse_wpt(el[i], xml, options);
80 if (!marker) continue;
81 if (this.parse_name(el[i], marker)) named = true;
82 layers.push(marker);
83 }
84 }
85
86 if (!layers.length) return;
87 var layer = layers[0];
88 if (layers.length > 1)
89 layer = new L.FeatureGroup(layers);
90 if (!named) this.parse_name(xml, layer);
91 return layer;
92 },
93
94 parse_name: function(xml, layer) {
95 var i, el, txt='', name, descr='', len=0;
96 el = xml.getElementsByTagName('name');
97 if (el.length)
98 name = el[0].childNodes[0].nodeValue;
99 el = xml.getElementsByTagName('desc');
100 for (i = 0; i < el.length; i++) {
101 for (var j = 0; j < el[i].childNodes.length; j++)
102 descr = descr + el[i].childNodes[j].nodeValue;
103 }
104
105 if(layer instanceof L.Path)
106 len = this._polylineLen(layer);
107
108 if (name) txt += '<h2>' + name + '</h2>' + descr;
109 if (len) txt += '<p>' + this._humanLen(len) + '</p>';
110
111 if (layer && layer._popup === undefined) layer.bindPopup(txt);
112 return txt;
113 },
114
115 parse_trkseg: function(line, xml, options, tag) {
116 var el = line.getElementsByTagName(tag);
117 if (!el.length) return [];
118 var coords = [];
119 for (var i = 0; i < el.length; i++) {
120 var ll = new L.LatLng(el[i].getAttribute('lat'),
121 el[i].getAttribute('lon'));
122 ll.meta = {};
123 for (var j in el[i].childNodes) {
124 var e = el[i].childNodes[j];
125 if (!e.tagName) continue;
126 ll.meta[e.tagName] = e.textContent;
127 }
128 coords.push(ll);
129 }
130 var l = [new L.Polyline(coords, options)];
131 this.fire('addline', {line:l});
132 return l;
133 },
134
135 parse_wpt: function(e, xml, options) {
136 var m = new L.Marker(new L.LatLng(e.getAttribute('lat'),
137 e.getAttribute('lon')), options);
138 this.fire('addpoint', {point:m});
139 return m;
140 }
141 });