Subversion Repositories eFlore/Applications.moissonnage

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
});