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
='', link
, 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
;
104 el
= xml
.getElementsByTagName('link');
106 link
= el
[0].getAttribute('href');
108 if (layer
instanceof L
.Path
)
109 len
= this._polylineLen(layer
);
111 if (name
) txt
+= '<h2>' + name
+ '</h2>' + descr
;
112 if (len
) txt
+= '<p>' + this._humanLen(len
) + '</p>';
113 if (link
) txt
+= '<p><a target="_blank" href="'+link
+'">[...]</a></p>';
115 if (layer
&& layer
._popup
=== undefined) layer
.bindPopup(txt
);
119 parse_trkseg: function (line
, xml
, options
, tag
) {
120 var el
= line
.getElementsByTagName(tag
);
121 if (!el
.length
) return [];
123 for (var i
= 0; i
< el
.length
; i
++) {
124 var ll
= new L
.LatLng(el
[i
].getAttribute('lat'),
125 el
[i
].getAttribute('lon'));
127 for (var j
in el
[i
].childNodes
) {
128 var e
= el
[i
].childNodes
[j
];
129 if (!e
.tagName
) continue;
130 ll
.meta
[e
.tagName
] = e
.textContent
;
134 var l
= [new L
.Polyline(coords
, options
)];
135 this.fire('addline', {line
:l
});
139 parse_wpt: function (e
, xml
, options
) {
140 var m
= new L
.Marker(new L
.LatLng(e
.getAttribute('lat'),
141 e
.getAttribute('lon')), options
);
143 for (var i
= 0; i
< e
.childNodes
.length
; i
++) {
144 var ch
= e
.childNodes
[i
];
145 if (ch
.nodeName
!== '#text') {
146 attributes
[ch
.nodeName
] = ch
.textContent
;
149 this.fire('addpoint', {point
:m
, attributes
:attributes
});