1 L
.GPX
= L
.FeatureGroup
.extend({
2 initialize: function(gpx
, options
) {
3 L
.Util
.setOptions(this, options
);
8 this.addGPX(gpx
, options
, this.options
.async
);
12 loadXML: function(url
, cb
, options
, async
) {
13 if (async
=== undefined) async
= this.options
.async
;
14 if (options
=== undefined) options
= this.options
;
16 var req
= new window
.XMLHttpRequest();
17 req
.open('GET', url
, async
);
19 req
.overrideMimeType('text/xml'); // unsupported by IE
21 req
.onreadystatechange = function() {
22 if (req
.readyState
!== 4) return;
23 if(req
.status
=== 200) cb(req
.responseXML
, options
);
28 _humanLen: function(l
) {
30 return l
.toFixed(0) + ' m';
32 return (l
/1000).toFixed(1) + ' km';
35 _polylineLen: function(line
)//line is a L.Polyline()
37 var ll
= line
._latlngs
;
39 for (var i
= 0; i
< ll
.length
; i
++)
42 d
+= p
.distanceTo(ll
[i
]);
48 addGPX: function(url
, options
, async
) {
50 var cb = function(gpx
, options
) { _this
._addGPX(gpx
, options
); };
51 this.loadXML(url
, cb
, options
, async
);
54 _addGPX: function(gpx
, options
) {
55 var layers
= this.parseGPX(gpx
, options
);
57 this.addLayer(layers
);
61 parseGPX: function(xml
, options
) {
62 var j
, i
, el
, layers
= [];
63 var named
= false, tags
= [['rte','rtept'], ['trkseg','trkpt']];
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;
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;
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
);
94 parse_name: function(xml
, layer
) {
95 var i
, el
, txt
='', name
, descr
='', len
=0;
96 el
= xml
.getElementsByTagName('name');
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
;
105 if(layer
instanceof L
.Path
)
106 len
= this._polylineLen(layer
);
108 if (name
) txt
+= '<h2>' + name
+ '</h2>' + descr
;
109 if (len
) txt
+= '<p>' + this._humanLen(len
) + '</p>';
111 if (layer
&& layer
._popup
=== undefined) layer
.bindPopup(txt
);
115 parse_trkseg: function(line
, xml
, options
, tag
) {
116 var el
= line
.getElementsByTagName(tag
);
117 if (!el
.length
) return [];
119 for (var i
= 0; i
< el
.length
; i
++) {
120 var ll
= new L
.LatLng(el
[i
].getAttribute('lat'),
121 el
[i
].getAttribute('lon'));
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
;
130 var l
= [new L
.Polyline(coords
, options
)];
131 this.fire('addline', {line
:l
});
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
});