leaflet-rails 0.4.0.alpha6 → 0.4.2.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +22 -0
- data/lib/leaflet-rails/version.rb +1 -1
- data/vendor/assets/javascripts/leaflet.js.erb +1552 -682
- data/vendor/assets/stylesheets/leaflet.css.erb +25 -14
- metadata +6 -2
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2010-2012, CloudMade, Vladimir Agafonkin, Akshay Joshi
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without modification, are
|
5
|
+
permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
1. Redistributions of source code must retain the above copyright notice, this list of
|
8
|
+
conditions and the following disclaimer.
|
9
|
+
|
10
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list
|
11
|
+
of conditions and the following disclaimer in the documentation and/or other materials
|
12
|
+
provided with the distribution.
|
13
|
+
|
14
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
15
|
+
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
16
|
+
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
17
|
+
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
18
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
19
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
20
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
21
|
+
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
22
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
@@ -1,13 +1,13 @@
|
|
1
1
|
/*
|
2
2
|
Copyright (c) 2010-2012, CloudMade, Vladimir Agafonkin
|
3
|
-
Leaflet is
|
3
|
+
Leaflet is an open-source JavaScript library for mobile-friendly interactive maps.
|
4
4
|
http://leaflet.cloudmade.com
|
5
5
|
*/
|
6
|
-
(function () {
|
6
|
+
(function (window, undefined) {
|
7
7
|
|
8
8
|
var L, originalL;
|
9
9
|
|
10
|
-
if (typeof exports !==
|
10
|
+
if (typeof exports !== undefined + '') {
|
11
11
|
L = exports;
|
12
12
|
} else {
|
13
13
|
originalL = window.L;
|
@@ -21,7 +21,7 @@ if (typeof exports !== 'undefined') {
|
|
21
21
|
window.L = L;
|
22
22
|
}
|
23
23
|
|
24
|
-
L.version = '0.4';
|
24
|
+
L.version = '0.4.2';
|
25
25
|
|
26
26
|
|
27
27
|
/*
|
@@ -57,45 +57,6 @@ L.Util = {
|
|
57
57
|
};
|
58
58
|
}()),
|
59
59
|
|
60
|
-
|
61
|
-
// TODO refactor: remove repetition
|
62
|
-
|
63
|
-
requestAnimFrame: (function () {
|
64
|
-
function timeoutDefer(callback) {
|
65
|
-
window.setTimeout(callback, 1000 / 60);
|
66
|
-
}
|
67
|
-
|
68
|
-
var requestFn = window.requestAnimationFrame ||
|
69
|
-
window.webkitRequestAnimationFrame ||
|
70
|
-
window.mozRequestAnimationFrame ||
|
71
|
-
window.oRequestAnimationFrame ||
|
72
|
-
window.msRequestAnimationFrame ||
|
73
|
-
timeoutDefer;
|
74
|
-
|
75
|
-
return function (callback, context, immediate, contextEl) {
|
76
|
-
callback = context ? L.Util.bind(callback, context) : callback;
|
77
|
-
if (immediate && requestFn === timeoutDefer) {
|
78
|
-
callback();
|
79
|
-
} else {
|
80
|
-
return requestFn.call(window, callback, contextEl);
|
81
|
-
}
|
82
|
-
};
|
83
|
-
}()),
|
84
|
-
|
85
|
-
cancelAnimFrame: (function () {
|
86
|
-
var requestFn = window.cancelAnimationFrame ||
|
87
|
-
window.webkitCancelRequestAnimationFrame ||
|
88
|
-
window.mozCancelRequestAnimationFrame ||
|
89
|
-
window.oCancelRequestAnimationFrame ||
|
90
|
-
window.msCancelRequestAnimationFrame ||
|
91
|
-
clearTimeout;
|
92
|
-
|
93
|
-
return function (handle) {
|
94
|
-
if (!handle) { return; }
|
95
|
-
return requestFn.call(window, handle);
|
96
|
-
};
|
97
|
-
}()),
|
98
|
-
|
99
60
|
limitExecByInterval: function (fn, time, context) {
|
100
61
|
var lock, execOnUnlock;
|
101
62
|
|
@@ -131,6 +92,10 @@ L.Util = {
|
|
131
92
|
return Math.round(num * pow) / pow;
|
132
93
|
},
|
133
94
|
|
95
|
+
splitWords: function (str) {
|
96
|
+
return str.replace(/^\s+|\s+$/g, '').split(/\s+/);
|
97
|
+
},
|
98
|
+
|
134
99
|
setOptions: function (obj, options) {
|
135
100
|
obj.options = L.Util.extend({}, obj.options, options);
|
136
101
|
return obj.options;
|
@@ -159,6 +124,52 @@ L.Util = {
|
|
159
124
|
emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='
|
160
125
|
};
|
161
126
|
|
127
|
+
(function () {
|
128
|
+
|
129
|
+
function getPrefixed(name) {
|
130
|
+
var i, fn,
|
131
|
+
prefixes = ['webkit', 'moz', 'o', 'ms'];
|
132
|
+
|
133
|
+
for (i = 0; i < prefixes.length && !fn; i++) {
|
134
|
+
fn = window[prefixes[i] + name];
|
135
|
+
}
|
136
|
+
|
137
|
+
return fn;
|
138
|
+
}
|
139
|
+
|
140
|
+
function timeoutDefer(fn) {
|
141
|
+
return window.setTimeout(fn, 1000 / 60);
|
142
|
+
}
|
143
|
+
|
144
|
+
var requestFn = window.requestAnimationFrame ||
|
145
|
+
getPrefixed('RequestAnimationFrame') || timeoutDefer;
|
146
|
+
|
147
|
+
var cancelFn = window.cancelAnimationFrame ||
|
148
|
+
getPrefixed('CancelAnimationFrame') ||
|
149
|
+
getPrefixed('CancelRequestAnimationFrame') ||
|
150
|
+
function (id) {
|
151
|
+
window.clearTimeout(id);
|
152
|
+
};
|
153
|
+
|
154
|
+
|
155
|
+
L.Util.requestAnimFrame = function (fn, context, immediate, element) {
|
156
|
+
fn = L.Util.bind(fn, context);
|
157
|
+
|
158
|
+
if (immediate && requestFn === timeoutDefer) {
|
159
|
+
fn();
|
160
|
+
} else {
|
161
|
+
return requestFn.call(window, fn, element);
|
162
|
+
}
|
163
|
+
};
|
164
|
+
|
165
|
+
L.Util.cancelAnimFrame = function (id) {
|
166
|
+
if (id) {
|
167
|
+
cancelFn.call(window, id);
|
168
|
+
}
|
169
|
+
};
|
170
|
+
|
171
|
+
}());
|
172
|
+
|
162
173
|
|
163
174
|
/*
|
164
175
|
* Class powers the OOP facilities of the library. Thanks to John Resig and Dean Edwards for inspiration!
|
@@ -228,42 +239,80 @@ L.Class.mergeOptions = function (options) {
|
|
228
239
|
* L.Mixin.Events adds custom events functionality to Leaflet classes
|
229
240
|
*/
|
230
241
|
|
242
|
+
var key = '_leaflet_events';
|
243
|
+
|
231
244
|
L.Mixin = {};
|
232
245
|
|
233
246
|
L.Mixin.Events = {
|
234
|
-
|
235
|
-
|
236
|
-
events[
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
247
|
+
|
248
|
+
addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object])
|
249
|
+
var events = this[key] = this[key] || {},
|
250
|
+
type, i, len;
|
251
|
+
|
252
|
+
// Types can be a map of types/handlers
|
253
|
+
if (typeof types === 'object') {
|
254
|
+
for (type in types) {
|
255
|
+
if (types.hasOwnProperty(type)) {
|
256
|
+
this.addEventListener(type, types[type], fn);
|
257
|
+
}
|
258
|
+
}
|
259
|
+
|
260
|
+
return this;
|
261
|
+
}
|
262
|
+
|
263
|
+
types = L.Util.splitWords(types);
|
264
|
+
|
265
|
+
for (i = 0, len = types.length; i < len; i++) {
|
266
|
+
events[types[i]] = events[types[i]] || [];
|
267
|
+
events[types[i]].push({
|
268
|
+
action: fn,
|
269
|
+
context: context || this
|
270
|
+
});
|
271
|
+
}
|
272
|
+
|
241
273
|
return this;
|
242
274
|
},
|
243
275
|
|
244
|
-
hasEventListeners: function (
|
245
|
-
|
246
|
-
return (k in this) && (type in this[k]) && (this[k][type].length > 0);
|
276
|
+
hasEventListeners: function (type) { // (String) -> Boolean
|
277
|
+
return (key in this) && (type in this[key]) && (this[key][type].length > 0);
|
247
278
|
},
|
248
279
|
|
249
|
-
removeEventListener: function (
|
250
|
-
|
280
|
+
removeEventListener: function (types, fn, context) { // (String[, Function, Object]) or (Object[, Object])
|
281
|
+
var events = this[key],
|
282
|
+
type, i, len, listeners, j;
|
283
|
+
|
284
|
+
if (typeof types === 'object') {
|
285
|
+
for (type in types) {
|
286
|
+
if (types.hasOwnProperty(type)) {
|
287
|
+
this.removeEventListener(type, types[type], fn);
|
288
|
+
}
|
289
|
+
}
|
290
|
+
|
251
291
|
return this;
|
252
292
|
}
|
253
293
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
) {
|
259
|
-
events[
|
260
|
-
|
294
|
+
types = L.Util.splitWords(types);
|
295
|
+
|
296
|
+
for (i = 0, len = types.length; i < len; i++) {
|
297
|
+
|
298
|
+
if (this.hasEventListeners(types[i])) {
|
299
|
+
listeners = events[types[i]];
|
300
|
+
|
301
|
+
for (j = listeners.length - 1; j >= 0; j--) {
|
302
|
+
if (
|
303
|
+
(!fn || listeners[j].action === fn) &&
|
304
|
+
(!context || (listeners[j].context === context))
|
305
|
+
) {
|
306
|
+
listeners.splice(j, 1);
|
307
|
+
}
|
308
|
+
}
|
261
309
|
}
|
262
310
|
}
|
311
|
+
|
263
312
|
return this;
|
264
313
|
},
|
265
314
|
|
266
|
-
fireEvent: function (
|
315
|
+
fireEvent: function (type, data) { // (String[, Object])
|
267
316
|
if (!this.hasEventListeners(type)) {
|
268
317
|
return this;
|
269
318
|
}
|
@@ -273,7 +322,7 @@ L.Mixin.Events = {
|
|
273
322
|
target: this
|
274
323
|
}, data);
|
275
324
|
|
276
|
-
var listeners = this
|
325
|
+
var listeners = this[key][type].slice();
|
277
326
|
|
278
327
|
for (var i = 0, len = listeners.length; i < len; i++) {
|
279
328
|
listeners[i].action.call(listeners[i].context || this, event);
|
@@ -294,16 +343,19 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
|
|
294
343
|
ie6 = ie && !window.XMLHttpRequest,
|
295
344
|
webkit = ua.indexOf("webkit") !== -1,
|
296
345
|
gecko = ua.indexOf("gecko") !== -1,
|
346
|
+
//Terrible browser detection to work around a safari / iOS / android browser bug. See TileLayer._addTile and debug/hacks/jitter.html
|
347
|
+
chrome = ua.indexOf("chrome") !== -1,
|
297
348
|
opera = window.opera,
|
298
349
|
android = ua.indexOf("android") !== -1,
|
299
|
-
|
350
|
+
android23 = ua.search("android [23]") !== -1,
|
351
|
+
mobile = typeof orientation !== undefined + '' ? true : false,
|
300
352
|
doc = document.documentElement,
|
301
353
|
ie3d = ie && ('transition' in doc.style),
|
302
354
|
webkit3d = webkit && ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()),
|
303
355
|
gecko3d = gecko && ('MozPerspective' in doc.style),
|
304
356
|
opera3d = opera && ('OTransition' in doc.style);
|
305
357
|
|
306
|
-
var touch = (function () {
|
358
|
+
var touch = !window.L_NO_TOUCH && (function () {
|
307
359
|
var startName = 'ontouchstart';
|
308
360
|
|
309
361
|
// WebKit, etc
|
@@ -330,26 +382,34 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
|
|
330
382
|
return supported;
|
331
383
|
}());
|
332
384
|
|
385
|
+
var retina = (('devicePixelRatio' in window && window.devicePixelRatio > 1) || ('matchMedia' in window && window.matchMedia("(min-resolution:144dpi)").matches));
|
386
|
+
|
333
387
|
L.Browser = {
|
388
|
+
ua: ua,
|
334
389
|
ie: ie,
|
335
390
|
ie6: ie6,
|
336
391
|
webkit: webkit,
|
337
392
|
gecko: gecko,
|
338
393
|
opera: opera,
|
339
394
|
android: android,
|
395
|
+
android23: android23,
|
396
|
+
|
397
|
+
chrome: chrome,
|
340
398
|
|
341
399
|
ie3d: ie3d,
|
342
400
|
webkit3d: webkit3d,
|
343
401
|
gecko3d: gecko3d,
|
344
402
|
opera3d: opera3d,
|
345
|
-
any3d: ie3d || webkit3d || gecko3d || opera3d,
|
403
|
+
any3d: !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d),
|
346
404
|
|
347
405
|
mobile: mobile,
|
348
406
|
mobileWebkit: mobile && webkit,
|
349
407
|
mobileWebkit3d: mobile && webkit3d,
|
350
408
|
mobileOpera: mobile && opera,
|
351
409
|
|
352
|
-
touch: touch
|
410
|
+
touch: touch,
|
411
|
+
|
412
|
+
retina: retina
|
353
413
|
};
|
354
414
|
}());
|
355
415
|
|
@@ -365,7 +425,7 @@ L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {
|
|
365
425
|
|
366
426
|
L.Point.prototype = {
|
367
427
|
add: function (point) {
|
368
|
-
return this.clone()._add(point);
|
428
|
+
return this.clone()._add(L.point(point));
|
369
429
|
},
|
370
430
|
|
371
431
|
_add: function (point) {
|
@@ -375,7 +435,7 @@ L.Point.prototype = {
|
|
375
435
|
},
|
376
436
|
|
377
437
|
subtract: function (point) {
|
378
|
-
return this.clone()._subtract(point);
|
438
|
+
return this.clone()._subtract(L.point(point));
|
379
439
|
},
|
380
440
|
|
381
441
|
// destructive subtract (faster)
|
@@ -389,13 +449,16 @@ L.Point.prototype = {
|
|
389
449
|
return new L.Point(this.x / num, this.y / num, round);
|
390
450
|
},
|
391
451
|
|
392
|
-
multiplyBy: function (num) {
|
393
|
-
return new L.Point(this.x * num, this.y * num);
|
452
|
+
multiplyBy: function (num, round) {
|
453
|
+
return new L.Point(this.x * num, this.y * num, round);
|
394
454
|
},
|
395
455
|
|
396
456
|
distanceTo: function (point) {
|
457
|
+
point = L.point(point);
|
458
|
+
|
397
459
|
var x = point.x - this.x,
|
398
460
|
y = point.y - this.y;
|
461
|
+
|
399
462
|
return Math.sqrt(x * x + y * y);
|
400
463
|
},
|
401
464
|
|
@@ -410,6 +473,16 @@ L.Point.prototype = {
|
|
410
473
|
return this;
|
411
474
|
},
|
412
475
|
|
476
|
+
floor: function () {
|
477
|
+
return this.clone()._floor();
|
478
|
+
},
|
479
|
+
|
480
|
+
_floor: function () {
|
481
|
+
this.x = Math.floor(this.x);
|
482
|
+
this.y = Math.floor(this.y);
|
483
|
+
return this;
|
484
|
+
},
|
485
|
+
|
413
486
|
clone: function () {
|
414
487
|
return new L.Point(this.x, this.y);
|
415
488
|
},
|
@@ -421,44 +494,75 @@ L.Point.prototype = {
|
|
421
494
|
}
|
422
495
|
};
|
423
496
|
|
497
|
+
L.point = function (x, y, round) {
|
498
|
+
if (x instanceof L.Point) {
|
499
|
+
return x;
|
500
|
+
}
|
501
|
+
if (x instanceof Array) {
|
502
|
+
return new L.Point(x[0], x[1]);
|
503
|
+
}
|
504
|
+
if (isNaN(x)) {
|
505
|
+
return x;
|
506
|
+
}
|
507
|
+
return new L.Point(x, y, round);
|
508
|
+
};
|
509
|
+
|
424
510
|
|
425
511
|
/*
|
426
512
|
* L.Bounds represents a rectangular area on the screen in pixel coordinates.
|
427
513
|
*/
|
428
514
|
|
429
515
|
L.Bounds = L.Class.extend({
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
var points =
|
516
|
+
|
517
|
+
initialize: function (a, b) { //(Point, Point) or Point[]
|
518
|
+
if (!a) { return; }
|
519
|
+
|
520
|
+
var points = b ? [a, b] : a;
|
521
|
+
|
435
522
|
for (var i = 0, len = points.length; i < len; i++) {
|
436
523
|
this.extend(points[i]);
|
437
524
|
}
|
438
525
|
},
|
439
526
|
|
440
527
|
// extend the bounds to contain the given point
|
441
|
-
extend: function (
|
528
|
+
extend: function (point) { // (Point)
|
529
|
+
point = L.point(point);
|
530
|
+
|
442
531
|
if (!this.min && !this.max) {
|
443
|
-
this.min =
|
444
|
-
this.max =
|
532
|
+
this.min = point.clone();
|
533
|
+
this.max = point.clone();
|
445
534
|
} else {
|
446
535
|
this.min.x = Math.min(point.x, this.min.x);
|
447
536
|
this.max.x = Math.max(point.x, this.max.x);
|
448
537
|
this.min.y = Math.min(point.y, this.min.y);
|
449
538
|
this.max.y = Math.max(point.y, this.max.y);
|
450
539
|
}
|
540
|
+
return this;
|
451
541
|
},
|
452
542
|
|
453
|
-
getCenter: function (round)
|
543
|
+
getCenter: function (round) { // (Boolean) -> Point
|
454
544
|
return new L.Point(
|
455
545
|
(this.min.x + this.max.x) / 2,
|
456
546
|
(this.min.y + this.max.y) / 2, round);
|
457
547
|
},
|
458
548
|
|
459
|
-
|
549
|
+
getBottomLeft: function () { // -> Point
|
550
|
+
return new L.Point(this.min.x, this.max.y);
|
551
|
+
},
|
552
|
+
|
553
|
+
getTopRight: function () { // -> Point
|
554
|
+
return new L.Point(this.max.x, this.min.y);
|
555
|
+
},
|
556
|
+
|
557
|
+
contains: function (obj) { // (Bounds) or (Point) -> Boolean
|
460
558
|
var min, max;
|
461
559
|
|
560
|
+
if (typeof obj[0] === 'number' || obj instanceof L.Point) {
|
561
|
+
obj = L.point(obj);
|
562
|
+
} else {
|
563
|
+
obj = L.bounds(obj);
|
564
|
+
}
|
565
|
+
|
462
566
|
if (obj instanceof L.Bounds) {
|
463
567
|
min = obj.min;
|
464
568
|
max = obj.max;
|
@@ -472,7 +576,9 @@ L.Bounds = L.Class.extend({
|
|
472
576
|
(max.y <= this.max.y);
|
473
577
|
},
|
474
578
|
|
475
|
-
intersects: function (
|
579
|
+
intersects: function (bounds) { // (Bounds) -> Boolean
|
580
|
+
bounds = L.bounds(bounds);
|
581
|
+
|
476
582
|
var min = this.min,
|
477
583
|
max = this.max,
|
478
584
|
min2 = bounds.min,
|
@@ -486,6 +592,13 @@ L.Bounds = L.Class.extend({
|
|
486
592
|
|
487
593
|
});
|
488
594
|
|
595
|
+
L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[])
|
596
|
+
if (!a || a instanceof L.Bounds) {
|
597
|
+
return a;
|
598
|
+
}
|
599
|
+
return new L.Bounds(a, b);
|
600
|
+
};
|
601
|
+
|
489
602
|
|
490
603
|
/*
|
491
604
|
* L.Transformation is an utility class to perform simple point transformations through a 2d-matrix.
|
@@ -616,19 +729,38 @@ L.DomUtil = {
|
|
616
729
|
},
|
617
730
|
|
618
731
|
removeClass: function (el, name) {
|
619
|
-
|
732
|
+
function replaceFn(w, match) {
|
620
733
|
if (match === name) {
|
621
734
|
return '';
|
622
735
|
}
|
623
736
|
return w;
|
624
|
-
}
|
737
|
+
}
|
738
|
+
el.className = el.className
|
739
|
+
.replace(/(\S+)\s*/g, replaceFn)
|
740
|
+
.replace(/(^\s+|\s+$)/, '');
|
625
741
|
},
|
626
742
|
|
627
743
|
setOpacity: function (el, value) {
|
628
|
-
|
629
|
-
|
630
|
-
} else {
|
744
|
+
|
745
|
+
if ('opacity' in el.style) {
|
631
746
|
el.style.opacity = value;
|
747
|
+
|
748
|
+
} else if (L.Browser.ie) {
|
749
|
+
|
750
|
+
var filter = false,
|
751
|
+
filterName = 'DXImageTransform.Microsoft.Alpha';
|
752
|
+
|
753
|
+
// filters collection throws an error if we try to retrieve a filter that doesn't exist
|
754
|
+
try { filter = el.filters.item(filterName); } catch (e) {}
|
755
|
+
|
756
|
+
value = Math.round(value * 100);
|
757
|
+
|
758
|
+
if (filter) {
|
759
|
+
filter.Enabled = (value === 100);
|
760
|
+
filter.Opacity = value;
|
761
|
+
} else {
|
762
|
+
el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';
|
763
|
+
}
|
632
764
|
}
|
633
765
|
},
|
634
766
|
|
@@ -693,7 +825,7 @@ L.Util.extend(L.DomUtil, {
|
|
693
825
|
CM.LatLng represents a geographical point with latitude and longtitude coordinates.
|
694
826
|
*/
|
695
827
|
|
696
|
-
L.LatLng = function (
|
828
|
+
L.LatLng = function (rawLat, rawLng, noWrap) { // (Number, Number[, Boolean])
|
697
829
|
var lat = parseFloat(rawLat),
|
698
830
|
lng = parseFloat(rawLng);
|
699
831
|
|
@@ -706,7 +838,6 @@ L.LatLng = function (/*Number*/ rawLat, /*Number*/ rawLng, /*Boolean*/ noWrap) {
|
|
706
838
|
lng = (lng + 180) % 360 + ((lng < -180 || lng === 180) ? 180 : -180); // wrap longtitude into -180..180
|
707
839
|
}
|
708
840
|
|
709
|
-
//TODO change to lat() & lng()
|
710
841
|
this.lat = lat;
|
711
842
|
this.lng = lng;
|
712
843
|
};
|
@@ -718,23 +849,25 @@ L.Util.extend(L.LatLng, {
|
|
718
849
|
});
|
719
850
|
|
720
851
|
L.LatLng.prototype = {
|
721
|
-
equals: function (
|
722
|
-
if (!
|
723
|
-
|
724
|
-
|
852
|
+
equals: function (obj) { // (LatLng) -> Boolean
|
853
|
+
if (!obj) { return false; }
|
854
|
+
|
855
|
+
obj = L.latLng(obj);
|
725
856
|
|
726
857
|
var margin = Math.max(Math.abs(this.lat - obj.lat), Math.abs(this.lng - obj.lng));
|
727
858
|
return margin <= L.LatLng.MAX_MARGIN;
|
728
859
|
},
|
729
860
|
|
730
|
-
toString: function () {
|
861
|
+
toString: function () { // -> String
|
731
862
|
return 'LatLng(' +
|
732
863
|
L.Util.formatNum(this.lat) + ', ' +
|
733
864
|
L.Util.formatNum(this.lng) + ')';
|
734
865
|
},
|
735
866
|
|
736
867
|
// Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula
|
737
|
-
distanceTo: function (
|
868
|
+
distanceTo: function (other) { // (LatLng) -> Number
|
869
|
+
other = L.latLng(other);
|
870
|
+
|
738
871
|
var R = 6378137, // earth radius in meters
|
739
872
|
d2r = L.LatLng.DEG_TO_RAD,
|
740
873
|
dLat = (other.lat - this.lat) * d2r,
|
@@ -750,6 +883,19 @@ L.LatLng.prototype = {
|
|
750
883
|
}
|
751
884
|
};
|
752
885
|
|
886
|
+
L.latLng = function (a, b, c) { // (LatLng) or ([Number, Number]) or (Number, Number, Boolean)
|
887
|
+
if (a instanceof L.LatLng) {
|
888
|
+
return a;
|
889
|
+
}
|
890
|
+
if (a instanceof Array) {
|
891
|
+
return new L.LatLng(a[0], a[1]);
|
892
|
+
}
|
893
|
+
if (isNaN(a)) {
|
894
|
+
return a;
|
895
|
+
}
|
896
|
+
return new L.LatLng(a, b, c);
|
897
|
+
};
|
898
|
+
|
753
899
|
|
754
900
|
/*
|
755
901
|
* L.LatLngBounds represents a rectangular area on the map in geographical coordinates.
|
@@ -757,17 +903,23 @@ L.LatLng.prototype = {
|
|
757
903
|
|
758
904
|
L.LatLngBounds = L.Class.extend({
|
759
905
|
initialize: function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[])
|
760
|
-
if (!southWest) {
|
761
|
-
|
762
|
-
|
763
|
-
|
906
|
+
if (!southWest) { return; }
|
907
|
+
|
908
|
+
var latlngs = northEast ? [southWest, northEast] : southWest;
|
909
|
+
|
764
910
|
for (var i = 0, len = latlngs.length; i < len; i++) {
|
765
911
|
this.extend(latlngs[i]);
|
766
912
|
}
|
767
913
|
},
|
768
914
|
|
769
915
|
// extend the bounds to contain the given point or bounds
|
770
|
-
extend: function (
|
916
|
+
extend: function (obj) { // (LatLng) or (LatLngBounds)
|
917
|
+
if (typeof obj[0] === 'number' || obj instanceof L.LatLng) {
|
918
|
+
obj = L.latLng(obj);
|
919
|
+
} else {
|
920
|
+
obj = L.latLngBounds(obj);
|
921
|
+
}
|
922
|
+
|
771
923
|
if (obj instanceof L.LatLng) {
|
772
924
|
if (!this._southWest && !this._northEast) {
|
773
925
|
this._southWest = new L.LatLng(obj.lat, obj.lng, true);
|
@@ -775,6 +927,7 @@ L.LatLngBounds = L.Class.extend({
|
|
775
927
|
} else {
|
776
928
|
this._southWest.lat = Math.min(obj.lat, this._southWest.lat);
|
777
929
|
this._southWest.lng = Math.min(obj.lng, this._southWest.lng);
|
930
|
+
|
778
931
|
this._northEast.lat = Math.max(obj.lat, this._northEast.lat);
|
779
932
|
this._northEast.lng = Math.max(obj.lng, this._northEast.lng);
|
780
933
|
}
|
@@ -797,7 +950,7 @@ L.LatLngBounds = L.Class.extend({
|
|
797
950
|
new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));
|
798
951
|
},
|
799
952
|
|
800
|
-
getCenter: function ()
|
953
|
+
getCenter: function () { // -> LatLng
|
801
954
|
return new L.LatLng(
|
802
955
|
(this._southWest.lat + this._northEast.lat) / 2,
|
803
956
|
(this._southWest.lng + this._northEast.lng) / 2);
|
@@ -819,7 +972,13 @@ L.LatLngBounds = L.Class.extend({
|
|
819
972
|
return new L.LatLng(this._southWest.lat, this._northEast.lng, true);
|
820
973
|
},
|
821
974
|
|
822
|
-
contains: function (
|
975
|
+
contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
|
976
|
+
if (typeof obj[0] === 'number' || obj instanceof L.LatLng) {
|
977
|
+
obj = L.latLng(obj);
|
978
|
+
} else {
|
979
|
+
obj = L.latLngBounds(obj);
|
980
|
+
}
|
981
|
+
|
823
982
|
var sw = this._southWest,
|
824
983
|
ne = this._northEast,
|
825
984
|
sw2, ne2;
|
@@ -835,7 +994,9 @@ L.LatLngBounds = L.Class.extend({
|
|
835
994
|
(sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);
|
836
995
|
},
|
837
996
|
|
838
|
-
intersects: function (
|
997
|
+
intersects: function (bounds) { // (LatLngBounds)
|
998
|
+
bounds = L.latLngBounds(bounds);
|
999
|
+
|
839
1000
|
var sw = this._southWest,
|
840
1001
|
ne = this._northEast,
|
841
1002
|
sw2 = bounds.getSouthWest(),
|
@@ -853,14 +1014,25 @@ L.LatLngBounds = L.Class.extend({
|
|
853
1014
|
return [sw.lng, sw.lat, ne.lng, ne.lat].join(',');
|
854
1015
|
},
|
855
1016
|
|
856
|
-
equals: function (
|
857
|
-
|
858
|
-
|
1017
|
+
equals: function (bounds) { // (LatLngBounds)
|
1018
|
+
if (!bounds) { return false; }
|
1019
|
+
|
1020
|
+
bounds = L.latLngBounds(bounds);
|
1021
|
+
|
1022
|
+
return this._southWest.equals(bounds.getSouthWest()) &&
|
1023
|
+
this._northEast.equals(bounds.getNorthEast());
|
859
1024
|
}
|
860
1025
|
});
|
861
1026
|
|
862
1027
|
//TODO International date line?
|
863
1028
|
|
1029
|
+
L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng)
|
1030
|
+
if (!a || a instanceof L.LatLngBounds) {
|
1031
|
+
return a;
|
1032
|
+
}
|
1033
|
+
return new L.LatLngBounds(a, b);
|
1034
|
+
};
|
1035
|
+
|
864
1036
|
|
865
1037
|
/*
|
866
1038
|
* L.Projection contains various geographical projections used by CRS classes.
|
@@ -966,6 +1138,7 @@ L.CRS.EPSG4326 = L.Util.extend({}, L.CRS, {
|
|
966
1138
|
*/
|
967
1139
|
|
968
1140
|
L.Map = L.Class.extend({
|
1141
|
+
|
969
1142
|
includes: L.Mixin.Events,
|
970
1143
|
|
971
1144
|
options: {
|
@@ -977,9 +1150,9 @@ L.Map = L.Class.extend({
|
|
977
1150
|
layers: Array,
|
978
1151
|
*/
|
979
1152
|
|
980
|
-
fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.
|
1153
|
+
fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,
|
981
1154
|
trackResize: true,
|
982
|
-
markerZoomAnimation:
|
1155
|
+
markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d
|
983
1156
|
},
|
984
1157
|
|
985
1158
|
initialize: function (id, options) { // (HTMLElement or String, Object)
|
@@ -994,8 +1167,8 @@ L.Map = L.Class.extend({
|
|
994
1167
|
this.setMaxBounds(options.maxBounds);
|
995
1168
|
}
|
996
1169
|
|
997
|
-
if (options.center &&
|
998
|
-
this.setView(options.center, options.zoom, true);
|
1170
|
+
if (options.center && options.zoom !== undefined) {
|
1171
|
+
this.setView(L.latLng(options.center), options.zoom, true);
|
999
1172
|
}
|
1000
1173
|
|
1001
1174
|
this._initLayers(options.layers);
|
@@ -1006,7 +1179,7 @@ L.Map = L.Class.extend({
|
|
1006
1179
|
|
1007
1180
|
// replaced by animation-powered implementation in Map.PanAnimation.js
|
1008
1181
|
setView: function (center, zoom) {
|
1009
|
-
this._resetView(center, this._limitZoom(zoom));
|
1182
|
+
this._resetView(L.latLng(center), this._limitZoom(zoom));
|
1010
1183
|
return this;
|
1011
1184
|
},
|
1012
1185
|
|
@@ -1024,7 +1197,7 @@ L.Map = L.Class.extend({
|
|
1024
1197
|
|
1025
1198
|
fitBounds: function (bounds) { // (LatLngBounds)
|
1026
1199
|
var zoom = this.getBoundsZoom(bounds);
|
1027
|
-
return this.setView(bounds.getCenter(), zoom);
|
1200
|
+
return this.setView(L.latLngBounds(bounds).getCenter(), zoom);
|
1028
1201
|
},
|
1029
1202
|
|
1030
1203
|
fitWorld: function () {
|
@@ -1042,13 +1215,15 @@ L.Map = L.Class.extend({
|
|
1042
1215
|
// replaced with animated panBy in Map.Animation.js
|
1043
1216
|
this.fire('movestart');
|
1044
1217
|
|
1045
|
-
this._rawPanBy(offset);
|
1218
|
+
this._rawPanBy(L.point(offset));
|
1046
1219
|
|
1047
1220
|
this.fire('move');
|
1048
1221
|
return this.fire('moveend');
|
1049
1222
|
},
|
1050
1223
|
|
1051
1224
|
setMaxBounds: function (bounds) {
|
1225
|
+
bounds = L.latLngBounds(bounds);
|
1226
|
+
|
1052
1227
|
this.options.maxBounds = bounds;
|
1053
1228
|
|
1054
1229
|
if (!bounds) {
|
@@ -1072,6 +1247,8 @@ L.Map = L.Class.extend({
|
|
1072
1247
|
},
|
1073
1248
|
|
1074
1249
|
panInsideBounds: function (bounds) {
|
1250
|
+
bounds = L.latLngBounds(bounds);
|
1251
|
+
|
1075
1252
|
var viewBounds = this.getBounds(),
|
1076
1253
|
viewSw = this.project(viewBounds.getSouthWest()),
|
1077
1254
|
viewNe = this.project(viewBounds.getNorthEast()),
|
@@ -1096,7 +1273,7 @@ L.Map = L.Class.extend({
|
|
1096
1273
|
return this.panBy(new L.Point(dx, dy, true));
|
1097
1274
|
},
|
1098
1275
|
|
1099
|
-
addLayer: function (layer
|
1276
|
+
addLayer: function (layer) {
|
1100
1277
|
// TODO method is too big, refactor
|
1101
1278
|
|
1102
1279
|
var id = L.Util.stamp(layer);
|
@@ -1121,7 +1298,7 @@ L.Map = L.Class.extend({
|
|
1121
1298
|
}
|
1122
1299
|
|
1123
1300
|
var onMapLoad = function () {
|
1124
|
-
layer.onAdd(this
|
1301
|
+
layer.onAdd(this);
|
1125
1302
|
this.fire('layeradd', {layer: layer});
|
1126
1303
|
};
|
1127
1304
|
|
@@ -1158,7 +1335,7 @@ L.Map = L.Class.extend({
|
|
1158
1335
|
return this._layers.hasOwnProperty(id);
|
1159
1336
|
},
|
1160
1337
|
|
1161
|
-
invalidateSize: function () {
|
1338
|
+
invalidateSize: function (animate) {
|
1162
1339
|
var oldSize = this.getSize();
|
1163
1340
|
|
1164
1341
|
this._sizeChanged = true;
|
@@ -1170,13 +1347,16 @@ L.Map = L.Class.extend({
|
|
1170
1347
|
if (!this._loaded) { return this; }
|
1171
1348
|
|
1172
1349
|
var offset = oldSize.subtract(this.getSize()).divideBy(2, true);
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1350
|
+
if (animate) {
|
1351
|
+
this.panBy(offset);
|
1352
|
+
} else {
|
1353
|
+
this._rawPanBy(offset);
|
1176
1354
|
|
1177
|
-
|
1178
|
-
this._sizeTimer = setTimeout(L.Util.bind(this.fire, this, 'moveend'), 200);
|
1355
|
+
this.fire('move');
|
1179
1356
|
|
1357
|
+
clearTimeout(this._sizeTimer);
|
1358
|
+
this._sizeTimer = setTimeout(L.Util.bind(this.fire, this, 'moveend'), 200);
|
1359
|
+
}
|
1180
1360
|
return this;
|
1181
1361
|
},
|
1182
1362
|
|
@@ -1197,10 +1377,7 @@ L.Map = L.Class.extend({
|
|
1197
1377
|
// public methods for getting map state
|
1198
1378
|
|
1199
1379
|
getCenter: function () { // (Boolean) -> LatLng
|
1200
|
-
|
1201
|
-
centerPoint = this._getTopLeftPoint().add(viewHalf);
|
1202
|
-
|
1203
|
-
return this.unproject(centerPoint, this._zoom);
|
1380
|
+
return this.layerPointToLatLng(this._getCenterLayerPoint());
|
1204
1381
|
},
|
1205
1382
|
|
1206
1383
|
getZoom: function () {
|
@@ -1209,8 +1386,8 @@ L.Map = L.Class.extend({
|
|
1209
1386
|
|
1210
1387
|
getBounds: function () {
|
1211
1388
|
var bounds = this.getPixelBounds(),
|
1212
|
-
sw = this.unproject(
|
1213
|
-
ne = this.unproject(
|
1389
|
+
sw = this.unproject(bounds.getBottomLeft()),
|
1390
|
+
ne = this.unproject(bounds.getTopRight());
|
1214
1391
|
|
1215
1392
|
return new L.LatLngBounds(sw, ne);
|
1216
1393
|
},
|
@@ -1224,13 +1401,15 @@ L.Map = L.Class.extend({
|
|
1224
1401
|
},
|
1225
1402
|
|
1226
1403
|
getMaxZoom: function () {
|
1227
|
-
var z1 =
|
1228
|
-
z2 =
|
1404
|
+
var z1 = this.options.maxZoom === undefined ? Infinity : this.options.maxZoom,
|
1405
|
+
z2 = this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom;
|
1229
1406
|
|
1230
1407
|
return Math.min(z1, z2);
|
1231
1408
|
},
|
1232
1409
|
|
1233
1410
|
getBoundsZoom: function (bounds, inside) { // (LatLngBounds, Boolean) -> Number
|
1411
|
+
bounds = L.latLngBounds(bounds);
|
1412
|
+
|
1234
1413
|
var size = this.getSize(),
|
1235
1414
|
zoom = this.options.minZoom || 0,
|
1236
1415
|
maxZoom = this.getMaxZoom(),
|
@@ -1249,7 +1428,7 @@ L.Map = L.Class.extend({
|
|
1249
1428
|
zoom++;
|
1250
1429
|
nePoint = this.project(ne, zoom);
|
1251
1430
|
swPoint = this.project(sw, zoom);
|
1252
|
-
boundsSize = new L.Point(nePoint.x - swPoint.x, swPoint.y - nePoint.y);
|
1431
|
+
boundsSize = new L.Point(Math.abs(nePoint.x - swPoint.x), Math.abs(swPoint.y - nePoint.y));
|
1253
1432
|
|
1254
1433
|
if (!inside) {
|
1255
1434
|
zoomNotFound = boundsSize.x <= size.x && boundsSize.y <= size.y;
|
@@ -1294,56 +1473,71 @@ L.Map = L.Class.extend({
|
|
1294
1473
|
},
|
1295
1474
|
|
1296
1475
|
|
1297
|
-
//
|
1476
|
+
// TODO replace with universal implementation after refactoring projections
|
1298
1477
|
|
1299
|
-
|
1300
|
-
|
1478
|
+
getZoomScale: function (toZoom) {
|
1479
|
+
var crs = this.options.crs;
|
1480
|
+
return crs.scale(toZoom) / crs.scale(this._zoom);
|
1301
1481
|
},
|
1302
1482
|
|
1303
|
-
|
1304
|
-
return this.
|
1483
|
+
getScaleZoom: function (scale) {
|
1484
|
+
return this._zoom + (Math.log(scale) / Math.LN2);
|
1305
1485
|
},
|
1306
1486
|
|
1307
|
-
mouseEventToLatLng: function (e) { // (MouseEvent)
|
1308
|
-
return this.layerPointToLatLng(this.mouseEventToLayerPoint(e));
|
1309
|
-
},
|
1310
1487
|
|
1311
|
-
|
1312
|
-
|
1488
|
+
// conversion methods
|
1489
|
+
|
1490
|
+
project: function (latlng, zoom) { // (LatLng[, Number]) -> Point
|
1491
|
+
zoom = zoom === undefined ? this._zoom : zoom;
|
1492
|
+
return this.options.crs.latLngToPoint(L.latLng(latlng), zoom);
|
1313
1493
|
},
|
1314
1494
|
|
1315
|
-
|
1316
|
-
|
1495
|
+
unproject: function (point, zoom) { // (Point[, Number]) -> LatLng
|
1496
|
+
zoom = zoom === undefined ? this._zoom : zoom;
|
1497
|
+
return this.options.crs.pointToLatLng(L.point(point), zoom);
|
1317
1498
|
},
|
1318
1499
|
|
1319
1500
|
layerPointToLatLng: function (point) { // (Point)
|
1320
|
-
|
1501
|
+
var projectedPoint = L.point(point).add(this._initialTopLeftPoint);
|
1502
|
+
return this.unproject(projectedPoint);
|
1321
1503
|
},
|
1322
1504
|
|
1323
1505
|
latLngToLayerPoint: function (latlng) { // (LatLng)
|
1324
|
-
|
1506
|
+
var projectedPoint = this.project(L.latLng(latlng))._round();
|
1507
|
+
return projectedPoint._subtract(this._initialTopLeftPoint);
|
1508
|
+
},
|
1509
|
+
|
1510
|
+
containerPointToLayerPoint: function (point) { // (Point)
|
1511
|
+
return L.point(point).subtract(this._getMapPanePos());
|
1512
|
+
},
|
1513
|
+
|
1514
|
+
layerPointToContainerPoint: function (point) { // (Point)
|
1515
|
+
return L.point(point).add(this._getMapPanePos());
|
1325
1516
|
},
|
1326
1517
|
|
1327
1518
|
containerPointToLatLng: function (point) {
|
1328
|
-
|
1519
|
+
var layerPoint = this.containerPointToLayerPoint(L.point(point));
|
1520
|
+
return this.layerPointToLatLng(layerPoint);
|
1329
1521
|
},
|
1330
1522
|
|
1331
1523
|
latLngToContainerPoint: function (latlng) {
|
1332
|
-
return this.layerPointToContainerPoint(this.latLngToLayerPoint(latlng));
|
1524
|
+
return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
|
1333
1525
|
},
|
1334
1526
|
|
1335
|
-
|
1336
|
-
|
1337
|
-
return this.options.crs.latLngToPoint(latlng, zoom);
|
1527
|
+
mouseEventToContainerPoint: function (e) { // (MouseEvent)
|
1528
|
+
return L.DomEvent.getMousePosition(e, this._container);
|
1338
1529
|
},
|
1339
1530
|
|
1340
|
-
|
1341
|
-
|
1342
|
-
return this.options.crs.pointToLatLng(point, zoom);
|
1531
|
+
mouseEventToLayerPoint: function (e) { // (MouseEvent)
|
1532
|
+
return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));
|
1343
1533
|
},
|
1344
1534
|
|
1535
|
+
mouseEventToLatLng: function (e) { // (MouseEvent)
|
1536
|
+
return this.layerPointToLatLng(this.mouseEventToLayerPoint(e));
|
1537
|
+
},
|
1345
1538
|
|
1346
|
-
|
1539
|
+
|
1540
|
+
// map initialization methods
|
1347
1541
|
|
1348
1542
|
_initContainer: function (id) {
|
1349
1543
|
var container = this._container = L.DomUtil.get(id);
|
@@ -1359,14 +1553,14 @@ L.Map = L.Class.extend({
|
|
1359
1553
|
var container = this._container;
|
1360
1554
|
|
1361
1555
|
container.innerHTML = '';
|
1362
|
-
container
|
1556
|
+
L.DomUtil.addClass(container, 'leaflet-container');
|
1363
1557
|
|
1364
1558
|
if (L.Browser.touch) {
|
1365
|
-
container
|
1559
|
+
L.DomUtil.addClass(container, 'leaflet-touch');
|
1366
1560
|
}
|
1367
1561
|
|
1368
1562
|
if (this.options.fadeAnimation) {
|
1369
|
-
container
|
1563
|
+
L.DomUtil.addClass(container, 'leaflet-fade-anim');
|
1370
1564
|
}
|
1371
1565
|
|
1372
1566
|
var position = L.DomUtil.getStyle(container, 'position');
|
@@ -1395,10 +1589,12 @@ L.Map = L.Class.extend({
|
|
1395
1589
|
panes.markerPane = this._createPane('leaflet-marker-pane');
|
1396
1590
|
panes.popupPane = this._createPane('leaflet-popup-pane');
|
1397
1591
|
|
1592
|
+
var zoomHide = ' leaflet-zoom-hide';
|
1593
|
+
|
1398
1594
|
if (!this.options.markerZoomAnimation) {
|
1399
|
-
panes.markerPane
|
1400
|
-
panes.shadowPane
|
1401
|
-
panes.popupPane
|
1595
|
+
L.DomUtil.addClass(panes.markerPane, zoomHide);
|
1596
|
+
L.DomUtil.addClass(panes.shadowPane, zoomHide);
|
1597
|
+
L.DomUtil.addClass(panes.popupPane, zoomHide);
|
1402
1598
|
}
|
1403
1599
|
},
|
1404
1600
|
|
@@ -1415,6 +1611,22 @@ L.Map = L.Class.extend({
|
|
1415
1611
|
}
|
1416
1612
|
},
|
1417
1613
|
|
1614
|
+
_initLayers: function (layers) {
|
1615
|
+
layers = layers ? (layers instanceof Array ? layers : [layers]) : [];
|
1616
|
+
|
1617
|
+
this._layers = {};
|
1618
|
+
this._tileLayersNum = 0;
|
1619
|
+
|
1620
|
+
var i, len;
|
1621
|
+
|
1622
|
+
for (i = 0, len = layers.length; i < len; i++) {
|
1623
|
+
this.addLayer(layers[i]);
|
1624
|
+
}
|
1625
|
+
},
|
1626
|
+
|
1627
|
+
|
1628
|
+
// private methods that modify map state
|
1629
|
+
|
1418
1630
|
_resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {
|
1419
1631
|
|
1420
1632
|
var zoomChanged = (this._zoom !== zoom);
|
@@ -1434,7 +1646,7 @@ L.Map = L.Class.extend({
|
|
1434
1646
|
if (!preserveMapOffset) {
|
1435
1647
|
L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
|
1436
1648
|
} else {
|
1437
|
-
this._initialTopLeftPoint._add(
|
1649
|
+
this._initialTopLeftPoint._add(this._getMapPanePos());
|
1438
1650
|
}
|
1439
1651
|
|
1440
1652
|
this._tileLayersToLoad = this._tileLayersNum;
|
@@ -1447,7 +1659,7 @@ L.Map = L.Class.extend({
|
|
1447
1659
|
this.fire('zoomend');
|
1448
1660
|
}
|
1449
1661
|
|
1450
|
-
this.fire('moveend');
|
1662
|
+
this.fire('moveend', {hard: !preserveMapOffset});
|
1451
1663
|
|
1452
1664
|
if (!this._loaded) {
|
1453
1665
|
this._loaded = true;
|
@@ -1455,22 +1667,8 @@ L.Map = L.Class.extend({
|
|
1455
1667
|
}
|
1456
1668
|
},
|
1457
1669
|
|
1458
|
-
_initLayers: function (layers) {
|
1459
|
-
layers = layers ? (layers instanceof Array ? layers : [layers]) : [];
|
1460
|
-
|
1461
|
-
this._layers = {};
|
1462
|
-
this._tileLayersNum = 0;
|
1463
|
-
|
1464
|
-
var i, len;
|
1465
|
-
|
1466
|
-
for (i = 0, len = layers.length; i < len; i++) {
|
1467
|
-
this.addLayer(layers[i]);
|
1468
|
-
}
|
1469
|
-
},
|
1470
|
-
|
1471
1670
|
_rawPanBy: function (offset) {
|
1472
|
-
|
1473
|
-
L.DomUtil.setPosition(this._mapPane, newPos);
|
1671
|
+
L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));
|
1474
1672
|
},
|
1475
1673
|
|
1476
1674
|
|
@@ -1479,29 +1677,29 @@ L.Map = L.Class.extend({
|
|
1479
1677
|
_initEvents: function () {
|
1480
1678
|
if (!L.DomEvent) { return; }
|
1481
1679
|
|
1482
|
-
L.DomEvent.
|
1483
|
-
|
1484
|
-
var events = ['dblclick', 'mousedown', 'mouseenter', 'mouseleave', 'mousemove', 'contextmenu'];
|
1680
|
+
L.DomEvent.on(this._container, 'click', this._onMouseClick, this);
|
1485
1681
|
|
1486
|
-
var
|
1682
|
+
var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter', 'mouseleave', 'mousemove', 'contextmenu'],
|
1683
|
+
i, len;
|
1487
1684
|
|
1488
1685
|
for (i = 0, len = events.length; i < len; i++) {
|
1489
|
-
L.DomEvent.
|
1686
|
+
L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this);
|
1490
1687
|
}
|
1491
1688
|
|
1492
1689
|
if (this.options.trackResize) {
|
1493
|
-
L.DomEvent.
|
1690
|
+
L.DomEvent.on(window, 'resize', this._onResize, this);
|
1494
1691
|
}
|
1495
1692
|
},
|
1496
1693
|
|
1497
1694
|
_onResize: function () {
|
1498
|
-
L.Util.
|
1695
|
+
L.Util.cancelAnimFrame(this._resizeRequest);
|
1696
|
+
this._resizeRequest = L.Util.requestAnimFrame(this.invalidateSize, this, false, this._container);
|
1499
1697
|
},
|
1500
1698
|
|
1501
1699
|
_onMouseClick: function (e) {
|
1502
1700
|
if (!this._loaded || (this.dragging && this.dragging.moved())) { return; }
|
1503
1701
|
|
1504
|
-
this.fire('
|
1702
|
+
this.fire('preclick');
|
1505
1703
|
this._fireMouseEvent(e);
|
1506
1704
|
},
|
1507
1705
|
|
@@ -1543,13 +1741,16 @@ L.Map = L.Class.extend({
|
|
1543
1741
|
|
1544
1742
|
// private methods for getting map state
|
1545
1743
|
|
1744
|
+
_getMapPanePos: function () {
|
1745
|
+
return L.DomUtil.getPosition(this._mapPane);
|
1746
|
+
},
|
1747
|
+
|
1546
1748
|
_getTopLeftPoint: function () {
|
1547
1749
|
if (!this._loaded) {
|
1548
1750
|
throw new Error('Set map center and zoom first.');
|
1549
1751
|
}
|
1550
1752
|
|
1551
|
-
|
1552
|
-
return this._initialTopLeftPoint.subtract(mapPanePos);
|
1753
|
+
return this._initialTopLeftPoint.subtract(this._getMapPanePos());
|
1553
1754
|
},
|
1554
1755
|
|
1555
1756
|
_getNewTopLeftPoint: function (center, zoom) {
|
@@ -1559,10 +1760,16 @@ L.Map = L.Class.extend({
|
|
1559
1760
|
},
|
1560
1761
|
|
1561
1762
|
_latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {
|
1562
|
-
var
|
1563
|
-
|
1763
|
+
var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());
|
1764
|
+
return this.project(latlng, newZoom)._subtract(topLeft);
|
1765
|
+
},
|
1564
1766
|
|
1565
|
-
|
1767
|
+
_getCenterLayerPoint: function () {
|
1768
|
+
return this.containerPointToLayerPoint(this.getSize().divideBy(2));
|
1769
|
+
},
|
1770
|
+
|
1771
|
+
_getCenterOffset: function (center) {
|
1772
|
+
return this.latLngToLayerPoint(center).subtract(this._getCenterLayerPoint());
|
1566
1773
|
},
|
1567
1774
|
|
1568
1775
|
_limitZoom: function (zoom) {
|
@@ -1583,6 +1790,11 @@ L.Map.addInitHook = function (fn) {
|
|
1583
1790
|
this.prototype._initializers.push(init);
|
1584
1791
|
};
|
1585
1792
|
|
1793
|
+
L.map = function (id, options) {
|
1794
|
+
return new L.Map(id, options);
|
1795
|
+
};
|
1796
|
+
|
1797
|
+
|
1586
1798
|
|
1587
1799
|
L.Projection.Mercator = {
|
1588
1800
|
MAX_LATITUDE: 85.0840591556,
|
@@ -1666,24 +1878,26 @@ L.TileLayer = L.Class.extend({
|
|
1666
1878
|
subdomains: 'abc',
|
1667
1879
|
errorTileUrl: '',
|
1668
1880
|
attribution: '',
|
1881
|
+
zoomOffset: 0,
|
1669
1882
|
opacity: 1,
|
1670
|
-
|
1883
|
+
/* (undefined works too)
|
1884
|
+
zIndex: null,
|
1885
|
+
tms: false,
|
1671
1886
|
continuousWorld: false,
|
1672
1887
|
noWrap: false,
|
1673
|
-
zoomOffset: 0,
|
1674
1888
|
zoomReverse: false,
|
1675
1889
|
detectRetina: false,
|
1676
|
-
|
1890
|
+
reuseTiles: false,
|
1891
|
+
*/
|
1677
1892
|
unloadInvisibleTiles: L.Browser.mobile,
|
1678
|
-
updateWhenIdle: L.Browser.mobile
|
1679
|
-
reuseTiles: false
|
1893
|
+
updateWhenIdle: L.Browser.mobile
|
1680
1894
|
},
|
1681
1895
|
|
1682
1896
|
initialize: function (url, options) {
|
1683
1897
|
options = L.Util.setOptions(this, options);
|
1684
1898
|
|
1685
1899
|
// detecting retina displays, adjusting tileSize and zoom levels
|
1686
|
-
if (options.detectRetina &&
|
1900
|
+
if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {
|
1687
1901
|
|
1688
1902
|
options.tileSize = Math.floor(options.tileSize / 2);
|
1689
1903
|
options.zoomOffset++;
|
@@ -1703,9 +1917,8 @@ L.TileLayer = L.Class.extend({
|
|
1703
1917
|
}
|
1704
1918
|
},
|
1705
1919
|
|
1706
|
-
onAdd: function (map
|
1920
|
+
onAdd: function (map) {
|
1707
1921
|
this._map = map;
|
1708
|
-
this._insertAtTheBottom = insertAtTheBottom;
|
1709
1922
|
|
1710
1923
|
// create a container div for tiles
|
1711
1924
|
this._initContainer();
|
@@ -1714,8 +1927,10 @@ L.TileLayer = L.Class.extend({
|
|
1714
1927
|
this._createTileProto();
|
1715
1928
|
|
1716
1929
|
// set up events
|
1717
|
-
map.on(
|
1718
|
-
|
1930
|
+
map.on({
|
1931
|
+
'viewreset': this._resetCallback,
|
1932
|
+
'moveend': this._update
|
1933
|
+
}, this);
|
1719
1934
|
|
1720
1935
|
if (!this.options.updateWhenIdle) {
|
1721
1936
|
this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this);
|
@@ -1726,11 +1941,18 @@ L.TileLayer = L.Class.extend({
|
|
1726
1941
|
this._update();
|
1727
1942
|
},
|
1728
1943
|
|
1944
|
+
addTo: function (map) {
|
1945
|
+
map.addLayer(this);
|
1946
|
+
return this;
|
1947
|
+
},
|
1948
|
+
|
1729
1949
|
onRemove: function (map) {
|
1730
1950
|
map._panes.tilePane.removeChild(this._container);
|
1731
1951
|
|
1732
|
-
map.off(
|
1733
|
-
|
1952
|
+
map.off({
|
1953
|
+
'viewreset': this._resetCallback,
|
1954
|
+
'moveend': this._update
|
1955
|
+
}, this);
|
1734
1956
|
|
1735
1957
|
if (!this.options.updateWhenIdle) {
|
1736
1958
|
map.off('move', this._limitedUpdate, this);
|
@@ -1741,16 +1963,25 @@ L.TileLayer = L.Class.extend({
|
|
1741
1963
|
},
|
1742
1964
|
|
1743
1965
|
bringToFront: function () {
|
1966
|
+
var pane = this._map._panes.tilePane;
|
1967
|
+
|
1744
1968
|
if (this._container) {
|
1745
|
-
|
1969
|
+
pane.appendChild(this._container);
|
1970
|
+
this._setAutoZIndex(pane, Math.max);
|
1746
1971
|
}
|
1972
|
+
|
1973
|
+
return this;
|
1747
1974
|
},
|
1748
1975
|
|
1749
1976
|
bringToBack: function () {
|
1750
1977
|
var pane = this._map._panes.tilePane;
|
1978
|
+
|
1751
1979
|
if (this._container) {
|
1752
1980
|
pane.insertBefore(this._container, pane.firstChild);
|
1981
|
+
this._setAutoZIndex(pane, Math.min);
|
1753
1982
|
}
|
1983
|
+
|
1984
|
+
return this;
|
1754
1985
|
},
|
1755
1986
|
|
1756
1987
|
getAttribution: function () {
|
@@ -1763,6 +1994,60 @@ L.TileLayer = L.Class.extend({
|
|
1763
1994
|
if (this._map) {
|
1764
1995
|
this._updateOpacity();
|
1765
1996
|
}
|
1997
|
+
|
1998
|
+
return this;
|
1999
|
+
},
|
2000
|
+
|
2001
|
+
setZIndex: function (zIndex) {
|
2002
|
+
this.options.zIndex = zIndex;
|
2003
|
+
this._updateZIndex();
|
2004
|
+
|
2005
|
+
return this;
|
2006
|
+
},
|
2007
|
+
|
2008
|
+
setUrl: function (url, noRedraw) {
|
2009
|
+
this._url = url;
|
2010
|
+
|
2011
|
+
if (!noRedraw) {
|
2012
|
+
this.redraw();
|
2013
|
+
}
|
2014
|
+
|
2015
|
+
return this;
|
2016
|
+
},
|
2017
|
+
|
2018
|
+
redraw: function () {
|
2019
|
+
if (this._map) {
|
2020
|
+
this._map._panes.tilePane.empty = false;
|
2021
|
+
this._reset(true);
|
2022
|
+
this._update();
|
2023
|
+
}
|
2024
|
+
return this;
|
2025
|
+
},
|
2026
|
+
|
2027
|
+
_updateZIndex: function () {
|
2028
|
+
if (this._container && this.options.zIndex !== undefined) {
|
2029
|
+
this._container.style.zIndex = this.options.zIndex;
|
2030
|
+
}
|
2031
|
+
},
|
2032
|
+
|
2033
|
+
_setAutoZIndex: function (pane, compare) {
|
2034
|
+
|
2035
|
+
var layers = pane.getElementsByClassName('leaflet-layer'),
|
2036
|
+
edgeZIndex = -compare(Infinity, -Infinity), // -Ifinity for max, Infinity for min
|
2037
|
+
zIndex;
|
2038
|
+
|
2039
|
+
for (var i = 0, len = layers.length; i < len; i++) {
|
2040
|
+
|
2041
|
+
if (layers[i] !== this._container) {
|
2042
|
+
zIndex = parseInt(layers[i].style.zIndex, 10);
|
2043
|
+
|
2044
|
+
if (!isNaN(zIndex)) {
|
2045
|
+
edgeZIndex = compare(edgeZIndex, zIndex);
|
2046
|
+
}
|
2047
|
+
}
|
2048
|
+
}
|
2049
|
+
|
2050
|
+
this._container.style.zIndex = isFinite(edgeZIndex) ? edgeZIndex + compare(1, -1) : '';
|
1766
2051
|
},
|
1767
2052
|
|
1768
2053
|
_updateOpacity: function () {
|
@@ -1782,17 +2067,14 @@ L.TileLayer = L.Class.extend({
|
|
1782
2067
|
},
|
1783
2068
|
|
1784
2069
|
_initContainer: function () {
|
1785
|
-
var tilePane = this._map._panes.tilePane
|
1786
|
-
first = tilePane.firstChild;
|
2070
|
+
var tilePane = this._map._panes.tilePane;
|
1787
2071
|
|
1788
2072
|
if (!this._container || tilePane.empty) {
|
1789
2073
|
this._container = L.DomUtil.create('div', 'leaflet-layer');
|
1790
2074
|
|
1791
|
-
|
1792
|
-
|
1793
|
-
|
1794
|
-
tilePane.appendChild(this._container);
|
1795
|
-
}
|
2075
|
+
this._updateZIndex();
|
2076
|
+
|
2077
|
+
tilePane.appendChild(this._container);
|
1796
2078
|
|
1797
2079
|
if (this.options.opacity < 1) {
|
1798
2080
|
this._updateOpacity();
|
@@ -1815,6 +2097,7 @@ L.TileLayer = L.Class.extend({
|
|
1815
2097
|
}
|
1816
2098
|
|
1817
2099
|
this._tiles = {};
|
2100
|
+
this._tilesToLoad = 0;
|
1818
2101
|
|
1819
2102
|
if (this.options.reuseTiles) {
|
1820
2103
|
this._unusedTiles = [];
|
@@ -1857,16 +2140,21 @@ L.TileLayer = L.Class.extend({
|
|
1857
2140
|
var queue = [],
|
1858
2141
|
center = bounds.getCenter();
|
1859
2142
|
|
1860
|
-
var j, i;
|
2143
|
+
var j, i, point;
|
2144
|
+
|
1861
2145
|
for (j = bounds.min.y; j <= bounds.max.y; j++) {
|
1862
2146
|
for (i = bounds.min.x; i <= bounds.max.x; i++) {
|
1863
|
-
|
1864
|
-
|
2147
|
+
point = new L.Point(i, j);
|
2148
|
+
|
2149
|
+
if (this._tileShouldBeLoaded(point)) {
|
2150
|
+
queue.push(point);
|
1865
2151
|
}
|
1866
2152
|
}
|
1867
2153
|
}
|
1868
2154
|
|
1869
|
-
|
2155
|
+
var tilesToLoad = queue.length;
|
2156
|
+
|
2157
|
+
if (tilesToLoad === 0) { return; }
|
1870
2158
|
|
1871
2159
|
// load tiles in order of their distance to center
|
1872
2160
|
queue.sort(function (a, b) {
|
@@ -1875,16 +2163,37 @@ L.TileLayer = L.Class.extend({
|
|
1875
2163
|
|
1876
2164
|
var fragment = document.createDocumentFragment();
|
1877
2165
|
|
1878
|
-
|
2166
|
+
// if its the first batch of tiles to load
|
2167
|
+
if (!this._tilesToLoad) {
|
2168
|
+
this.fire('loading');
|
2169
|
+
}
|
2170
|
+
|
2171
|
+
this._tilesToLoad += tilesToLoad;
|
1879
2172
|
|
1880
|
-
|
1881
|
-
|
1882
|
-
this._addTile(queue[k], fragment);
|
2173
|
+
for (i = 0; i < tilesToLoad; i++) {
|
2174
|
+
this._addTile(queue[i], fragment);
|
1883
2175
|
}
|
1884
2176
|
|
1885
2177
|
this._container.appendChild(fragment);
|
1886
2178
|
},
|
1887
2179
|
|
2180
|
+
_tileShouldBeLoaded: function (tilePoint) {
|
2181
|
+
if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) {
|
2182
|
+
return false; // already loaded
|
2183
|
+
}
|
2184
|
+
|
2185
|
+
if (!this.options.continuousWorld) {
|
2186
|
+
var limit = this._getWrapTileNum();
|
2187
|
+
|
2188
|
+
if (this.options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit) ||
|
2189
|
+
tilePoint.y < 0 || tilePoint.y >= limit) {
|
2190
|
+
return false; // exceeds world bounds
|
2191
|
+
}
|
2192
|
+
}
|
2193
|
+
|
2194
|
+
return true;
|
2195
|
+
},
|
2196
|
+
|
1888
2197
|
_removeOtherTiles: function (bounds) {
|
1889
2198
|
var kArr, x, y, key;
|
1890
2199
|
|
@@ -1908,58 +2217,48 @@ L.TileLayer = L.Class.extend({
|
|
1908
2217
|
this.fire("tileunload", {tile: tile, url: tile.src});
|
1909
2218
|
|
1910
2219
|
if (this.options.reuseTiles) {
|
1911
|
-
|
2220
|
+
L.DomUtil.removeClass(tile, 'leaflet-tile-loaded');
|
1912
2221
|
this._unusedTiles.push(tile);
|
1913
2222
|
} else if (tile.parentNode === this._container) {
|
1914
2223
|
this._container.removeChild(tile);
|
1915
2224
|
}
|
1916
2225
|
|
1917
|
-
|
2226
|
+
if (!L.Browser.android) { //For https://github.com/CloudMade/Leaflet/issues/137
|
2227
|
+
tile.src = L.Util.emptyImageUrl;
|
2228
|
+
}
|
1918
2229
|
|
1919
2230
|
delete this._tiles[key];
|
1920
2231
|
},
|
1921
2232
|
|
1922
2233
|
_addTile: function (tilePoint, container) {
|
1923
|
-
var tilePos = this._getTilePos(tilePoint)
|
1924
|
-
zoom = this._map.getZoom(),
|
1925
|
-
key = tilePoint.x + ':' + tilePoint.y,
|
1926
|
-
limit = Math.pow(2, this._getOffsetZoom(zoom));
|
1927
|
-
|
1928
|
-
// wrap tile coordinates
|
1929
|
-
if (!this.options.continuousWorld) {
|
1930
|
-
if (!this.options.noWrap) {
|
1931
|
-
tilePoint.x = ((tilePoint.x % limit) + limit) % limit;
|
1932
|
-
} else if (tilePoint.x < 0 || tilePoint.x >= limit) {
|
1933
|
-
this._tilesToLoad--;
|
1934
|
-
return;
|
1935
|
-
}
|
1936
|
-
|
1937
|
-
if (tilePoint.y < 0 || tilePoint.y >= limit) {
|
1938
|
-
this._tilesToLoad--;
|
1939
|
-
return;
|
1940
|
-
}
|
1941
|
-
}
|
2234
|
+
var tilePos = this._getTilePos(tilePoint);
|
1942
2235
|
|
1943
2236
|
// get unused tile - or create a new tile
|
1944
2237
|
var tile = this._getTile();
|
1945
|
-
L.DomUtil.setPosition(tile, tilePos, true);
|
1946
2238
|
|
1947
|
-
|
2239
|
+
// Chrome 20 layouts much faster with top/left (Verify with timeline, frames), Safari 5.1.7, iOS 5.1.1,
|
2240
|
+
// android browser (4.0) have display issues with top/left and requires transform instead
|
2241
|
+
// (other browsers don't currently care) - see debug/hacks/jitter.html for an example
|
2242
|
+
L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);
|
1948
2243
|
|
1949
|
-
|
1950
|
-
tilePoint.y = limit - tilePoint.y - 1;
|
1951
|
-
}
|
2244
|
+
this._tiles[tilePoint.x + ':' + tilePoint.y] = tile;
|
1952
2245
|
|
1953
|
-
this._loadTile(tile, tilePoint
|
2246
|
+
this._loadTile(tile, tilePoint);
|
1954
2247
|
|
1955
2248
|
if (tile.parentNode !== this._container) {
|
1956
2249
|
container.appendChild(tile);
|
1957
2250
|
}
|
1958
2251
|
},
|
1959
2252
|
|
1960
|
-
|
1961
|
-
|
1962
|
-
|
2253
|
+
_getZoomForUrl: function () {
|
2254
|
+
|
2255
|
+
var options = this.options,
|
2256
|
+
zoom = this._map.getZoom();
|
2257
|
+
|
2258
|
+
if (options.zoomReverse) {
|
2259
|
+
zoom = options.maxZoom - zoom;
|
2260
|
+
}
|
2261
|
+
|
1963
2262
|
return zoom + options.zoomOffset;
|
1964
2263
|
},
|
1965
2264
|
|
@@ -1972,19 +2271,41 @@ L.TileLayer = L.Class.extend({
|
|
1972
2271
|
|
1973
2272
|
// image-specific code (override to implement e.g. Canvas or SVG tile layer)
|
1974
2273
|
|
1975
|
-
getTileUrl: function (tilePoint
|
1976
|
-
|
1977
|
-
index = (tilePoint.x + tilePoint.y) % subdomains.length,
|
1978
|
-
s = this.options.subdomains[index];
|
2274
|
+
getTileUrl: function (tilePoint) {
|
2275
|
+
this._adjustTilePoint(tilePoint);
|
1979
2276
|
|
1980
2277
|
return L.Util.template(this._url, L.Util.extend({
|
1981
|
-
s:
|
1982
|
-
z: this.
|
2278
|
+
s: this._getSubdomain(tilePoint),
|
2279
|
+
z: this._getZoomForUrl(),
|
1983
2280
|
x: tilePoint.x,
|
1984
2281
|
y: tilePoint.y
|
1985
2282
|
}, this.options));
|
1986
2283
|
},
|
1987
2284
|
|
2285
|
+
_getWrapTileNum: function () {
|
2286
|
+
// TODO refactor, limit is not valid for non-standard projections
|
2287
|
+
return Math.pow(2, this._getZoomForUrl());
|
2288
|
+
},
|
2289
|
+
|
2290
|
+
_adjustTilePoint: function (tilePoint) {
|
2291
|
+
|
2292
|
+
var limit = this._getWrapTileNum();
|
2293
|
+
|
2294
|
+
// wrap tile coordinates
|
2295
|
+
if (!this.options.continuousWorld && !this.options.noWrap) {
|
2296
|
+
tilePoint.x = ((tilePoint.x % limit) + limit) % limit;
|
2297
|
+
}
|
2298
|
+
|
2299
|
+
if (this.options.tms) {
|
2300
|
+
tilePoint.y = limit - tilePoint.y - 1;
|
2301
|
+
}
|
2302
|
+
},
|
2303
|
+
|
2304
|
+
_getSubdomain: function (tilePoint) {
|
2305
|
+
var index = (tilePoint.x + tilePoint.y) % this.options.subdomains.length;
|
2306
|
+
return this.options.subdomains[index];
|
2307
|
+
},
|
2308
|
+
|
1988
2309
|
_createTileProto: function () {
|
1989
2310
|
var img = this._tileImg = L.DomUtil.create('img', 'leaflet-tile');
|
1990
2311
|
img.galleryimg = 'no';
|
@@ -2013,12 +2334,12 @@ L.TileLayer = L.Class.extend({
|
|
2013
2334
|
return tile;
|
2014
2335
|
},
|
2015
2336
|
|
2016
|
-
_loadTile: function (tile, tilePoint
|
2337
|
+
_loadTile: function (tile, tilePoint) {
|
2017
2338
|
tile._layer = this;
|
2018
2339
|
tile.onload = this._tileOnLoad;
|
2019
2340
|
tile.onerror = this._tileOnError;
|
2020
2341
|
|
2021
|
-
tile.src = this.getTileUrl(tilePoint
|
2342
|
+
tile.src = this.getTileUrl(tilePoint);
|
2022
2343
|
},
|
2023
2344
|
|
2024
2345
|
_tileLoaded: function () {
|
@@ -2033,7 +2354,7 @@ L.TileLayer = L.Class.extend({
|
|
2033
2354
|
|
2034
2355
|
//Only if we are loading an actual image
|
2035
2356
|
if (this.src !== L.Util.emptyImageUrl) {
|
2036
|
-
this
|
2357
|
+
L.DomUtil.addClass(this, 'leaflet-tile-loaded');
|
2037
2358
|
|
2038
2359
|
layer.fire('tileload', {
|
2039
2360
|
tile: this,
|
@@ -2061,8 +2382,13 @@ L.TileLayer = L.Class.extend({
|
|
2061
2382
|
}
|
2062
2383
|
});
|
2063
2384
|
|
2385
|
+
L.tileLayer = function (url, options) {
|
2386
|
+
return new L.TileLayer(url, options);
|
2387
|
+
};
|
2388
|
+
|
2064
2389
|
|
2065
2390
|
L.TileLayer.WMS = L.TileLayer.extend({
|
2391
|
+
|
2066
2392
|
defaultWmsParams: {
|
2067
2393
|
service: 'WMS',
|
2068
2394
|
request: 'GetMap',
|
@@ -2074,10 +2400,16 @@ L.TileLayer.WMS = L.TileLayer.extend({
|
|
2074
2400
|
},
|
2075
2401
|
|
2076
2402
|
initialize: function (url, options) { // (String, Object)
|
2403
|
+
|
2077
2404
|
this._url = url;
|
2078
2405
|
|
2079
2406
|
var wmsParams = L.Util.extend({}, this.defaultWmsParams);
|
2080
|
-
|
2407
|
+
|
2408
|
+
if (options.detectRetina && L.Browser.retina) {
|
2409
|
+
wmsParams.width = wmsParams.height = this.options.tileSize * 2;
|
2410
|
+
} else {
|
2411
|
+
wmsParams.width = wmsParams.height = this.options.tileSize;
|
2412
|
+
}
|
2081
2413
|
|
2082
2414
|
for (var i in options) {
|
2083
2415
|
// all keys that are not TileLayer options go to WMS params
|
@@ -2091,34 +2423,49 @@ L.TileLayer.WMS = L.TileLayer.extend({
|
|
2091
2423
|
L.Util.setOptions(this, options);
|
2092
2424
|
},
|
2093
2425
|
|
2094
|
-
onAdd: function (map
|
2426
|
+
onAdd: function (map) {
|
2427
|
+
|
2095
2428
|
var projectionKey = parseFloat(this.wmsParams.version) >= 1.3 ? 'crs' : 'srs';
|
2096
2429
|
this.wmsParams[projectionKey] = map.options.crs.code;
|
2097
2430
|
|
2098
|
-
L.TileLayer.prototype.onAdd.call(this, map
|
2431
|
+
L.TileLayer.prototype.onAdd.call(this, map);
|
2099
2432
|
},
|
2100
2433
|
|
2101
2434
|
getTileUrl: function (tilePoint, zoom) { // (Point, Number) -> String
|
2435
|
+
|
2102
2436
|
var map = this._map,
|
2103
2437
|
crs = map.options.crs,
|
2104
|
-
|
2105
2438
|
tileSize = this.options.tileSize,
|
2106
2439
|
|
2107
2440
|
nwPoint = tilePoint.multiplyBy(tileSize),
|
2108
2441
|
sePoint = nwPoint.add(new L.Point(tileSize, tileSize)),
|
2109
2442
|
|
2110
|
-
|
2111
|
-
|
2443
|
+
nw = crs.project(map.unproject(nwPoint, zoom)),
|
2444
|
+
se = crs.project(map.unproject(sePoint, zoom)),
|
2445
|
+
|
2446
|
+
bbox = [nw.x, se.y, se.x, nw.y].join(','),
|
2112
2447
|
|
2113
|
-
|
2114
|
-
se = crs.project(seMap),
|
2448
|
+
url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)});
|
2115
2449
|
|
2116
|
-
|
2450
|
+
return url + L.Util.getParamString(this.wmsParams) + "&bbox=" + bbox;
|
2451
|
+
},
|
2452
|
+
|
2453
|
+
setParams: function (params, noRedraw) {
|
2454
|
+
|
2455
|
+
L.Util.extend(this.wmsParams, params);
|
2456
|
+
|
2457
|
+
if (!noRedraw) {
|
2458
|
+
this.redraw();
|
2459
|
+
}
|
2117
2460
|
|
2118
|
-
return this
|
2461
|
+
return this;
|
2119
2462
|
}
|
2120
2463
|
});
|
2121
2464
|
|
2465
|
+
L.tileLayer.wms = function (url, options) {
|
2466
|
+
return new L.TileLayer.WMS(url, options);
|
2467
|
+
};
|
2468
|
+
|
2122
2469
|
|
2123
2470
|
L.TileLayer.Canvas = L.TileLayer.extend({
|
2124
2471
|
options: {
|
@@ -2180,6 +2527,10 @@ L.TileLayer.Canvas = L.TileLayer.extend({
|
|
2180
2527
|
});
|
2181
2528
|
|
2182
2529
|
|
2530
|
+
L.tileLayer.canvas = function (options) {
|
2531
|
+
return new L.TileLayer.Canvas(options);
|
2532
|
+
};
|
2533
|
+
|
2183
2534
|
L.ImageOverlay = L.Class.extend({
|
2184
2535
|
includes: L.Mixin.Events,
|
2185
2536
|
|
@@ -2187,9 +2538,9 @@ L.ImageOverlay = L.Class.extend({
|
|
2187
2538
|
opacity: 1
|
2188
2539
|
},
|
2189
2540
|
|
2190
|
-
initialize: function (url, bounds, options) { // (String, LatLngBounds)
|
2541
|
+
initialize: function (url, bounds, options) { // (String, LatLngBounds, Object)
|
2191
2542
|
this._url = url;
|
2192
|
-
this._bounds = bounds;
|
2543
|
+
this._bounds = L.latLngBounds(bounds);
|
2193
2544
|
|
2194
2545
|
L.Util.setOptions(this, options);
|
2195
2546
|
},
|
@@ -2203,25 +2554,60 @@ L.ImageOverlay = L.Class.extend({
|
|
2203
2554
|
|
2204
2555
|
map._panes.overlayPane.appendChild(this._image);
|
2205
2556
|
|
2206
|
-
map.on('zoomanim', this._zoomAnimation, this);
|
2207
2557
|
map.on('viewreset', this._reset, this);
|
2558
|
+
|
2559
|
+
if (map.options.zoomAnimation && L.Browser.any3d) {
|
2560
|
+
map.on('zoomanim', this._animateZoom, this);
|
2561
|
+
}
|
2562
|
+
|
2208
2563
|
this._reset();
|
2209
2564
|
},
|
2210
2565
|
|
2211
2566
|
onRemove: function (map) {
|
2212
2567
|
map.getPanes().overlayPane.removeChild(this._image);
|
2568
|
+
|
2213
2569
|
map.off('viewreset', this._reset, this);
|
2570
|
+
|
2571
|
+
if (map.options.zoomAnimation) {
|
2572
|
+
map.off('zoomanim', this._animateZoom, this);
|
2573
|
+
}
|
2574
|
+
},
|
2575
|
+
|
2576
|
+
addTo: function (map) {
|
2577
|
+
map.addLayer(this);
|
2578
|
+
return this;
|
2579
|
+
},
|
2580
|
+
|
2581
|
+
setOpacity: function (opacity) {
|
2582
|
+
this.options.opacity = opacity;
|
2583
|
+
this._updateOpacity();
|
2584
|
+
return this;
|
2585
|
+
},
|
2586
|
+
|
2587
|
+
// TODO remove bringToFront/bringToBack duplication from TileLayer/Path
|
2588
|
+
bringToFront: function () {
|
2589
|
+
if (this._image) {
|
2590
|
+
this._map._panes.overlayPane.appendChild(this._image);
|
2591
|
+
}
|
2592
|
+
return this;
|
2214
2593
|
},
|
2215
2594
|
|
2216
|
-
|
2217
|
-
this.
|
2218
|
-
this.
|
2595
|
+
bringToBack: function () {
|
2596
|
+
var pane = this._map._panes.overlayPane;
|
2597
|
+
if (this._image) {
|
2598
|
+
pane.insertBefore(this._image, pane.firstChild);
|
2599
|
+
}
|
2600
|
+
return this;
|
2219
2601
|
},
|
2220
2602
|
|
2221
2603
|
_initImage: function () {
|
2222
|
-
this._image = L.DomUtil.create('img', 'leaflet-image-layer
|
2604
|
+
this._image = L.DomUtil.create('img', 'leaflet-image-layer');
|
2223
2605
|
|
2224
|
-
this.
|
2606
|
+
if (this._map.options.zoomAnimation && L.Browser.any3d) {
|
2607
|
+
L.DomUtil.addClass(this._image, 'leaflet-zoom-animated');
|
2608
|
+
} else {
|
2609
|
+
L.DomUtil.addClass(this._image, 'leaflet-zoom-hide');
|
2610
|
+
}
|
2225
2611
|
|
2226
2612
|
this._updateOpacity();
|
2227
2613
|
|
@@ -2235,14 +2621,18 @@ L.ImageOverlay = L.Class.extend({
|
|
2235
2621
|
});
|
2236
2622
|
},
|
2237
2623
|
|
2238
|
-
|
2239
|
-
var
|
2240
|
-
|
2241
|
-
|
2242
|
-
|
2243
|
-
|
2624
|
+
_animateZoom: function (e) {
|
2625
|
+
var map = this._map,
|
2626
|
+
image = this._image,
|
2627
|
+
scale = map.getZoomScale(e.zoom),
|
2628
|
+
nw = this._bounds.getNorthWest(),
|
2629
|
+
se = this._bounds.getSouthEast(),
|
2630
|
+
topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center),
|
2631
|
+
size = map._latLngToNewLayerPoint(se, e.zoom, e.center).subtract(topLeft),
|
2632
|
+
currentSize = map.latLngToLayerPoint(se).subtract(map.latLngToLayerPoint(nw)),
|
2633
|
+
origin = topLeft.add(size.subtract(currentSize).divideBy(2));
|
2244
2634
|
|
2245
|
-
image.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(
|
2635
|
+
image.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') ';
|
2246
2636
|
},
|
2247
2637
|
|
2248
2638
|
_reset: function () {
|
@@ -2257,7 +2647,6 @@ L.ImageOverlay = L.Class.extend({
|
|
2257
2647
|
},
|
2258
2648
|
|
2259
2649
|
_onImageLoad: function () {
|
2260
|
-
this._image.style.visibility = '';
|
2261
2650
|
this.fire('load');
|
2262
2651
|
},
|
2263
2652
|
|
@@ -2266,6 +2655,10 @@ L.ImageOverlay = L.Class.extend({
|
|
2266
2655
|
}
|
2267
2656
|
});
|
2268
2657
|
|
2658
|
+
L.imageOverlay = function (url, bounds, options) {
|
2659
|
+
return new L.ImageOverlay(url, bounds, options);
|
2660
|
+
};
|
2661
|
+
|
2269
2662
|
|
2270
2663
|
L.Icon = L.Class.extend({
|
2271
2664
|
options: {
|
@@ -2276,6 +2669,7 @@ L.Icon = L.Class.extend({
|
|
2276
2669
|
popupAnchor: (Point) (if not specified, popup opens in the anchor point)
|
2277
2670
|
shadowUrl: (Point) (no shadow by default)
|
2278
2671
|
shadowSize: (Point)
|
2672
|
+
shadowAnchor: (Point)
|
2279
2673
|
*/
|
2280
2674
|
className: ''
|
2281
2675
|
},
|
@@ -2295,7 +2689,12 @@ L.Icon = L.Class.extend({
|
|
2295
2689
|
_createIcon: function (name) {
|
2296
2690
|
var src = this._getIconUrl(name);
|
2297
2691
|
|
2298
|
-
if (!src) {
|
2692
|
+
if (!src) {
|
2693
|
+
if (name === 'icon') {
|
2694
|
+
throw new Error("iconUrl not set in Icon options (see the docs).");
|
2695
|
+
}
|
2696
|
+
return null;
|
2697
|
+
}
|
2299
2698
|
|
2300
2699
|
var img = this._createImg(src);
|
2301
2700
|
this._setIconStyles(img, name);
|
@@ -2305,18 +2704,20 @@ L.Icon = L.Class.extend({
|
|
2305
2704
|
|
2306
2705
|
_setIconStyles: function (img, name) {
|
2307
2706
|
var options = this.options,
|
2308
|
-
size = options[name + 'Size'],
|
2309
|
-
anchor
|
2707
|
+
size = L.point(options[name + 'Size']),
|
2708
|
+
anchor;
|
2310
2709
|
|
2311
|
-
if (
|
2312
|
-
anchor =
|
2710
|
+
if (name === 'shadow') {
|
2711
|
+
anchor = L.point(options.shadowAnchor || options.iconAnchor);
|
2712
|
+
} else {
|
2713
|
+
anchor = L.point(options.iconAnchor);
|
2313
2714
|
}
|
2314
2715
|
|
2315
|
-
if (
|
2316
|
-
anchor.
|
2716
|
+
if (!anchor && size) {
|
2717
|
+
anchor = size.divideBy(2, true);
|
2317
2718
|
}
|
2318
2719
|
|
2319
|
-
img.className = 'leaflet-marker-' + name + ' ' + options.className
|
2720
|
+
img.className = 'leaflet-marker-' + name + ' ' + options.className;
|
2320
2721
|
|
2321
2722
|
if (anchor) {
|
2322
2723
|
img.style.marginLeft = (-anchor.x) + 'px';
|
@@ -2347,25 +2748,35 @@ L.Icon = L.Class.extend({
|
|
2347
2748
|
}
|
2348
2749
|
});
|
2349
2750
|
|
2751
|
+
L.icon = function (options) {
|
2752
|
+
return new L.Icon(options);
|
2753
|
+
};
|
2754
|
+
|
2350
2755
|
|
2351
|
-
// TODO move to a separate file
|
2352
2756
|
|
2353
2757
|
L.Icon.Default = L.Icon.extend({
|
2758
|
+
|
2354
2759
|
options: {
|
2355
2760
|
iconSize: new L.Point(25, 41),
|
2356
2761
|
iconAnchor: new L.Point(13, 41),
|
2357
|
-
popupAnchor: new L.Point(
|
2762
|
+
popupAnchor: new L.Point(1, -34),
|
2358
2763
|
|
2359
2764
|
shadowSize: new L.Point(41, 41)
|
2360
2765
|
},
|
2361
2766
|
|
2362
2767
|
_getIconUrl: function (name) {
|
2363
|
-
var
|
2364
|
-
|
2365
|
-
|
2768
|
+
var key = name + 'Url';
|
2769
|
+
|
2770
|
+
if (this.options[key]) {
|
2771
|
+
return this.options[key];
|
2366
2772
|
}
|
2367
2773
|
|
2368
|
-
|
2774
|
+
if (name == 'shadow') {
|
2775
|
+
return "<%= asset_path('marker-shadow.png') %>";
|
2776
|
+
}
|
2777
|
+
else {
|
2778
|
+
return "<%= asset_path('marker-icon.png') %>";
|
2779
|
+
}
|
2369
2780
|
}
|
2370
2781
|
});
|
2371
2782
|
|
@@ -2385,6 +2796,7 @@ L.Icon.Default.imagePath = (function () {
|
|
2385
2796
|
}
|
2386
2797
|
}());
|
2387
2798
|
|
2799
|
+
|
2388
2800
|
/*
|
2389
2801
|
* L.Marker is used to display clickable/draggable icons on the map.
|
2390
2802
|
*/
|
@@ -2404,7 +2816,7 @@ L.Marker = L.Class.extend({
|
|
2404
2816
|
|
2405
2817
|
initialize: function (latlng, options) {
|
2406
2818
|
L.Util.setOptions(this, options);
|
2407
|
-
this._latlng = latlng;
|
2819
|
+
this._latlng = L.latLng(latlng);
|
2408
2820
|
},
|
2409
2821
|
|
2410
2822
|
onAdd: function (map) {
|
@@ -2412,12 +2824,17 @@ L.Marker = L.Class.extend({
|
|
2412
2824
|
|
2413
2825
|
map.on('viewreset', this.update, this);
|
2414
2826
|
|
2827
|
+
this._initIcon();
|
2828
|
+
this.update();
|
2829
|
+
|
2415
2830
|
if (map.options.zoomAnimation && map.options.markerZoomAnimation) {
|
2416
|
-
map.on('zoomanim', this.
|
2831
|
+
map.on('zoomanim', this._animateZoom, this);
|
2417
2832
|
}
|
2833
|
+
},
|
2418
2834
|
|
2419
|
-
|
2420
|
-
|
2835
|
+
addTo: function (map) {
|
2836
|
+
map.addLayer(this);
|
2837
|
+
return this;
|
2421
2838
|
},
|
2422
2839
|
|
2423
2840
|
onRemove: function (map) {
|
@@ -2428,8 +2845,10 @@ L.Marker = L.Class.extend({
|
|
2428
2845
|
this.closePopup();
|
2429
2846
|
}
|
2430
2847
|
|
2431
|
-
map.off(
|
2432
|
-
|
2848
|
+
map.off({
|
2849
|
+
'viewreset': this.update,
|
2850
|
+
'zoomanim': this._animateZoom
|
2851
|
+
}, this);
|
2433
2852
|
|
2434
2853
|
this._map = null;
|
2435
2854
|
},
|
@@ -2439,7 +2858,7 @@ L.Marker = L.Class.extend({
|
|
2439
2858
|
},
|
2440
2859
|
|
2441
2860
|
setLatLng: function (latlng) {
|
2442
|
-
this._latlng = latlng;
|
2861
|
+
this._latlng = L.latLng(latlng);
|
2443
2862
|
|
2444
2863
|
this.update();
|
2445
2864
|
|
@@ -2474,7 +2893,11 @@ L.Marker = L.Class.extend({
|
|
2474
2893
|
},
|
2475
2894
|
|
2476
2895
|
_initIcon: function () {
|
2477
|
-
var options = this.options
|
2896
|
+
var options = this.options,
|
2897
|
+
map = this._map,
|
2898
|
+
animation = (map.options.zoomAnimation && map.options.markerZoomAnimation),
|
2899
|
+
classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide',
|
2900
|
+
needOpacityUpdate = false;
|
2478
2901
|
|
2479
2902
|
if (!this._icon) {
|
2480
2903
|
this._icon = options.icon.createIcon();
|
@@ -2484,10 +2907,21 @@ L.Marker = L.Class.extend({
|
|
2484
2907
|
}
|
2485
2908
|
|
2486
2909
|
this._initInteraction();
|
2487
|
-
this.
|
2910
|
+
needOpacityUpdate = (this.options.opacity < 1);
|
2911
|
+
|
2912
|
+
L.DomUtil.addClass(this._icon, classToAdd);
|
2488
2913
|
}
|
2489
2914
|
if (!this._shadow) {
|
2490
2915
|
this._shadow = options.icon.createShadow();
|
2916
|
+
|
2917
|
+
if (this._shadow) {
|
2918
|
+
L.DomUtil.addClass(this._shadow, classToAdd);
|
2919
|
+
needOpacityUpdate = (this.options.opacity < 1);
|
2920
|
+
}
|
2921
|
+
}
|
2922
|
+
|
2923
|
+
if (needOpacityUpdate) {
|
2924
|
+
this._updateOpacity();
|
2491
2925
|
}
|
2492
2926
|
|
2493
2927
|
var panes = this._map._panes;
|
@@ -2521,7 +2955,7 @@ L.Marker = L.Class.extend({
|
|
2521
2955
|
this._icon.style.zIndex = pos.y + this.options.zIndexOffset;
|
2522
2956
|
},
|
2523
2957
|
|
2524
|
-
|
2958
|
+
_animateZoom: function (opt) {
|
2525
2959
|
var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);
|
2526
2960
|
|
2527
2961
|
this._setPos(pos);
|
@@ -2535,11 +2969,11 @@ L.Marker = L.Class.extend({
|
|
2535
2969
|
var icon = this._icon,
|
2536
2970
|
events = ['dblclick', 'mousedown', 'mouseover', 'mouseout'];
|
2537
2971
|
|
2538
|
-
icon
|
2539
|
-
L.DomEvent.
|
2972
|
+
L.DomUtil.addClass(icon, 'leaflet-clickable');
|
2973
|
+
L.DomEvent.on(icon, 'click', this._onMouseClick, this);
|
2540
2974
|
|
2541
2975
|
for (var i = 0; i < events.length; i++) {
|
2542
|
-
L.DomEvent.
|
2976
|
+
L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
|
2543
2977
|
}
|
2544
2978
|
|
2545
2979
|
if (L.Handler.MarkerDrag) {
|
@@ -2576,11 +3010,18 @@ L.Marker = L.Class.extend({
|
|
2576
3010
|
}
|
2577
3011
|
},
|
2578
3012
|
|
2579
|
-
_updateOpacity: function (
|
3013
|
+
_updateOpacity: function () {
|
2580
3014
|
L.DomUtil.setOpacity(this._icon, this.options.opacity);
|
3015
|
+
if (this._shadow) {
|
3016
|
+
L.DomUtil.setOpacity(this._shadow, this.options.opacity);
|
3017
|
+
}
|
2581
3018
|
}
|
2582
3019
|
});
|
2583
3020
|
|
3021
|
+
L.marker = function (latlng, options) {
|
3022
|
+
return new L.Marker(latlng, options);
|
3023
|
+
};
|
3024
|
+
|
2584
3025
|
|
2585
3026
|
L.DivIcon = L.Icon.extend({
|
2586
3027
|
options: {
|
@@ -2588,12 +3029,25 @@ L.DivIcon = L.Icon.extend({
|
|
2588
3029
|
/*
|
2589
3030
|
iconAnchor: (Point)
|
2590
3031
|
popupAnchor: (Point)
|
3032
|
+
html: (String)
|
3033
|
+
bgPos: (Point)
|
2591
3034
|
*/
|
2592
3035
|
className: 'leaflet-div-icon'
|
2593
3036
|
},
|
2594
3037
|
|
2595
3038
|
createIcon: function () {
|
2596
|
-
var div = document.createElement('div')
|
3039
|
+
var div = document.createElement('div'),
|
3040
|
+
options = this.options;
|
3041
|
+
|
3042
|
+
if (options.html) {
|
3043
|
+
div.innerHTML = options.html;
|
3044
|
+
}
|
3045
|
+
|
3046
|
+
if (options.bgPos) {
|
3047
|
+
div.style.backgroundPosition =
|
3048
|
+
(-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';
|
3049
|
+
}
|
3050
|
+
|
2597
3051
|
this._setIconStyles(div, 'icon');
|
2598
3052
|
return div;
|
2599
3053
|
},
|
@@ -2603,6 +3057,10 @@ L.DivIcon = L.Icon.extend({
|
|
2603
3057
|
}
|
2604
3058
|
});
|
2605
3059
|
|
3060
|
+
L.divIcon = function (options) {
|
3061
|
+
return new L.DivIcon(options);
|
3062
|
+
};
|
3063
|
+
|
2606
3064
|
|
2607
3065
|
|
2608
3066
|
L.Map.mergeOptions({
|
@@ -2618,7 +3076,7 @@ L.Popup = L.Class.extend({
|
|
2618
3076
|
maxHeight: null,
|
2619
3077
|
autoPan: true,
|
2620
3078
|
closeButton: true,
|
2621
|
-
offset: new L.Point(0,
|
3079
|
+
offset: new L.Point(0, 6),
|
2622
3080
|
autoPanPadding: new L.Point(5, 5),
|
2623
3081
|
className: ''
|
2624
3082
|
},
|
@@ -2637,7 +3095,11 @@ L.Popup = L.Class.extend({
|
|
2637
3095
|
}
|
2638
3096
|
this._updateContent();
|
2639
3097
|
|
2640
|
-
|
3098
|
+
var animFade = map.options.fadeAnimation;
|
3099
|
+
|
3100
|
+
if (animFade) {
|
3101
|
+
L.DomUtil.setOpacity(this._container, 0);
|
3102
|
+
}
|
2641
3103
|
map._panes.popupPane.appendChild(this._container);
|
2642
3104
|
|
2643
3105
|
map.on('viewreset', this._updatePosition, this);
|
@@ -2652,25 +3114,41 @@ L.Popup = L.Class.extend({
|
|
2652
3114
|
|
2653
3115
|
this._update();
|
2654
3116
|
|
2655
|
-
|
3117
|
+
if (animFade) {
|
3118
|
+
L.DomUtil.setOpacity(this._container, 1);
|
3119
|
+
}
|
3120
|
+
},
|
3121
|
+
|
3122
|
+
addTo: function (map) {
|
3123
|
+
map.addLayer(this);
|
3124
|
+
return this;
|
3125
|
+
},
|
3126
|
+
|
3127
|
+
openOn: function (map) {
|
3128
|
+
map.openPopup(this);
|
3129
|
+
return this;
|
2656
3130
|
},
|
2657
3131
|
|
2658
3132
|
onRemove: function (map) {
|
2659
3133
|
map._panes.popupPane.removeChild(this._container);
|
2660
3134
|
|
2661
|
-
L.Util.falseFn(this._container.offsetWidth);
|
3135
|
+
L.Util.falseFn(this._container.offsetWidth); // force reflow
|
2662
3136
|
|
2663
|
-
map.off(
|
2664
|
-
|
2665
|
-
|
3137
|
+
map.off({
|
3138
|
+
viewreset: this._updatePosition,
|
3139
|
+
preclick: this._close,
|
3140
|
+
zoomanim: this._zoomAnimation
|
3141
|
+
}, this);
|
2666
3142
|
|
2667
|
-
|
3143
|
+
if (map.options.fadeAnimation) {
|
3144
|
+
L.DomUtil.setOpacity(this._container, 0);
|
3145
|
+
}
|
2668
3146
|
|
2669
3147
|
this._map = null;
|
2670
3148
|
},
|
2671
3149
|
|
2672
3150
|
setLatLng: function (latlng) {
|
2673
|
-
this._latlng = latlng;
|
3151
|
+
this._latlng = L.latLng(latlng);
|
2674
3152
|
this._update();
|
2675
3153
|
return this;
|
2676
3154
|
},
|
@@ -2701,15 +3179,16 @@ L.Popup = L.Class.extend({
|
|
2701
3179
|
if (this.options.closeButton) {
|
2702
3180
|
closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container);
|
2703
3181
|
closeButton.href = '#close';
|
3182
|
+
closeButton.innerHTML = '×';
|
2704
3183
|
|
2705
|
-
L.DomEvent.
|
3184
|
+
L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);
|
2706
3185
|
}
|
2707
3186
|
|
2708
3187
|
var wrapper = this._wrapper = L.DomUtil.create('div', prefix + '-content-wrapper', container);
|
2709
3188
|
L.DomEvent.disableClickPropagation(wrapper);
|
2710
3189
|
|
2711
3190
|
this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);
|
2712
|
-
L.DomEvent.
|
3191
|
+
L.DomEvent.on(this._contentNode, 'mousewheel', L.DomEvent.stopPropagation);
|
2713
3192
|
|
2714
3193
|
this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);
|
2715
3194
|
this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);
|
@@ -2744,29 +3223,30 @@ L.Popup = L.Class.extend({
|
|
2744
3223
|
},
|
2745
3224
|
|
2746
3225
|
_updateLayout: function () {
|
2747
|
-
var container = this._contentNode
|
3226
|
+
var container = this._contentNode,
|
3227
|
+
style = container.style;
|
2748
3228
|
|
2749
|
-
|
2750
|
-
|
3229
|
+
style.width = '';
|
3230
|
+
style.whiteSpace = 'nowrap';
|
2751
3231
|
|
2752
3232
|
var width = container.offsetWidth;
|
2753
3233
|
width = Math.min(width, this.options.maxWidth);
|
2754
3234
|
width = Math.max(width, this.options.minWidth);
|
2755
3235
|
|
2756
|
-
|
2757
|
-
|
3236
|
+
style.width = (width + 1) + 'px';
|
3237
|
+
style.whiteSpace = '';
|
2758
3238
|
|
2759
|
-
|
3239
|
+
style.height = '';
|
2760
3240
|
|
2761
3241
|
var height = container.offsetHeight,
|
2762
3242
|
maxHeight = this.options.maxHeight,
|
2763
|
-
scrolledClass = '
|
3243
|
+
scrolledClass = 'leaflet-popup-scrolled';
|
2764
3244
|
|
2765
3245
|
if (maxHeight && height > maxHeight) {
|
2766
|
-
|
2767
|
-
container
|
3246
|
+
style.height = maxHeight + 'px';
|
3247
|
+
L.DomUtil.addClass(container, scrolledClass);
|
2768
3248
|
} else {
|
2769
|
-
|
3249
|
+
L.DomUtil.removeClass(container, scrolledClass);
|
2770
3250
|
}
|
2771
3251
|
|
2772
3252
|
this._containerWidth = this._container.offsetWidth;
|
@@ -2790,7 +3270,7 @@ L.Popup = L.Class.extend({
|
|
2790
3270
|
},
|
2791
3271
|
|
2792
3272
|
_zoomAnimation: function (opt) {
|
2793
|
-
var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center)
|
3273
|
+
var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);
|
2794
3274
|
|
2795
3275
|
L.DomUtil.setPosition(this._container, pos);
|
2796
3276
|
},
|
@@ -2838,6 +3318,10 @@ L.Popup = L.Class.extend({
|
|
2838
3318
|
}
|
2839
3319
|
});
|
2840
3320
|
|
3321
|
+
L.popup = function (options, source) {
|
3322
|
+
return new L.Popup(options, source);
|
3323
|
+
};
|
3324
|
+
|
2841
3325
|
|
2842
3326
|
/*
|
2843
3327
|
* Popup extension to L.Marker, adding openPopup & bindPopup methods.
|
@@ -2861,7 +3345,9 @@ L.Marker.include({
|
|
2861
3345
|
},
|
2862
3346
|
|
2863
3347
|
bindPopup: function (content, options) {
|
2864
|
-
var anchor = this.options.icon.options.popupAnchor || new L.Point(0, 0);
|
3348
|
+
var anchor = L.point(this.options.icon.options.popupAnchor) || new L.Point(0, 0);
|
3349
|
+
|
3350
|
+
anchor = anchor.add(L.Popup.prototype.options.offset);
|
2865
3351
|
|
2866
3352
|
if (options && options.offset) {
|
2867
3353
|
anchor = anchor.add(options.offset);
|
@@ -2951,7 +3437,7 @@ L.LayerGroup = L.Class.extend({
|
|
2951
3437
|
},
|
2952
3438
|
|
2953
3439
|
clearLayers: function () {
|
2954
|
-
this.
|
3440
|
+
this.eachLayer(this.removeLayer, this);
|
2955
3441
|
return this;
|
2956
3442
|
},
|
2957
3443
|
|
@@ -2974,15 +3460,20 @@ L.LayerGroup = L.Class.extend({
|
|
2974
3460
|
|
2975
3461
|
onAdd: function (map) {
|
2976
3462
|
this._map = map;
|
2977
|
-
this.
|
3463
|
+
this.eachLayer(map.addLayer, map);
|
2978
3464
|
},
|
2979
3465
|
|
2980
3466
|
onRemove: function (map) {
|
2981
|
-
this.
|
3467
|
+
this.eachLayer(map.removeLayer, map);
|
2982
3468
|
this._map = null;
|
2983
3469
|
},
|
2984
3470
|
|
2985
|
-
|
3471
|
+
addTo: function (map) {
|
3472
|
+
map.addLayer(this);
|
3473
|
+
return this;
|
3474
|
+
},
|
3475
|
+
|
3476
|
+
eachLayer: function (method, context) {
|
2986
3477
|
for (var i in this._layers) {
|
2987
3478
|
if (this._layers.hasOwnProperty(i)) {
|
2988
3479
|
method.call(context, this._layers[i]);
|
@@ -2991,6 +3482,10 @@ L.LayerGroup = L.Class.extend({
|
|
2991
3482
|
}
|
2992
3483
|
});
|
2993
3484
|
|
3485
|
+
L.layerGroup = function (layers) {
|
3486
|
+
return new L.LayerGroup(layers);
|
3487
|
+
};
|
3488
|
+
|
2994
3489
|
|
2995
3490
|
/*
|
2996
3491
|
* L.FeatureGroup extends L.LayerGroup by introducing mouse events and bindPopup method shared between a group of layers.
|
@@ -3000,13 +3495,31 @@ L.FeatureGroup = L.LayerGroup.extend({
|
|
3000
3495
|
includes: L.Mixin.Events,
|
3001
3496
|
|
3002
3497
|
addLayer: function (layer) {
|
3003
|
-
this.
|
3498
|
+
if (this._layers[L.Util.stamp(layer)]) {
|
3499
|
+
return this;
|
3500
|
+
}
|
3501
|
+
|
3502
|
+
layer.on('click dblclick mouseover mouseout mousemove contextmenu', this._propagateEvent, this);
|
3004
3503
|
|
3005
3504
|
L.LayerGroup.prototype.addLayer.call(this, layer);
|
3006
3505
|
|
3007
3506
|
if (this._popupContent && layer.bindPopup) {
|
3008
3507
|
layer.bindPopup(this._popupContent);
|
3009
3508
|
}
|
3509
|
+
|
3510
|
+
return this;
|
3511
|
+
},
|
3512
|
+
|
3513
|
+
removeLayer: function (layer) {
|
3514
|
+
layer.off('click dblclick mouseover mouseout mousemove contextmenu', this._propagateEvent, this);
|
3515
|
+
|
3516
|
+
L.LayerGroup.prototype.removeLayer.call(this, layer);
|
3517
|
+
|
3518
|
+
if (this._popupContent) {
|
3519
|
+
return this.invoke('unbindPopup');
|
3520
|
+
} else {
|
3521
|
+
return this;
|
3522
|
+
}
|
3010
3523
|
},
|
3011
3524
|
|
3012
3525
|
bindPopup: function (content) {
|
@@ -3020,21 +3533,12 @@ L.FeatureGroup = L.LayerGroup.extend({
|
|
3020
3533
|
|
3021
3534
|
getBounds: function () {
|
3022
3535
|
var bounds = new L.LatLngBounds();
|
3023
|
-
this.
|
3536
|
+
this.eachLayer(function (layer) {
|
3024
3537
|
bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds());
|
3025
3538
|
}, this);
|
3026
3539
|
return bounds;
|
3027
3540
|
},
|
3028
3541
|
|
3029
|
-
_initEvents: function (layer) {
|
3030
|
-
var events = ['click', 'dblclick', 'mouseover', 'mouseout'],
|
3031
|
-
i, len;
|
3032
|
-
|
3033
|
-
for (i = 0, len = events.length; i < len; i++) {
|
3034
|
-
layer.on(events[i], this._propagateEvent, this);
|
3035
|
-
}
|
3036
|
-
},
|
3037
|
-
|
3038
3542
|
_propagateEvent: function (e) {
|
3039
3543
|
e.layer = e.target;
|
3040
3544
|
e.target = this;
|
@@ -3043,6 +3547,10 @@ L.FeatureGroup = L.LayerGroup.extend({
|
|
3043
3547
|
}
|
3044
3548
|
});
|
3045
3549
|
|
3550
|
+
L.featureGroup = function (layers) {
|
3551
|
+
return new L.FeatureGroup(layers);
|
3552
|
+
};
|
3553
|
+
|
3046
3554
|
|
3047
3555
|
/*
|
3048
3556
|
* L.Path is a base class for rendering vector paths on a map. It's inherited by Polyline, Circle, etc.
|
@@ -3054,12 +3562,17 @@ L.Path = L.Class.extend({
|
|
3054
3562
|
statics: {
|
3055
3563
|
// how much to extend the clip area around the map view
|
3056
3564
|
// (relative to its size, e.g. 0.5 is half the screen in each direction)
|
3057
|
-
|
3565
|
+
// set in such way that SVG element doesn't exceed 1280px (vector layers flicker on dragend if it is)
|
3566
|
+
CLIP_PADDING: L.Browser.mobile ?
|
3567
|
+
Math.max(0, Math.min(0.5,
|
3568
|
+
(1280 / Math.max(window.innerWidth, window.innerHeight) - 1) / 2))
|
3569
|
+
: 0.5
|
3058
3570
|
},
|
3059
3571
|
|
3060
3572
|
options: {
|
3061
3573
|
stroke: true,
|
3062
3574
|
color: '#0033ff',
|
3575
|
+
dashArray: null,
|
3063
3576
|
weight: 5,
|
3064
3577
|
opacity: 0.5,
|
3065
3578
|
|
@@ -3077,24 +3590,44 @@ L.Path = L.Class.extend({
|
|
3077
3590
|
onAdd: function (map) {
|
3078
3591
|
this._map = map;
|
3079
3592
|
|
3080
|
-
this.
|
3081
|
-
|
3593
|
+
if (!this._container) {
|
3594
|
+
this._initElements();
|
3595
|
+
this._initEvents();
|
3596
|
+
}
|
3597
|
+
|
3082
3598
|
this.projectLatlngs();
|
3083
3599
|
this._updatePath();
|
3084
3600
|
|
3085
|
-
|
3086
|
-
.
|
3087
|
-
|
3601
|
+
if (this._container) {
|
3602
|
+
this._map._pathRoot.appendChild(this._container);
|
3603
|
+
}
|
3604
|
+
|
3605
|
+
map.on({
|
3606
|
+
'viewreset': this.projectLatlngs,
|
3607
|
+
'moveend': this._updatePath
|
3608
|
+
}, this);
|
3609
|
+
},
|
3610
|
+
|
3611
|
+
addTo: function (map) {
|
3612
|
+
map.addLayer(this);
|
3613
|
+
return this;
|
3088
3614
|
},
|
3089
3615
|
|
3090
3616
|
onRemove: function (map) {
|
3617
|
+
map._pathRoot.removeChild(this._container);
|
3618
|
+
|
3091
3619
|
this._map = null;
|
3092
3620
|
|
3093
|
-
|
3621
|
+
if (L.Browser.vml) {
|
3622
|
+
this._container = null;
|
3623
|
+
this._stroke = null;
|
3624
|
+
this._fill = null;
|
3625
|
+
}
|
3094
3626
|
|
3095
|
-
map
|
3096
|
-
|
3097
|
-
|
3627
|
+
map.off({
|
3628
|
+
'viewreset': this.projectLatlngs,
|
3629
|
+
'moveend': this._updatePath
|
3630
|
+
}, this);
|
3098
3631
|
},
|
3099
3632
|
|
3100
3633
|
projectLatlngs: function () {
|
@@ -3174,8 +3707,6 @@ L.Path = L.Path.extend({
|
|
3174
3707
|
|
3175
3708
|
this._path = this._createElement('path');
|
3176
3709
|
this._container.appendChild(this._path);
|
3177
|
-
|
3178
|
-
this._map._pathRoot.appendChild(this._container);
|
3179
3710
|
},
|
3180
3711
|
|
3181
3712
|
_initStyle: function () {
|
@@ -3194,6 +3725,11 @@ L.Path = L.Path.extend({
|
|
3194
3725
|
this._path.setAttribute('stroke', this.options.color);
|
3195
3726
|
this._path.setAttribute('stroke-opacity', this.options.opacity);
|
3196
3727
|
this._path.setAttribute('stroke-width', this.options.weight);
|
3728
|
+
if (this.options.dashArray) {
|
3729
|
+
this._path.setAttribute('stroke-dasharray', this.options.dashArray);
|
3730
|
+
} else {
|
3731
|
+
this._path.removeAttribute('stroke-dasharray');
|
3732
|
+
}
|
3197
3733
|
} else {
|
3198
3734
|
this._path.setAttribute('stroke', 'none');
|
3199
3735
|
}
|
@@ -3221,11 +3757,11 @@ L.Path = L.Path.extend({
|
|
3221
3757
|
this._path.setAttribute('class', 'leaflet-clickable');
|
3222
3758
|
}
|
3223
3759
|
|
3224
|
-
L.DomEvent.
|
3760
|
+
L.DomEvent.on(this._container, 'click', this._onMouseClick, this);
|
3225
3761
|
|
3226
3762
|
var events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'mousemove', 'contextmenu'];
|
3227
3763
|
for (var i = 0; i < events.length; i++) {
|
3228
|
-
L.DomEvent.
|
3764
|
+
L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this);
|
3229
3765
|
}
|
3230
3766
|
}
|
3231
3767
|
},
|
@@ -3235,17 +3771,20 @@ L.Path = L.Path.extend({
|
|
3235
3771
|
return;
|
3236
3772
|
}
|
3237
3773
|
|
3238
|
-
if (e.type === 'contextmenu') {
|
3239
|
-
L.DomEvent.preventDefault(e);
|
3240
|
-
}
|
3241
|
-
|
3242
3774
|
this._fireMouseEvent(e);
|
3775
|
+
|
3776
|
+
L.DomEvent.stopPropagation(e);
|
3243
3777
|
},
|
3244
3778
|
|
3245
3779
|
_fireMouseEvent: function (e) {
|
3246
3780
|
if (!this.hasEventListeners(e.type)) {
|
3247
3781
|
return;
|
3248
3782
|
}
|
3783
|
+
|
3784
|
+
if (e.type === 'contextmenu') {
|
3785
|
+
L.DomEvent.preventDefault(e);
|
3786
|
+
}
|
3787
|
+
|
3249
3788
|
var map = this._map,
|
3250
3789
|
containerPoint = map.mouseEventToContainerPoint(e),
|
3251
3790
|
layerPoint = map.containerPointToLayerPoint(containerPoint),
|
@@ -3257,8 +3796,6 @@ L.Path = L.Path.extend({
|
|
3257
3796
|
containerPoint: containerPoint,
|
3258
3797
|
originalEvent: e
|
3259
3798
|
});
|
3260
|
-
|
3261
|
-
L.DomEvent.stopPropagation(e);
|
3262
3799
|
}
|
3263
3800
|
});
|
3264
3801
|
|
@@ -3268,10 +3805,15 @@ L.Map.include({
|
|
3268
3805
|
this._pathRoot = L.Path.prototype._createElement('svg');
|
3269
3806
|
this._panes.overlayPane.appendChild(this._pathRoot);
|
3270
3807
|
|
3271
|
-
if (this.options.zoomAnimation) {
|
3808
|
+
if (this.options.zoomAnimation && L.Browser.any3d) {
|
3272
3809
|
this._pathRoot.setAttribute('class', ' leaflet-zoom-animated');
|
3273
|
-
|
3274
|
-
this.on(
|
3810
|
+
|
3811
|
+
this.on({
|
3812
|
+
'zoomanim': this._animatePathZoom,
|
3813
|
+
'zoomend': this._endPathZoom
|
3814
|
+
});
|
3815
|
+
} else {
|
3816
|
+
this._pathRoot.setAttribute('class', ' leaflet-zoom-hide');
|
3275
3817
|
}
|
3276
3818
|
|
3277
3819
|
this.on('moveend', this._updateSvgViewport);
|
@@ -3280,15 +3822,12 @@ L.Map.include({
|
|
3280
3822
|
},
|
3281
3823
|
|
3282
3824
|
_animatePathZoom: function (opt) {
|
3283
|
-
|
3284
|
-
|
3285
|
-
|
3286
|
-
|
3287
|
-
centerPoint = this.containerPointToLayerPoint(this.getSize().divideBy(-2)),
|
3288
|
-
origin = centerPoint.add(offset).round(),
|
3289
|
-
pathRootStyle = this._pathRoot.style;
|
3825
|
+
var scale = this.getZoomScale(opt.zoom),
|
3826
|
+
offset = this._getCenterOffset(opt.center).divideBy(1 - 1 / scale),
|
3827
|
+
viewportPos = this.containerPointToLayerPoint(this.getSize().multiplyBy(-L.Path.CLIP_PADDING)),
|
3828
|
+
origin = viewportPos.add(offset).round();
|
3290
3829
|
|
3291
|
-
|
3830
|
+
this._pathRoot.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString((origin.multiplyBy(-1).add(L.DomUtil.getPosition(this._pathRoot)).multiplyBy(scale).add(origin))) + ' scale(' + scale + ') ';
|
3292
3831
|
|
3293
3832
|
this._pathZooming = true;
|
3294
3833
|
},
|
@@ -3299,9 +3838,9 @@ L.Map.include({
|
|
3299
3838
|
|
3300
3839
|
_updateSvgViewport: function () {
|
3301
3840
|
if (this._pathZooming) {
|
3302
|
-
//Do not update SVGs while a zoom animation is going on otherwise the animation will break.
|
3303
|
-
//When the zoom animation ends we will be updated again anyway
|
3304
|
-
//This fixes the case where you do a momentum move and zoom while the move is still ongoing.
|
3841
|
+
// Do not update SVGs while a zoom animation is going on otherwise the animation will break.
|
3842
|
+
// When the zoom animation ends we will be updated again anyway
|
3843
|
+
// This fixes the case where you do a momentum move and zoom while the move is still ongoing.
|
3305
3844
|
return;
|
3306
3845
|
}
|
3307
3846
|
|
@@ -3316,7 +3855,6 @@ L.Map.include({
|
|
3316
3855
|
pane = this._panes.overlayPane;
|
3317
3856
|
|
3318
3857
|
// Hack to make flicker on drag end on mobile webkit less irritating
|
3319
|
-
// Unfortunately I haven't found a good workaround for this yet
|
3320
3858
|
if (L.Browser.mobileWebkit) {
|
3321
3859
|
pane.removeChild(root);
|
3322
3860
|
}
|
@@ -3338,10 +3876,13 @@ L.Map.include({
|
|
3338
3876
|
*/
|
3339
3877
|
|
3340
3878
|
L.Path.include({
|
3879
|
+
|
3341
3880
|
bindPopup: function (content, options) {
|
3881
|
+
|
3342
3882
|
if (!this._popup || this._popup.options !== options) {
|
3343
3883
|
this._popup = new L.Popup(options, this);
|
3344
3884
|
}
|
3885
|
+
|
3345
3886
|
this._popup.setContent(content);
|
3346
3887
|
|
3347
3888
|
if (!this._openPopupAdded) {
|
@@ -3352,6 +3893,18 @@ L.Path.include({
|
|
3352
3893
|
return this;
|
3353
3894
|
},
|
3354
3895
|
|
3896
|
+
openPopup: function (latlng) {
|
3897
|
+
|
3898
|
+
if (this._popup) {
|
3899
|
+
latlng = latlng || this._latlng ||
|
3900
|
+
this._latlngs[Math.floor(this._latlngs.length / 2)];
|
3901
|
+
|
3902
|
+
this._openPopup({latlng: latlng});
|
3903
|
+
}
|
3904
|
+
|
3905
|
+
return this;
|
3906
|
+
},
|
3907
|
+
|
3355
3908
|
_openPopup: function (e) {
|
3356
3909
|
this._popup.setLatLng(e.latlng);
|
3357
3910
|
this._map.openPopup(this._popup);
|
@@ -3365,13 +3918,17 @@ L.Path.include({
|
|
3365
3918
|
*/
|
3366
3919
|
|
3367
3920
|
L.Browser.vml = (function () {
|
3368
|
-
|
3369
|
-
|
3921
|
+
try {
|
3922
|
+
var div = document.createElement('div');
|
3923
|
+
div.innerHTML = '<v:shape adj="1"/>';
|
3370
3924
|
|
3371
|
-
|
3372
|
-
|
3925
|
+
var shape = div.firstChild;
|
3926
|
+
shape.style.behavior = 'url(#default#VML)';
|
3373
3927
|
|
3374
|
-
|
3928
|
+
return shape && (typeof shape.adj === 'object');
|
3929
|
+
} catch (e) {
|
3930
|
+
return false;
|
3931
|
+
}
|
3375
3932
|
}());
|
3376
3933
|
|
3377
3934
|
L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({
|
@@ -3395,8 +3952,10 @@ L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({
|
|
3395
3952
|
|
3396
3953
|
_initPath: function () {
|
3397
3954
|
var container = this._container = this._createElement('shape');
|
3398
|
-
container
|
3399
|
-
|
3955
|
+
L.DomUtil.addClass(container, 'leaflet-vml-shape');
|
3956
|
+
if (this.options.clickable) {
|
3957
|
+
L.DomUtil.addClass(container, 'leaflet-clickable');
|
3958
|
+
}
|
3400
3959
|
container.coordsize = '1 1';
|
3401
3960
|
|
3402
3961
|
this._path = this._createElement('path');
|
@@ -3427,6 +3986,11 @@ L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({
|
|
3427
3986
|
stroke.weight = options.weight + 'px';
|
3428
3987
|
stroke.color = options.color;
|
3429
3988
|
stroke.opacity = options.opacity;
|
3989
|
+
if (options.dashArray) {
|
3990
|
+
stroke.dashStyle = options.dashArray.replace(/ *, */g, ' ');
|
3991
|
+
} else {
|
3992
|
+
stroke.dashStyle = '';
|
3993
|
+
}
|
3430
3994
|
} else if (stroke) {
|
3431
3995
|
container.removeChild(stroke);
|
3432
3996
|
this._stroke = null;
|
@@ -3483,6 +4047,45 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path :
|
|
3483
4047
|
SVG: false
|
3484
4048
|
},
|
3485
4049
|
|
4050
|
+
redraw: function () {
|
4051
|
+
if (this._map) {
|
4052
|
+
this.projectLatlngs();
|
4053
|
+
this._requestUpdate();
|
4054
|
+
}
|
4055
|
+
return this;
|
4056
|
+
},
|
4057
|
+
|
4058
|
+
setStyle: function (style) {
|
4059
|
+
L.Util.setOptions(this, style);
|
4060
|
+
|
4061
|
+
if (this._map) {
|
4062
|
+
this._updateStyle();
|
4063
|
+
this._requestUpdate();
|
4064
|
+
}
|
4065
|
+
return this;
|
4066
|
+
},
|
4067
|
+
|
4068
|
+
onRemove: function (map) {
|
4069
|
+
map
|
4070
|
+
.off('viewreset', this.projectLatlngs, this)
|
4071
|
+
.off('moveend', this._updatePath, this);
|
4072
|
+
|
4073
|
+
this._requestUpdate();
|
4074
|
+
|
4075
|
+
this._map = null;
|
4076
|
+
},
|
4077
|
+
|
4078
|
+
_requestUpdate: function () {
|
4079
|
+
if (this._map) {
|
4080
|
+
L.Util.cancelAnimFrame(this._fireMapMoveEnd);
|
4081
|
+
this._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map);
|
4082
|
+
}
|
4083
|
+
},
|
4084
|
+
|
4085
|
+
_fireMapMoveEnd: function () {
|
4086
|
+
this.fire('moveend');
|
4087
|
+
},
|
4088
|
+
|
3486
4089
|
_initElements: function () {
|
3487
4090
|
this._map._initPathRoot();
|
3488
4091
|
this._ctx = this._map._canvasCtx;
|
@@ -3564,14 +4167,7 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path :
|
|
3564
4167
|
if (this._containsPoint(e.layerPoint)) {
|
3565
4168
|
this.fire('click', e);
|
3566
4169
|
}
|
3567
|
-
}
|
3568
|
-
|
3569
|
-
onRemove: function (map) {
|
3570
|
-
map
|
3571
|
-
.off('viewreset', this._projectLatlngs, this)
|
3572
|
-
.off('moveend', this._updatePath, this)
|
3573
|
-
.fire('moveend');
|
3574
|
-
}
|
4170
|
+
}
|
3575
4171
|
});
|
3576
4172
|
|
3577
4173
|
L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : {
|
@@ -3659,7 +4255,7 @@ L.LineUtil = {
|
|
3659
4255
|
_simplifyDP: function (points, sqTolerance) {
|
3660
4256
|
|
3661
4257
|
var len = points.length,
|
3662
|
-
ArrayConstructor = typeof Uint8Array !==
|
4258
|
+
ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,
|
3663
4259
|
markers = new ArrayConstructor(len);
|
3664
4260
|
|
3665
4261
|
markers[0] = markers[len - 1] = 1;
|
@@ -3830,7 +4426,8 @@ L.LineUtil = {
|
|
3830
4426
|
L.Polyline = L.Path.extend({
|
3831
4427
|
initialize: function (latlngs, options) {
|
3832
4428
|
L.Path.prototype.initialize.call(this, options);
|
3833
|
-
|
4429
|
+
|
4430
|
+
this._latlngs = this._convertLatLngs(latlngs);
|
3834
4431
|
|
3835
4432
|
// TODO refactor: move to Polyline.Edit.js
|
3836
4433
|
if (L.Handler.PolyEdit) {
|
@@ -3869,17 +4466,18 @@ L.Polyline = L.Path.extend({
|
|
3869
4466
|
},
|
3870
4467
|
|
3871
4468
|
setLatLngs: function (latlngs) {
|
3872
|
-
this._latlngs = latlngs;
|
4469
|
+
this._latlngs = this._convertLatLngs(latlngs);
|
3873
4470
|
return this.redraw();
|
3874
4471
|
},
|
3875
4472
|
|
3876
4473
|
addLatLng: function (latlng) {
|
3877
|
-
this._latlngs.push(latlng);
|
4474
|
+
this._latlngs.push(L.latLng(latlng));
|
3878
4475
|
return this.redraw();
|
3879
4476
|
},
|
3880
4477
|
|
3881
4478
|
spliceLatLngs: function (index, howMany) {
|
3882
4479
|
var removed = [].splice.apply(this._latlngs, arguments);
|
4480
|
+
this._convertLatLngs(this._latlngs);
|
3883
4481
|
this.redraw();
|
3884
4482
|
return removed;
|
3885
4483
|
},
|
@@ -3931,6 +4529,17 @@ L.Polyline = L.Path.extend({
|
|
3931
4529
|
L.Path.prototype.onRemove.call(this, map);
|
3932
4530
|
},
|
3933
4531
|
|
4532
|
+
_convertLatLngs: function (latlngs) {
|
4533
|
+
var i, len;
|
4534
|
+
for (i = 0, len = latlngs.length; i < len; i++) {
|
4535
|
+
if (latlngs[i] instanceof Array && typeof latlngs[i][0] !== 'number') {
|
4536
|
+
return;
|
4537
|
+
}
|
4538
|
+
latlngs[i] = L.latLng(latlngs[i]);
|
4539
|
+
}
|
4540
|
+
return latlngs;
|
4541
|
+
},
|
4542
|
+
|
3934
4543
|
_initEvents: function () {
|
3935
4544
|
L.Path.prototype._initEvents.call(this);
|
3936
4545
|
},
|
@@ -3992,6 +4601,8 @@ L.Polyline = L.Path.extend({
|
|
3992
4601
|
},
|
3993
4602
|
|
3994
4603
|
_updatePath: function () {
|
4604
|
+
if (!this._map) { return; }
|
4605
|
+
|
3995
4606
|
this._clipPoints();
|
3996
4607
|
this._simplifyPoints();
|
3997
4608
|
|
@@ -3999,6 +4610,10 @@ L.Polyline = L.Path.extend({
|
|
3999
4610
|
}
|
4000
4611
|
});
|
4001
4612
|
|
4613
|
+
L.polyline = function (latlngs, options) {
|
4614
|
+
return new L.Polyline(latlngs, options);
|
4615
|
+
};
|
4616
|
+
|
4002
4617
|
|
4003
4618
|
/*
|
4004
4619
|
* L.PolyUtil contains utilify functions for polygons (clipping, etc.).
|
@@ -4073,8 +4688,8 @@ L.Polygon = L.Polyline.extend({
|
|
4073
4688
|
initialize: function (latlngs, options) {
|
4074
4689
|
L.Polyline.prototype.initialize.call(this, latlngs, options);
|
4075
4690
|
|
4076
|
-
if (latlngs && (latlngs[0] instanceof Array)) {
|
4077
|
-
this._latlngs = latlngs[0];
|
4691
|
+
if (latlngs && (latlngs[0] instanceof Array) && (typeof latlngs[0][0] !== 'number')) {
|
4692
|
+
this._latlngs = this._convertLatLngs(latlngs[0]);
|
4078
4693
|
this._holes = latlngs.slice(1);
|
4079
4694
|
}
|
4080
4695
|
},
|
@@ -4126,6 +4741,10 @@ L.Polygon = L.Polyline.extend({
|
|
4126
4741
|
}
|
4127
4742
|
});
|
4128
4743
|
|
4744
|
+
L.polygon = function (latlngs, options) {
|
4745
|
+
return new L.Polygon(latlngs, options);
|
4746
|
+
};
|
4747
|
+
|
4129
4748
|
|
4130
4749
|
/*
|
4131
4750
|
* Contains L.MultiPolyline and L.MultiPolygon layers.
|
@@ -4143,7 +4762,7 @@ L.Polygon = L.Polyline.extend({
|
|
4143
4762
|
setLatLngs: function (latlngs) {
|
4144
4763
|
var i = 0, len = latlngs.length;
|
4145
4764
|
|
4146
|
-
this.
|
4765
|
+
this.eachLayer(function (layer) {
|
4147
4766
|
if (i < len) {
|
4148
4767
|
layer.setLatLngs(latlngs[i++]);
|
4149
4768
|
} else {
|
@@ -4162,6 +4781,14 @@ L.Polygon = L.Polyline.extend({
|
|
4162
4781
|
|
4163
4782
|
L.MultiPolyline = createMulti(L.Polyline);
|
4164
4783
|
L.MultiPolygon = createMulti(L.Polygon);
|
4784
|
+
|
4785
|
+
L.multiPolyline = function (latlngs, options) {
|
4786
|
+
return new L.MultiPolyline(latlngs, options);
|
4787
|
+
};
|
4788
|
+
|
4789
|
+
L.multiPolygon = function (latlngs, options) {
|
4790
|
+
return new L.MultiPolygon(latlngs, options);
|
4791
|
+
};
|
4165
4792
|
}());
|
4166
4793
|
|
4167
4794
|
|
@@ -4179,6 +4806,7 @@ L.Rectangle = L.Polygon.extend({
|
|
4179
4806
|
},
|
4180
4807
|
|
4181
4808
|
_boundsToLatLngs: function (latLngBounds) {
|
4809
|
+
latLngBounds = L.latLngBounds(latLngBounds);
|
4182
4810
|
return [
|
4183
4811
|
latLngBounds.getSouthWest(),
|
4184
4812
|
latLngBounds.getNorthWest(),
|
@@ -4189,6 +4817,10 @@ L.Rectangle = L.Polygon.extend({
|
|
4189
4817
|
}
|
4190
4818
|
});
|
4191
4819
|
|
4820
|
+
L.rectangle = function (latLngBounds, options) {
|
4821
|
+
return new L.Rectangle(latLngBounds, options);
|
4822
|
+
};
|
4823
|
+
|
4192
4824
|
|
4193
4825
|
/*
|
4194
4826
|
* L.Circle is a circle overlay (with a certain radius in meters).
|
@@ -4198,7 +4830,7 @@ L.Circle = L.Path.extend({
|
|
4198
4830
|
initialize: function (latlng, radius, options) {
|
4199
4831
|
L.Path.prototype.initialize.call(this, options);
|
4200
4832
|
|
4201
|
-
this._latlng = latlng;
|
4833
|
+
this._latlng = L.latLng(latlng);
|
4202
4834
|
this._mRadius = radius;
|
4203
4835
|
},
|
4204
4836
|
|
@@ -4207,7 +4839,7 @@ L.Circle = L.Path.extend({
|
|
4207
4839
|
},
|
4208
4840
|
|
4209
4841
|
setLatLng: function (latlng) {
|
4210
|
-
this._latlng = latlng;
|
4842
|
+
this._latlng = L.latLng(latlng);
|
4211
4843
|
return this.redraw();
|
4212
4844
|
},
|
4213
4845
|
|
@@ -4231,9 +4863,8 @@ L.Circle = L.Path.extend({
|
|
4231
4863
|
point = map.project(this._latlng),
|
4232
4864
|
swPoint = new L.Point(point.x - delta, point.y + delta),
|
4233
4865
|
nePoint = new L.Point(point.x + delta, point.y - delta),
|
4234
|
-
|
4235
|
-
|
4236
|
-
ne = map.unproject(nePoint, zoom, true);
|
4866
|
+
sw = map.unproject(swPoint),
|
4867
|
+
ne = map.unproject(nePoint);
|
4237
4868
|
|
4238
4869
|
return new L.LatLngBounds(sw, ne);
|
4239
4870
|
},
|
@@ -4285,6 +4916,10 @@ L.Circle = L.Path.extend({
|
|
4285
4916
|
}
|
4286
4917
|
});
|
4287
4918
|
|
4919
|
+
L.circle = function (latlng, radius, options) {
|
4920
|
+
return new L.Circle(latlng, radius, options);
|
4921
|
+
};
|
4922
|
+
|
4288
4923
|
|
4289
4924
|
/*
|
4290
4925
|
* L.CircleMarker is a circle overlay with a permanent pixel radius.
|
@@ -4311,6 +4946,10 @@ L.CircleMarker = L.Circle.extend({
|
|
4311
4946
|
}
|
4312
4947
|
});
|
4313
4948
|
|
4949
|
+
L.circleMarker = function (latlng, options) {
|
4950
|
+
return new L.CircleMarker(latlng, options);
|
4951
|
+
};
|
4952
|
+
|
4314
4953
|
|
4315
4954
|
|
4316
4955
|
L.Polyline.include(!L.Path.CANVAS ? {} : {
|
@@ -4401,57 +5040,64 @@ L.GeoJSON = L.FeatureGroup.extend({
|
|
4401
5040
|
initialize: function (geojson, options) {
|
4402
5041
|
L.Util.setOptions(this, options);
|
4403
5042
|
|
4404
|
-
this._geojson = geojson;
|
4405
5043
|
this._layers = {};
|
4406
5044
|
|
4407
5045
|
if (geojson) {
|
4408
|
-
this.
|
5046
|
+
this.addData(geojson);
|
4409
5047
|
}
|
4410
5048
|
},
|
4411
5049
|
|
4412
|
-
|
4413
|
-
var features = geojson.features,
|
5050
|
+
addData: function (geojson) {
|
5051
|
+
var features = geojson instanceof Array ? geojson : geojson.features,
|
4414
5052
|
i, len;
|
4415
5053
|
|
4416
5054
|
if (features) {
|
4417
5055
|
for (i = 0, len = features.length; i < len; i++) {
|
4418
|
-
this.
|
5056
|
+
this.addData(features[i]);
|
4419
5057
|
}
|
4420
|
-
return;
|
5058
|
+
return this;
|
4421
5059
|
}
|
4422
5060
|
|
4423
|
-
var
|
4424
|
-
|
4425
|
-
layer = L.GeoJSON.geometryToLayer(geometry, this.options.pointToLayer);
|
5061
|
+
var options = this.options,
|
5062
|
+
style = options.style;
|
4426
5063
|
|
4427
|
-
|
4428
|
-
|
4429
|
-
|
4430
|
-
|
4431
|
-
|
4432
|
-
|
4433
|
-
|
4434
|
-
|
5064
|
+
if (options.filter && !options.filter(geojson)) { return; }
|
5065
|
+
|
5066
|
+
var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer);
|
5067
|
+
|
5068
|
+
if (style) {
|
5069
|
+
if (typeof style === 'function') {
|
5070
|
+
style = style(geojson);
|
5071
|
+
}
|
5072
|
+
if (layer.setStyle) {
|
5073
|
+
layer.setStyle(style);
|
5074
|
+
}
|
5075
|
+
}
|
5076
|
+
|
5077
|
+
if (options.onEachFeature) {
|
5078
|
+
options.onEachFeature(geojson, layer);
|
5079
|
+
}
|
4435
5080
|
|
4436
|
-
this.addLayer(layer);
|
5081
|
+
return this.addLayer(layer);
|
4437
5082
|
}
|
4438
5083
|
});
|
4439
5084
|
|
4440
5085
|
L.Util.extend(L.GeoJSON, {
|
4441
|
-
geometryToLayer: function (
|
4442
|
-
var
|
5086
|
+
geometryToLayer: function (geojson, pointToLayer) {
|
5087
|
+
var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,
|
5088
|
+
coords = geometry.coordinates,
|
4443
5089
|
layers = [],
|
4444
5090
|
latlng, latlngs, i, len, layer;
|
4445
5091
|
|
4446
5092
|
switch (geometry.type) {
|
4447
5093
|
case 'Point':
|
4448
5094
|
latlng = this.coordsToLatLng(coords);
|
4449
|
-
return pointToLayer ? pointToLayer(latlng) : new L.Marker(latlng);
|
5095
|
+
return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);
|
4450
5096
|
|
4451
5097
|
case 'MultiPoint':
|
4452
5098
|
for (i = 0, len = coords.length; i < len; i++) {
|
4453
5099
|
latlng = this.coordsToLatLng(coords[i]);
|
4454
|
-
layer = pointToLayer ? pointToLayer(latlng) : new L.Marker(latlng);
|
5100
|
+
layer = pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);
|
4455
5101
|
layers.push(layer);
|
4456
5102
|
}
|
4457
5103
|
return new L.FeatureGroup(layers);
|
@@ -4500,6 +5146,7 @@ L.Util.extend(L.GeoJSON, {
|
|
4500
5146
|
latlng = levelsDeep ?
|
4501
5147
|
this.coordsToLatLngs(coords[i], levelsDeep - 1, reverse) :
|
4502
5148
|
this.coordsToLatLng(coords[i], reverse);
|
5149
|
+
|
4503
5150
|
latlngs.push(latlng);
|
4504
5151
|
}
|
4505
5152
|
|
@@ -4507,6 +5154,9 @@ L.Util.extend(L.GeoJSON, {
|
|
4507
5154
|
}
|
4508
5155
|
});
|
4509
5156
|
|
5157
|
+
L.geoJson = function (geojson, options) {
|
5158
|
+
return new L.GeoJSON(geojson, options);
|
5159
|
+
};
|
4510
5160
|
|
4511
5161
|
/*
|
4512
5162
|
* L.DomEvent contains functions for working with DOM events.
|
@@ -4514,37 +5164,43 @@ L.Util.extend(L.GeoJSON, {
|
|
4514
5164
|
|
4515
5165
|
L.DomEvent = {
|
4516
5166
|
/* inpired by John Resig, Dean Edwards and YUI addEvent implementations */
|
4517
|
-
addListener: function (
|
5167
|
+
addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object])
|
5168
|
+
|
4518
5169
|
var id = L.Util.stamp(fn),
|
4519
|
-
key = '_leaflet_' + type + id
|
5170
|
+
key = '_leaflet_' + type + id,
|
5171
|
+
handler, originalHandler, newType;
|
4520
5172
|
|
4521
|
-
if (obj[key]) {
|
4522
|
-
return this;
|
4523
|
-
}
|
5173
|
+
if (obj[key]) { return this; }
|
4524
5174
|
|
4525
|
-
|
5175
|
+
handler = function (e) {
|
4526
5176
|
return fn.call(context || obj, e || L.DomEvent._getEvent());
|
4527
5177
|
};
|
4528
5178
|
|
4529
5179
|
if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {
|
4530
|
-
this.addDoubleTapListener(obj, handler, id);
|
5180
|
+
return this.addDoubleTapListener(obj, handler, id);
|
5181
|
+
|
4531
5182
|
} else if ('addEventListener' in obj) {
|
5183
|
+
|
4532
5184
|
if (type === 'mousewheel') {
|
4533
5185
|
obj.addEventListener('DOMMouseScroll', handler, false);
|
4534
5186
|
obj.addEventListener(type, handler, false);
|
5187
|
+
|
4535
5188
|
} else if ((type === 'mouseenter') || (type === 'mouseleave')) {
|
4536
|
-
|
4537
|
-
|
5189
|
+
|
5190
|
+
originalHandler = handler;
|
5191
|
+
newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout');
|
5192
|
+
|
4538
5193
|
handler = function (e) {
|
4539
|
-
if (!L.DomEvent._checkMouse(obj, e)) {
|
4540
|
-
return;
|
4541
|
-
}
|
5194
|
+
if (!L.DomEvent._checkMouse(obj, e)) { return; }
|
4542
5195
|
return originalHandler(e);
|
4543
5196
|
};
|
5197
|
+
|
4544
5198
|
obj.addEventListener(newType, handler, false);
|
5199
|
+
|
4545
5200
|
} else {
|
4546
5201
|
obj.addEventListener(type, handler, false);
|
4547
5202
|
}
|
5203
|
+
|
4548
5204
|
} else if ('attachEvent' in obj) {
|
4549
5205
|
obj.attachEvent("on" + type, handler);
|
4550
5206
|
}
|
@@ -4554,21 +5210,23 @@ L.DomEvent = {
|
|
4554
5210
|
return this;
|
4555
5211
|
},
|
4556
5212
|
|
4557
|
-
removeListener: function (
|
5213
|
+
removeListener: function (obj, type, fn) { // (HTMLElement, String, Function)
|
5214
|
+
|
4558
5215
|
var id = L.Util.stamp(fn),
|
4559
5216
|
key = '_leaflet_' + type + id,
|
4560
5217
|
handler = obj[key];
|
4561
5218
|
|
4562
|
-
if (!handler) {
|
4563
|
-
return;
|
4564
|
-
}
|
5219
|
+
if (!handler) { return; }
|
4565
5220
|
|
4566
5221
|
if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {
|
4567
5222
|
this.removeDoubleTapListener(obj, id);
|
5223
|
+
|
4568
5224
|
} else if ('removeEventListener' in obj) {
|
5225
|
+
|
4569
5226
|
if (type === 'mousewheel') {
|
4570
5227
|
obj.removeEventListener('DOMMouseScroll', handler, false);
|
4571
5228
|
obj.removeEventListener(type, handler, false);
|
5229
|
+
|
4572
5230
|
} else if ((type === 'mouseenter') || (type === 'mouseleave')) {
|
4573
5231
|
obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false);
|
4574
5232
|
} else {
|
@@ -4577,47 +5235,14 @@ L.DomEvent = {
|
|
4577
5235
|
} else if ('detachEvent' in obj) {
|
4578
5236
|
obj.detachEvent("on" + type, handler);
|
4579
5237
|
}
|
5238
|
+
|
4580
5239
|
obj[key] = null;
|
4581
5240
|
|
4582
5241
|
return this;
|
4583
5242
|
},
|
4584
5243
|
|
4585
|
-
|
4586
|
-
var related = e.relatedTarget;
|
4587
|
-
|
4588
|
-
if (!related) {
|
4589
|
-
return true;
|
4590
|
-
}
|
4591
|
-
|
4592
|
-
try {
|
4593
|
-
while (related && (related !== el)) {
|
4594
|
-
related = related.parentNode;
|
4595
|
-
}
|
4596
|
-
} catch (err) {
|
4597
|
-
return false;
|
4598
|
-
}
|
4599
|
-
|
4600
|
-
return (related !== el);
|
4601
|
-
},
|
4602
|
-
|
4603
|
-
/*jshint noarg:false */ // evil magic for IE
|
4604
|
-
_getEvent: function () {
|
4605
|
-
var e = window.event;
|
4606
|
-
if (!e) {
|
4607
|
-
var caller = arguments.callee.caller;
|
4608
|
-
while (caller) {
|
4609
|
-
e = caller['arguments'][0];
|
4610
|
-
if (e && window.Event === e.constructor) {
|
4611
|
-
break;
|
4612
|
-
}
|
4613
|
-
caller = caller.caller;
|
4614
|
-
}
|
4615
|
-
}
|
4616
|
-
return e;
|
4617
|
-
},
|
4618
|
-
/*jshint noarg:false */
|
5244
|
+
stopPropagation: function (e) {
|
4619
5245
|
|
4620
|
-
stopPropagation: function (/*Event*/ e) {
|
4621
5246
|
if (e.stopPropagation) {
|
4622
5247
|
e.stopPropagation();
|
4623
5248
|
} else {
|
@@ -4626,14 +5251,18 @@ L.DomEvent = {
|
|
4626
5251
|
return this;
|
4627
5252
|
},
|
4628
5253
|
|
4629
|
-
disableClickPropagation: function (
|
5254
|
+
disableClickPropagation: function (el) {
|
5255
|
+
|
5256
|
+
var stop = L.DomEvent.stopPropagation;
|
5257
|
+
|
4630
5258
|
return L.DomEvent
|
4631
|
-
.addListener(el, L.Draggable.START,
|
4632
|
-
.addListener(el, 'click',
|
4633
|
-
.addListener(el, 'dblclick',
|
5259
|
+
.addListener(el, L.Draggable.START, stop)
|
5260
|
+
.addListener(el, 'click', stop)
|
5261
|
+
.addListener(el, 'dblclick', stop);
|
4634
5262
|
},
|
4635
5263
|
|
4636
|
-
preventDefault: function (
|
5264
|
+
preventDefault: function (e) {
|
5265
|
+
|
4637
5266
|
if (e.preventDefault) {
|
4638
5267
|
e.preventDefault();
|
4639
5268
|
} else {
|
@@ -4643,24 +5272,24 @@ L.DomEvent = {
|
|
4643
5272
|
},
|
4644
5273
|
|
4645
5274
|
stop: function (e) {
|
4646
|
-
return L.DomEvent
|
4647
|
-
.preventDefault(e)
|
4648
|
-
.stopPropagation(e);
|
5275
|
+
return L.DomEvent.preventDefault(e).stopPropagation(e);
|
4649
5276
|
},
|
4650
5277
|
|
4651
5278
|
getMousePosition: function (e, container) {
|
4652
|
-
|
4653
|
-
|
4654
|
-
|
4655
|
-
|
5279
|
+
|
5280
|
+
var body = document.body,
|
5281
|
+
docEl = document.documentElement,
|
5282
|
+
x = e.pageX ? e.pageX : e.clientX + body.scrollLeft + docEl.scrollLeft,
|
5283
|
+
y = e.pageY ? e.pageY : e.clientY + body.scrollTop + docEl.scrollTop,
|
4656
5284
|
pos = new L.Point(x, y);
|
4657
5285
|
|
4658
|
-
return (container ?
|
4659
|
-
pos.subtract(L.DomUtil.getViewportOffset(container)) : pos);
|
5286
|
+
return (container ? pos._subtract(L.DomUtil.getViewportOffset(container)) : pos);
|
4660
5287
|
},
|
4661
5288
|
|
4662
5289
|
getWheelDelta: function (e) {
|
5290
|
+
|
4663
5291
|
var delta = 0;
|
5292
|
+
|
4664
5293
|
if (e.wheelDelta) {
|
4665
5294
|
delta = e.wheelDelta / 120;
|
4666
5295
|
}
|
@@ -4668,10 +5297,46 @@ L.DomEvent = {
|
|
4668
5297
|
delta = -e.detail / 3;
|
4669
5298
|
}
|
4670
5299
|
return delta;
|
5300
|
+
},
|
5301
|
+
|
5302
|
+
// check if element really left/entered the event target (for mouseenter/mouseleave)
|
5303
|
+
_checkMouse: function (el, e) {
|
5304
|
+
|
5305
|
+
var related = e.relatedTarget;
|
5306
|
+
|
5307
|
+
if (!related) { return true; }
|
5308
|
+
|
5309
|
+
try {
|
5310
|
+
while (related && (related !== el)) {
|
5311
|
+
related = related.parentNode;
|
5312
|
+
}
|
5313
|
+
} catch (err) {
|
5314
|
+
return false;
|
5315
|
+
}
|
5316
|
+
return (related !== el);
|
5317
|
+
},
|
5318
|
+
|
5319
|
+
/*jshint noarg:false */
|
5320
|
+
_getEvent: function () { // evil magic for IE
|
5321
|
+
|
5322
|
+
var e = window.event;
|
5323
|
+
if (!e) {
|
5324
|
+
var caller = arguments.callee.caller;
|
5325
|
+
while (caller) {
|
5326
|
+
e = caller['arguments'][0];
|
5327
|
+
if (e && window.Event === e.constructor) {
|
5328
|
+
break;
|
5329
|
+
}
|
5330
|
+
caller = caller.caller;
|
5331
|
+
}
|
5332
|
+
}
|
5333
|
+
return e;
|
4671
5334
|
}
|
5335
|
+
/*jshint noarg:false */
|
4672
5336
|
};
|
4673
5337
|
|
4674
|
-
|
5338
|
+
L.DomEvent.on = L.DomEvent.addListener;
|
5339
|
+
L.DomEvent.off = L.DomEvent.removeListener;
|
4675
5340
|
|
4676
5341
|
/*
|
4677
5342
|
* L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.
|
@@ -4696,7 +5361,7 @@ L.Draggable = L.Class.extend({
|
|
4696
5361
|
if (this._enabled) {
|
4697
5362
|
return;
|
4698
5363
|
}
|
4699
|
-
L.DomEvent.
|
5364
|
+
L.DomEvent.on(this._dragStartTarget, L.Draggable.START, this._onDown, this);
|
4700
5365
|
this._enabled = true;
|
4701
5366
|
},
|
4702
5367
|
|
@@ -4704,7 +5369,7 @@ L.Draggable = L.Class.extend({
|
|
4704
5369
|
if (!this._enabled) {
|
4705
5370
|
return;
|
4706
5371
|
}
|
4707
|
-
L.DomEvent.
|
5372
|
+
L.DomEvent.off(this._dragStartTarget, L.Draggable.START, this._onDown);
|
4708
5373
|
this._enabled = false;
|
4709
5374
|
this._moved = false;
|
4710
5375
|
},
|
@@ -4727,7 +5392,7 @@ L.Draggable = L.Class.extend({
|
|
4727
5392
|
L.DomEvent.preventDefault(e);
|
4728
5393
|
|
4729
5394
|
if (L.Browser.touch && el.tagName.toLowerCase() === 'a') {
|
4730
|
-
el
|
5395
|
+
L.DomUtil.addClass(el, 'leaflet-active');
|
4731
5396
|
}
|
4732
5397
|
|
4733
5398
|
this._moved = false;
|
@@ -4743,8 +5408,8 @@ L.Draggable = L.Class.extend({
|
|
4743
5408
|
this._startPos = this._newPos = L.DomUtil.getPosition(this._element);
|
4744
5409
|
this._startPoint = new L.Point(first.clientX, first.clientY);
|
4745
5410
|
|
4746
|
-
L.DomEvent.
|
4747
|
-
L.DomEvent.
|
5411
|
+
L.DomEvent.on(document, L.Draggable.MOVE, this._onMove, this);
|
5412
|
+
L.DomEvent.on(document, L.Draggable.END, this._onUp, this);
|
4748
5413
|
},
|
4749
5414
|
|
4750
5415
|
_onMove: function (e) {
|
@@ -4783,7 +5448,7 @@ L.Draggable = L.Class.extend({
|
|
4783
5448
|
dist = (this._newPos && this._newPos.distanceTo(this._startPos)) || 0;
|
4784
5449
|
|
4785
5450
|
if (el.tagName.toLowerCase() === 'a') {
|
4786
|
-
|
5451
|
+
L.DomUtil.removeClass(el, 'leaflet-active');
|
4787
5452
|
}
|
4788
5453
|
|
4789
5454
|
if (dist < L.Draggable.TAP_TOLERANCE) {
|
@@ -4796,8 +5461,8 @@ L.Draggable = L.Class.extend({
|
|
4796
5461
|
this._restoreCursor();
|
4797
5462
|
}
|
4798
5463
|
|
4799
|
-
L.DomEvent.
|
4800
|
-
L.DomEvent.
|
5464
|
+
L.DomEvent.off(document, L.Draggable.MOVE, this._onMove);
|
5465
|
+
L.DomEvent.off(document, L.Draggable.END, this._onUp);
|
4801
5466
|
|
4802
5467
|
if (this._moved) {
|
4803
5468
|
// ensure drag is not fired after dragend
|
@@ -4809,11 +5474,11 @@ L.Draggable = L.Class.extend({
|
|
4809
5474
|
},
|
4810
5475
|
|
4811
5476
|
_setMovingCursor: function () {
|
4812
|
-
document.body
|
5477
|
+
L.DomUtil.addClass(document.body, 'leaflet-dragging');
|
4813
5478
|
},
|
4814
5479
|
|
4815
5480
|
_restoreCursor: function () {
|
4816
|
-
|
5481
|
+
L.DomUtil.removeClass(document.body, 'leaflet-dragging');
|
4817
5482
|
},
|
4818
5483
|
|
4819
5484
|
_simulateEvent: function (type, e) {
|
@@ -4840,17 +5505,15 @@ L.Handler = L.Class.extend({
|
|
4840
5505
|
},
|
4841
5506
|
|
4842
5507
|
enable: function () {
|
4843
|
-
if (this._enabled) {
|
4844
|
-
|
4845
|
-
}
|
5508
|
+
if (this._enabled) { return; }
|
5509
|
+
|
4846
5510
|
this._enabled = true;
|
4847
5511
|
this.addHooks();
|
4848
5512
|
},
|
4849
5513
|
|
4850
5514
|
disable: function () {
|
4851
|
-
if (!this._enabled) {
|
4852
|
-
|
4853
|
-
}
|
5515
|
+
if (!this._enabled) { return; }
|
5516
|
+
|
4854
5517
|
this._enabled = false;
|
4855
5518
|
this.removeHooks();
|
4856
5519
|
},
|
@@ -4868,14 +5531,13 @@ L.Handler = L.Class.extend({
|
|
4868
5531
|
L.Map.mergeOptions({
|
4869
5532
|
dragging: true,
|
4870
5533
|
|
4871
|
-
inertia: !L.Browser.
|
4872
|
-
inertiaDeceleration:
|
4873
|
-
inertiaMaxSpeed:
|
4874
|
-
inertiaThreshold:
|
5534
|
+
inertia: !L.Browser.android23,
|
5535
|
+
inertiaDeceleration: 3000, // px/s^2
|
5536
|
+
inertiaMaxSpeed: 1500, // px/s
|
5537
|
+
inertiaThreshold: L.Browser.touch ? 32 : 14, // ms
|
4875
5538
|
|
4876
5539
|
// TODO refactor, move to CRS
|
4877
|
-
worldCopyJump: true
|
4878
|
-
continuousWorld: false
|
5540
|
+
worldCopyJump: true
|
4879
5541
|
});
|
4880
5542
|
|
4881
5543
|
L.Map.Drag = L.Handler.extend({
|
@@ -4883,14 +5545,15 @@ L.Map.Drag = L.Handler.extend({
|
|
4883
5545
|
if (!this._draggable) {
|
4884
5546
|
this._draggable = new L.Draggable(this._map._mapPane, this._map._container);
|
4885
5547
|
|
4886
|
-
this._draggable
|
4887
|
-
|
4888
|
-
|
4889
|
-
|
5548
|
+
this._draggable.on({
|
5549
|
+
'dragstart': this._onDragStart,
|
5550
|
+
'drag': this._onDrag,
|
5551
|
+
'dragend': this._onDragEnd
|
5552
|
+
}, this);
|
4890
5553
|
|
4891
5554
|
var options = this._map.options;
|
4892
5555
|
|
4893
|
-
if (options.worldCopyJump
|
5556
|
+
if (options.worldCopyJump) {
|
4894
5557
|
this._draggable.on('predrag', this._onPreDrag, this);
|
4895
5558
|
this._map.on('viewreset', this._onViewReset, this);
|
4896
5559
|
}
|
@@ -4946,14 +5609,16 @@ L.Map.Drag = L.Handler.extend({
|
|
4946
5609
|
var pxCenter = this._map.getSize().divideBy(2),
|
4947
5610
|
pxWorldCenter = this._map.latLngToLayerPoint(new L.LatLng(0, 0));
|
4948
5611
|
|
4949
|
-
this._initialWorldOffset = pxWorldCenter.subtract(pxCenter);
|
5612
|
+
this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;
|
5613
|
+
this._worldWidth = this._map.project(new L.LatLng(0, 180)).x;
|
4950
5614
|
},
|
4951
5615
|
|
4952
5616
|
_onPreDrag: function () {
|
5617
|
+
// TODO refactor to be able to adjust map pane position after zoom
|
4953
5618
|
var map = this._map,
|
4954
|
-
worldWidth =
|
5619
|
+
worldWidth = this._worldWidth,
|
4955
5620
|
halfWidth = Math.round(worldWidth / 2),
|
4956
|
-
dx = this._initialWorldOffset
|
5621
|
+
dx = this._initialWorldOffset,
|
4957
5622
|
x = this._draggable._newPos.x,
|
4958
5623
|
newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,
|
4959
5624
|
newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,
|
@@ -4969,7 +5634,7 @@ L.Map.Drag = L.Handler.extend({
|
|
4969
5634
|
|
4970
5635
|
noInertia = !options.inertia ||
|
4971
5636
|
delay > options.inertiaThreshold ||
|
4972
|
-
|
5637
|
+
this._positions[0] === undefined;
|
4973
5638
|
|
4974
5639
|
if (noInertia) {
|
4975
5640
|
map.fire('moveend');
|
@@ -5013,6 +5678,7 @@ L.Map.Drag = L.Handler.extend({
|
|
5013
5678
|
|
5014
5679
|
L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);
|
5015
5680
|
|
5681
|
+
|
5016
5682
|
/*
|
5017
5683
|
* L.Handler.DoubleClickZoom is used internally by L.Map to add double-click zooming.
|
5018
5684
|
*/
|
@@ -5047,12 +5713,12 @@ L.Map.mergeOptions({
|
|
5047
5713
|
|
5048
5714
|
L.Map.ScrollWheelZoom = L.Handler.extend({
|
5049
5715
|
addHooks: function () {
|
5050
|
-
L.DomEvent.
|
5716
|
+
L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);
|
5051
5717
|
this._delta = 0;
|
5052
5718
|
},
|
5053
5719
|
|
5054
5720
|
removeHooks: function () {
|
5055
|
-
L.DomEvent.
|
5721
|
+
L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll);
|
5056
5722
|
},
|
5057
5723
|
|
5058
5724
|
_onWheelScroll: function (e) {
|
@@ -5062,7 +5728,7 @@ L.Map.ScrollWheelZoom = L.Handler.extend({
|
|
5062
5728
|
this._lastMousePos = this._map.mouseEventToContainerPoint(e);
|
5063
5729
|
|
5064
5730
|
clearTimeout(this._timer);
|
5065
|
-
this._timer = setTimeout(L.Util.bind(this._performZoom, this),
|
5731
|
+
this._timer = setTimeout(L.Util.bind(this._performZoom, this), 40);
|
5066
5732
|
|
5067
5733
|
L.DomEvent.preventDefault(e);
|
5068
5734
|
},
|
@@ -5079,25 +5745,26 @@ L.Map.ScrollWheelZoom = L.Handler.extend({
|
|
5079
5745
|
|
5080
5746
|
if (!delta) { return; }
|
5081
5747
|
|
5082
|
-
var
|
5083
|
-
|
5748
|
+
var newZoom = zoom + delta,
|
5749
|
+
newCenter = this._getCenterForScrollWheelZoom(this._lastMousePos, newZoom);
|
5084
5750
|
|
5085
5751
|
map.setView(newCenter, newZoom);
|
5086
5752
|
},
|
5087
5753
|
|
5088
|
-
_getCenterForScrollWheelZoom: function (mousePos,
|
5754
|
+
_getCenterForScrollWheelZoom: function (mousePos, newZoom) {
|
5089
5755
|
var map = this._map,
|
5090
|
-
|
5756
|
+
scale = map.getZoomScale(newZoom),
|
5091
5757
|
viewHalf = map.getSize().divideBy(2),
|
5092
|
-
centerOffset = mousePos.subtract(viewHalf).multiplyBy(1 -
|
5093
|
-
newCenterPoint =
|
5758
|
+
centerOffset = mousePos.subtract(viewHalf).multiplyBy(1 - 1 / scale),
|
5759
|
+
newCenterPoint = map._getTopLeftPoint().add(viewHalf).add(centerOffset);
|
5094
5760
|
|
5095
|
-
return map.unproject(newCenterPoint
|
5761
|
+
return map.unproject(newCenterPoint);
|
5096
5762
|
}
|
5097
5763
|
});
|
5098
5764
|
|
5099
5765
|
L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);
|
5100
5766
|
|
5767
|
+
|
5101
5768
|
L.Util.extend(L.DomEvent, {
|
5102
5769
|
// inspired by Zepto touch code by Thomas Fuchs
|
5103
5770
|
addDoubleTapListener: function (obj, handler, id) {
|
@@ -5133,12 +5800,14 @@ L.Util.extend(L.DomEvent, {
|
|
5133
5800
|
|
5134
5801
|
obj.addEventListener(touchstart, onTouchStart, false);
|
5135
5802
|
obj.addEventListener(touchend, onTouchEnd, false);
|
5803
|
+
return this;
|
5136
5804
|
},
|
5137
5805
|
|
5138
5806
|
removeDoubleTapListener: function (obj, id) {
|
5139
5807
|
var pre = '_leaflet_';
|
5140
5808
|
obj.removeEventListener(obj, obj[pre + 'touchstart' + id], false);
|
5141
5809
|
obj.removeEventListener(obj, obj[pre + 'touchend' + id], false);
|
5810
|
+
return this;
|
5142
5811
|
}
|
5143
5812
|
});
|
5144
5813
|
|
@@ -5148,16 +5817,16 @@ L.Util.extend(L.DomEvent, {
|
|
5148
5817
|
*/
|
5149
5818
|
|
5150
5819
|
L.Map.mergeOptions({
|
5151
|
-
touchZoom: L.Browser.touch && !L.Browser.
|
5820
|
+
touchZoom: L.Browser.touch && !L.Browser.android23
|
5152
5821
|
});
|
5153
5822
|
|
5154
5823
|
L.Map.TouchZoom = L.Handler.extend({
|
5155
5824
|
addHooks: function () {
|
5156
|
-
L.DomEvent.
|
5825
|
+
L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);
|
5157
5826
|
},
|
5158
5827
|
|
5159
5828
|
removeHooks: function () {
|
5160
|
-
L.DomEvent.
|
5829
|
+
L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);
|
5161
5830
|
},
|
5162
5831
|
|
5163
5832
|
_onTouchStart: function (e) {
|
@@ -5167,7 +5836,7 @@ L.Map.TouchZoom = L.Handler.extend({
|
|
5167
5836
|
|
5168
5837
|
var p1 = map.mouseEventToLayerPoint(e.touches[0]),
|
5169
5838
|
p2 = map.mouseEventToLayerPoint(e.touches[1]),
|
5170
|
-
viewCenter = map.
|
5839
|
+
viewCenter = map._getCenterLayerPoint();
|
5171
5840
|
|
5172
5841
|
this._startCenter = p1.add(p2).divideBy(2, true);
|
5173
5842
|
this._startDist = p1.distanceTo(p2);
|
@@ -5178,8 +5847,8 @@ L.Map.TouchZoom = L.Handler.extend({
|
|
5178
5847
|
this._centerOffset = viewCenter.subtract(this._startCenter);
|
5179
5848
|
|
5180
5849
|
L.DomEvent
|
5181
|
-
.
|
5182
|
-
.
|
5850
|
+
.on(document, 'touchmove', this._onTouchMove, this)
|
5851
|
+
.on(document, 'touchend', this._onTouchEnd, this);
|
5183
5852
|
|
5184
5853
|
L.DomEvent.preventDefault(e);
|
5185
5854
|
},
|
@@ -5197,14 +5866,8 @@ L.Map.TouchZoom = L.Handler.extend({
|
|
5197
5866
|
|
5198
5867
|
if (this._scale === 1) { return; }
|
5199
5868
|
|
5200
|
-
var zoom = this._map._zoom + Math.log(this._scale) / Math.LN2;
|
5201
|
-
|
5202
|
-
var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale),
|
5203
|
-
centerPoint = this._map.getPixelOrigin().add(this._startCenter).add(centerOffset),
|
5204
|
-
center = this._map.unproject(centerPoint);
|
5205
|
-
|
5206
5869
|
if (!this._moved) {
|
5207
|
-
map._mapPane
|
5870
|
+
L.DomUtil.addClass(map._mapPane, 'leaflet-zoom-anim leaflet-touching');
|
5208
5871
|
|
5209
5872
|
map
|
5210
5873
|
.fire('movestart')
|
@@ -5214,9 +5877,20 @@ L.Map.TouchZoom = L.Handler.extend({
|
|
5214
5877
|
this._moved = true;
|
5215
5878
|
}
|
5216
5879
|
|
5880
|
+
L.Util.cancelAnimFrame(this._animRequest);
|
5881
|
+
this._animRequest = L.Util.requestAnimFrame(this._updateOnMove, this, true, this._map._container);
|
5882
|
+
|
5883
|
+
L.DomEvent.preventDefault(e);
|
5884
|
+
},
|
5885
|
+
|
5886
|
+
_updateOnMove: function () {
|
5887
|
+
var map = this._map,
|
5888
|
+
origin = this._getScaleOrigin(),
|
5889
|
+
center = map.layerPointToLatLng(origin);
|
5890
|
+
|
5217
5891
|
map.fire('zoomanim', {
|
5218
5892
|
center: center,
|
5219
|
-
zoom:
|
5893
|
+
zoom: map.getScaleZoom(this._scale)
|
5220
5894
|
});
|
5221
5895
|
|
5222
5896
|
// Used 2 translates instead of transform-origin because of a very strange bug -
|
@@ -5224,42 +5898,46 @@ L.Map.TouchZoom = L.Handler.extend({
|
|
5224
5898
|
|
5225
5899
|
map._tileBg.style[L.DomUtil.TRANSFORM] =
|
5226
5900
|
L.DomUtil.getTranslateString(this._delta) + ' ' +
|
5227
|
-
|
5228
|
-
|
5229
|
-
L.DomEvent.preventDefault(e);
|
5901
|
+
L.DomUtil.getScaleString(this._scale, this._startCenter);
|
5230
5902
|
},
|
5231
5903
|
|
5232
5904
|
_onTouchEnd: function (e) {
|
5233
5905
|
if (!this._moved || !this._zooming) { return; }
|
5234
5906
|
|
5907
|
+
var map = this._map;
|
5908
|
+
|
5235
5909
|
this._zooming = false;
|
5236
|
-
|
5910
|
+
L.DomUtil.removeClass(map._mapPane, 'leaflet-touching');
|
5237
5911
|
|
5238
5912
|
L.DomEvent
|
5239
|
-
.
|
5240
|
-
.
|
5913
|
+
.off(document, 'touchmove', this._onTouchMove)
|
5914
|
+
.off(document, 'touchend', this._onTouchEnd);
|
5241
5915
|
|
5242
|
-
var
|
5243
|
-
|
5244
|
-
center = this._map.unproject(centerPoint),
|
5916
|
+
var origin = this._getScaleOrigin(),
|
5917
|
+
center = map.layerPointToLatLng(origin),
|
5245
5918
|
|
5246
|
-
oldZoom =
|
5247
|
-
floatZoomDelta =
|
5919
|
+
oldZoom = map.getZoom(),
|
5920
|
+
floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom,
|
5248
5921
|
roundZoomDelta = (floatZoomDelta > 0 ? Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)),
|
5249
|
-
zoom =
|
5250
|
-
finalScale = Math.pow(2, zoom - oldZoom);
|
5922
|
+
zoom = map._limitZoom(oldZoom + roundZoomDelta);
|
5251
5923
|
|
5252
|
-
|
5924
|
+
map.fire('zoomanim', {
|
5253
5925
|
center: center,
|
5254
5926
|
zoom: zoom
|
5255
5927
|
});
|
5256
5928
|
|
5257
|
-
|
5929
|
+
map._runAnimation(center, zoom, map.getZoomScale(zoom) / this._scale, origin, true);
|
5930
|
+
},
|
5931
|
+
|
5932
|
+
_getScaleOrigin: function () {
|
5933
|
+
var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale);
|
5934
|
+
return this._startCenter.add(centerOffset);
|
5258
5935
|
}
|
5259
5936
|
});
|
5260
5937
|
|
5261
5938
|
L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);
|
5262
5939
|
|
5940
|
+
|
5263
5941
|
/*
|
5264
5942
|
* L.Handler.ShiftDragZoom is used internally by L.Map to add shift-drag zoom (zoom to a selected bounding box).
|
5265
5943
|
*/
|
@@ -5276,11 +5954,11 @@ L.Map.BoxZoom = L.Handler.extend({
|
|
5276
5954
|
},
|
5277
5955
|
|
5278
5956
|
addHooks: function () {
|
5279
|
-
L.DomEvent.
|
5957
|
+
L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);
|
5280
5958
|
},
|
5281
5959
|
|
5282
5960
|
removeHooks: function () {
|
5283
|
-
L.DomEvent.
|
5961
|
+
L.DomEvent.off(this._container, 'mousedown', this._onMouseDown);
|
5284
5962
|
},
|
5285
5963
|
|
5286
5964
|
_onMouseDown: function (e) {
|
@@ -5297,8 +5975,8 @@ L.Map.BoxZoom = L.Handler.extend({
|
|
5297
5975
|
this._container.style.cursor = 'crosshair';
|
5298
5976
|
|
5299
5977
|
L.DomEvent
|
5300
|
-
.
|
5301
|
-
.
|
5978
|
+
.on(document, 'mousemove', this._onMouseMove, this)
|
5979
|
+
.on(document, 'mouseup', this._onMouseUp, this)
|
5302
5980
|
.preventDefault(e);
|
5303
5981
|
|
5304
5982
|
this._map.fire("boxzoomstart");
|
@@ -5329,8 +6007,8 @@ L.Map.BoxZoom = L.Handler.extend({
|
|
5329
6007
|
L.DomUtil.enableTextSelection();
|
5330
6008
|
|
5331
6009
|
L.DomEvent
|
5332
|
-
.
|
5333
|
-
.
|
6010
|
+
.off(document, 'mousemove', this._onMouseMove)
|
6011
|
+
.off(document, 'mouseup', this._onMouseUp);
|
5334
6012
|
|
5335
6013
|
var map = this._map,
|
5336
6014
|
layerPoint = map.mouseEventToLayerPoint(e);
|
@@ -5350,6 +6028,139 @@ L.Map.BoxZoom = L.Handler.extend({
|
|
5350
6028
|
L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);
|
5351
6029
|
|
5352
6030
|
|
6031
|
+
L.Map.mergeOptions({
|
6032
|
+
keyboard: true,
|
6033
|
+
keyboardPanOffset: 80,
|
6034
|
+
keyboardZoomOffset: 1
|
6035
|
+
});
|
6036
|
+
|
6037
|
+
L.Map.Keyboard = L.Handler.extend({
|
6038
|
+
|
6039
|
+
// list of e.keyCode values for particular actions
|
6040
|
+
keyCodes: {
|
6041
|
+
left: [37],
|
6042
|
+
right: [39],
|
6043
|
+
down: [40],
|
6044
|
+
up: [38],
|
6045
|
+
zoomIn: [187, 61, 107],
|
6046
|
+
zoomOut: [189, 109, 0]
|
6047
|
+
},
|
6048
|
+
|
6049
|
+
initialize: function (map) {
|
6050
|
+
this._map = map;
|
6051
|
+
|
6052
|
+
this._setPanOffset(map.options.keyboardPanOffset);
|
6053
|
+
this._setZoomOffset(map.options.keyboardZoomOffset);
|
6054
|
+
},
|
6055
|
+
|
6056
|
+
addHooks: function () {
|
6057
|
+
var container = this._map._container;
|
6058
|
+
|
6059
|
+
// make the container focusable by tabbing
|
6060
|
+
if (container.tabIndex === -1) {
|
6061
|
+
container.tabIndex = "0";
|
6062
|
+
}
|
6063
|
+
|
6064
|
+
L.DomEvent
|
6065
|
+
.addListener(container, 'focus', this._onFocus, this)
|
6066
|
+
.addListener(container, 'blur', this._onBlur, this)
|
6067
|
+
.addListener(container, 'mousedown', this._onMouseDown, this);
|
6068
|
+
|
6069
|
+
this._map
|
6070
|
+
.on('focus', this._addHooks, this)
|
6071
|
+
.on('blur', this._removeHooks, this);
|
6072
|
+
},
|
6073
|
+
|
6074
|
+
removeHooks: function () {
|
6075
|
+
this._removeHooks();
|
6076
|
+
|
6077
|
+
var container = this._map._container;
|
6078
|
+
L.DomEvent
|
6079
|
+
.removeListener(container, 'focus', this._onFocus, this)
|
6080
|
+
.removeListener(container, 'blur', this._onBlur, this)
|
6081
|
+
.removeListener(container, 'mousedown', this._onMouseDown, this);
|
6082
|
+
|
6083
|
+
this._map
|
6084
|
+
.off('focus', this._addHooks, this)
|
6085
|
+
.off('blur', this._removeHooks, this);
|
6086
|
+
},
|
6087
|
+
|
6088
|
+
_onMouseDown: function () {
|
6089
|
+
if (!this._focused) {
|
6090
|
+
this._map._container.focus();
|
6091
|
+
}
|
6092
|
+
},
|
6093
|
+
|
6094
|
+
_onFocus: function () {
|
6095
|
+
this._focused = true;
|
6096
|
+
this._map.fire('focus');
|
6097
|
+
},
|
6098
|
+
|
6099
|
+
_onBlur: function () {
|
6100
|
+
this._focused = false;
|
6101
|
+
this._map.fire('blur');
|
6102
|
+
},
|
6103
|
+
|
6104
|
+
_setPanOffset: function (pan) {
|
6105
|
+
var keys = this._panKeys = {},
|
6106
|
+
codes = this.keyCodes,
|
6107
|
+
i, len;
|
6108
|
+
|
6109
|
+
for (i = 0, len = codes.left.length; i < len; i++) {
|
6110
|
+
keys[codes.left[i]] = [-1 * pan, 0];
|
6111
|
+
}
|
6112
|
+
for (i = 0, len = codes.right.length; i < len; i++) {
|
6113
|
+
keys[codes.right[i]] = [pan, 0];
|
6114
|
+
}
|
6115
|
+
for (i = 0, len = codes.down.length; i < len; i++) {
|
6116
|
+
keys[codes.down[i]] = [0, pan];
|
6117
|
+
}
|
6118
|
+
for (i = 0, len = codes.up.length; i < len; i++) {
|
6119
|
+
keys[codes.up[i]] = [0, -1 * pan];
|
6120
|
+
}
|
6121
|
+
},
|
6122
|
+
|
6123
|
+
_setZoomOffset: function (zoom) {
|
6124
|
+
var keys = this._zoomKeys = {},
|
6125
|
+
codes = this.keyCodes,
|
6126
|
+
i, len;
|
6127
|
+
|
6128
|
+
for (i = 0, len = codes.zoomIn.length; i < len; i++) {
|
6129
|
+
keys[codes.zoomIn[i]] = zoom;
|
6130
|
+
}
|
6131
|
+
for (i = 0, len = codes.zoomOut.length; i < len; i++) {
|
6132
|
+
keys[codes.zoomOut[i]] = -zoom;
|
6133
|
+
}
|
6134
|
+
},
|
6135
|
+
|
6136
|
+
_addHooks: function () {
|
6137
|
+
L.DomEvent.addListener(document, 'keydown', this._onKeyDown, this);
|
6138
|
+
},
|
6139
|
+
|
6140
|
+
_removeHooks: function () {
|
6141
|
+
L.DomEvent.removeListener(document, 'keydown', this._onKeyDown, this);
|
6142
|
+
},
|
6143
|
+
|
6144
|
+
_onKeyDown: function (e) {
|
6145
|
+
var key = e.keyCode;
|
6146
|
+
|
6147
|
+
if (this._panKeys.hasOwnProperty(key)) {
|
6148
|
+
this._map.panBy(this._panKeys[key]);
|
6149
|
+
|
6150
|
+
} else if (this._zoomKeys.hasOwnProperty(key)) {
|
6151
|
+
this._map.setZoom(this._map.getZoom() + this._zoomKeys[key]);
|
6152
|
+
|
6153
|
+
} else {
|
6154
|
+
return;
|
6155
|
+
}
|
6156
|
+
|
6157
|
+
L.DomEvent.stop(e);
|
6158
|
+
}
|
6159
|
+
});
|
6160
|
+
|
6161
|
+
L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);
|
6162
|
+
|
6163
|
+
|
5353
6164
|
/*
|
5354
6165
|
* L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.
|
5355
6166
|
*/
|
@@ -5542,7 +6353,7 @@ L.Handler.PolyEdit = L.Handler.extend({
|
|
5542
6353
|
},
|
5543
6354
|
|
5544
6355
|
_updateIndexes: function (index, delta) {
|
5545
|
-
this._markerGroup.
|
6356
|
+
this._markerGroup.eachLayer(function (marker) {
|
5546
6357
|
if (marker._index > index) {
|
5547
6358
|
marker._index += delta;
|
5548
6359
|
}
|
@@ -5645,6 +6456,8 @@ L.Control = L.Class.extend({
|
|
5645
6456
|
if (map) {
|
5646
6457
|
map.addControl(this);
|
5647
6458
|
}
|
6459
|
+
|
6460
|
+
return this;
|
5648
6461
|
},
|
5649
6462
|
|
5650
6463
|
addTo: function (map) {
|
@@ -5680,6 +6493,9 @@ L.Control = L.Class.extend({
|
|
5680
6493
|
}
|
5681
6494
|
});
|
5682
6495
|
|
6496
|
+
L.control = function (options) {
|
6497
|
+
return new L.Control(options);
|
6498
|
+
};
|
5683
6499
|
|
5684
6500
|
|
5685
6501
|
L.Map.include({
|
@@ -5735,9 +6551,10 @@ L.Control.Zoom = L.Control.extend({
|
|
5735
6551
|
link.title = title;
|
5736
6552
|
|
5737
6553
|
L.DomEvent
|
5738
|
-
.
|
5739
|
-
.
|
5740
|
-
.
|
6554
|
+
.on(link, 'click', L.DomEvent.stopPropagation)
|
6555
|
+
.on(link, 'click', L.DomEvent.preventDefault)
|
6556
|
+
.on(link, 'click', fn, context)
|
6557
|
+
.on(link, 'dblclick', L.DomEvent.stopPropagation);
|
5741
6558
|
|
5742
6559
|
return link;
|
5743
6560
|
}
|
@@ -5754,6 +6571,10 @@ L.Map.addInitHook(function () {
|
|
5754
6571
|
}
|
5755
6572
|
});
|
5756
6573
|
|
6574
|
+
L.control.zoom = function (options) {
|
6575
|
+
return new L.Control.Zoom(options);
|
6576
|
+
};
|
6577
|
+
|
5757
6578
|
L.Control.Attribution = L.Control.extend({
|
5758
6579
|
options: {
|
5759
6580
|
position: 'bottomright',
|
@@ -5789,6 +6610,7 @@ L.Control.Attribution = L.Control.extend({
|
|
5789
6610
|
setPrefix: function (prefix) {
|
5790
6611
|
this.options.prefix = prefix;
|
5791
6612
|
this._update();
|
6613
|
+
return this;
|
5792
6614
|
},
|
5793
6615
|
|
5794
6616
|
addAttribution: function (text) {
|
@@ -5800,6 +6622,8 @@ L.Control.Attribution = L.Control.extend({
|
|
5800
6622
|
this._attributions[text]++;
|
5801
6623
|
|
5802
6624
|
this._update();
|
6625
|
+
|
6626
|
+
return this;
|
5803
6627
|
},
|
5804
6628
|
|
5805
6629
|
removeAttribution: function (text) {
|
@@ -5807,6 +6631,8 @@ L.Control.Attribution = L.Control.extend({
|
|
5807
6631
|
|
5808
6632
|
this._attributions[text]--;
|
5809
6633
|
this._update();
|
6634
|
+
|
6635
|
+
return this;
|
5810
6636
|
},
|
5811
6637
|
|
5812
6638
|
_update: function () {
|
@@ -5829,7 +6655,7 @@ L.Control.Attribution = L.Control.extend({
|
|
5829
6655
|
prefixAndAttribs.push(attribs.join(', '));
|
5830
6656
|
}
|
5831
6657
|
|
5832
|
-
this._container.innerHTML = prefixAndAttribs.join('
|
6658
|
+
this._container.innerHTML = prefixAndAttribs.join(' — ');
|
5833
6659
|
},
|
5834
6660
|
|
5835
6661
|
_onLayerAdd: function (e) {
|
@@ -5855,6 +6681,11 @@ L.Map.addInitHook(function () {
|
|
5855
6681
|
}
|
5856
6682
|
});
|
5857
6683
|
|
6684
|
+
L.control.attribution = function (options) {
|
6685
|
+
return new L.Control.Attribution(options);
|
6686
|
+
};
|
6687
|
+
|
6688
|
+
|
5858
6689
|
L.Control.Scale = L.Control.extend({
|
5859
6690
|
options: {
|
5860
6691
|
position: 'bottomleft',
|
@@ -5871,12 +6702,7 @@ L.Control.Scale = L.Control.extend({
|
|
5871
6702
|
container = L.DomUtil.create('div', className),
|
5872
6703
|
options = this.options;
|
5873
6704
|
|
5874
|
-
|
5875
|
-
this._mScale = L.DomUtil.create('div', className + '-line', container);
|
5876
|
-
}
|
5877
|
-
if (options.imperial) {
|
5878
|
-
this._iScale = L.DomUtil.create('div', className + '-line', container);
|
5879
|
-
}
|
6705
|
+
this._addScales(options, className, container);
|
5880
6706
|
|
5881
6707
|
map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
|
5882
6708
|
this._update();
|
@@ -5888,21 +6714,33 @@ L.Control.Scale = L.Control.extend({
|
|
5888
6714
|
map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
|
5889
6715
|
},
|
5890
6716
|
|
6717
|
+
_addScales: function (options, className, container) {
|
6718
|
+
if (options.metric) {
|
6719
|
+
this._mScale = L.DomUtil.create('div', className + '-line', container);
|
6720
|
+
}
|
6721
|
+
if (options.imperial) {
|
6722
|
+
this._iScale = L.DomUtil.create('div', className + '-line', container);
|
6723
|
+
}
|
6724
|
+
},
|
6725
|
+
|
5891
6726
|
_update: function () {
|
5892
6727
|
var bounds = this._map.getBounds(),
|
5893
6728
|
centerLat = bounds.getCenter().lat,
|
5894
|
-
|
5895
|
-
|
5896
|
-
right = new L.LatLng(centerLat, bounds.getNorthEast().lng),
|
6729
|
+
halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),
|
6730
|
+
dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180,
|
5897
6731
|
|
5898
6732
|
size = this._map.getSize(),
|
5899
6733
|
options = this.options,
|
5900
|
-
|
6734
|
+
maxMeters = 0;
|
5901
6735
|
|
5902
6736
|
if (size.x > 0) {
|
5903
|
-
maxMeters =
|
6737
|
+
maxMeters = dist * (options.maxWidth / size.x);
|
5904
6738
|
}
|
5905
6739
|
|
6740
|
+
this._updateScales(options, maxMeters);
|
6741
|
+
},
|
6742
|
+
|
6743
|
+
_updateScales: function (options, maxMeters) {
|
5906
6744
|
if (options.metric && maxMeters) {
|
5907
6745
|
this._updateMetric(maxMeters);
|
5908
6746
|
}
|
@@ -5947,24 +6785,30 @@ L.Control.Scale = L.Control.extend({
|
|
5947
6785
|
var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),
|
5948
6786
|
d = num / pow10;
|
5949
6787
|
|
5950
|
-
d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 2 ? 2 : 1;
|
6788
|
+
d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1;
|
5951
6789
|
|
5952
6790
|
return pow10 * d;
|
5953
6791
|
}
|
5954
6792
|
});
|
5955
6793
|
|
6794
|
+
L.control.scale = function (options) {
|
6795
|
+
return new L.Control.Scale(options);
|
6796
|
+
};
|
6797
|
+
|
5956
6798
|
|
5957
6799
|
|
5958
6800
|
L.Control.Layers = L.Control.extend({
|
5959
6801
|
options: {
|
5960
6802
|
collapsed: true,
|
5961
|
-
position: 'topright'
|
6803
|
+
position: 'topright',
|
6804
|
+
autoZIndex: true
|
5962
6805
|
},
|
5963
6806
|
|
5964
6807
|
initialize: function (baseLayers, overlays, options) {
|
5965
6808
|
L.Util.setOptions(this, options);
|
5966
6809
|
|
5967
6810
|
this._layers = {};
|
6811
|
+
this._lastZIndex = 0;
|
5968
6812
|
|
5969
6813
|
for (var i in baseLayers) {
|
5970
6814
|
if (baseLayers.hasOwnProperty(i)) {
|
@@ -6012,15 +6856,15 @@ L.Control.Layers = L.Control.extend({
|
|
6012
6856
|
if (!L.Browser.touch) {
|
6013
6857
|
L.DomEvent.disableClickPropagation(container);
|
6014
6858
|
} else {
|
6015
|
-
L.DomEvent.
|
6859
|
+
L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation);
|
6016
6860
|
}
|
6017
6861
|
|
6018
6862
|
var form = this._form = L.DomUtil.create('form', className + '-list');
|
6019
6863
|
|
6020
6864
|
if (this.options.collapsed) {
|
6021
6865
|
L.DomEvent
|
6022
|
-
.
|
6023
|
-
.
|
6866
|
+
.on(container, 'mouseover', this._expand, this)
|
6867
|
+
.on(container, 'mouseout', this._collapse, this);
|
6024
6868
|
|
6025
6869
|
var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);
|
6026
6870
|
link.href = '#';
|
@@ -6028,12 +6872,12 @@ L.Control.Layers = L.Control.extend({
|
|
6028
6872
|
|
6029
6873
|
if (L.Browser.touch) {
|
6030
6874
|
L.DomEvent
|
6031
|
-
.
|
6032
|
-
.
|
6033
|
-
.
|
6875
|
+
.on(link, 'click', L.DomEvent.stopPropagation)
|
6876
|
+
.on(link, 'click', L.DomEvent.preventDefault)
|
6877
|
+
.on(link, 'click', this._expand, this);
|
6034
6878
|
}
|
6035
6879
|
else {
|
6036
|
-
L.DomEvent.
|
6880
|
+
L.DomEvent.on(link, 'focus', this._expand, this);
|
6037
6881
|
}
|
6038
6882
|
|
6039
6883
|
this._map.on('movestart', this._collapse, this);
|
@@ -6051,11 +6895,17 @@ L.Control.Layers = L.Control.extend({
|
|
6051
6895
|
|
6052
6896
|
_addLayer: function (layer, name, overlay) {
|
6053
6897
|
var id = L.Util.stamp(layer);
|
6898
|
+
|
6054
6899
|
this._layers[id] = {
|
6055
6900
|
layer: layer,
|
6056
6901
|
name: name,
|
6057
6902
|
overlay: overlay
|
6058
6903
|
};
|
6904
|
+
|
6905
|
+
if (this.options.autoZIndex && layer.setZIndex) {
|
6906
|
+
this._lastZIndex++;
|
6907
|
+
layer.setZIndex(this._lastZIndex);
|
6908
|
+
}
|
6059
6909
|
},
|
6060
6910
|
|
6061
6911
|
_update: function () {
|
@@ -6081,18 +6931,37 @@ L.Control.Layers = L.Control.extend({
|
|
6081
6931
|
this._separator.style.display = (overlaysPresent && baseLayersPresent ? '' : 'none');
|
6082
6932
|
},
|
6083
6933
|
|
6084
|
-
|
6085
|
-
|
6934
|
+
// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)
|
6935
|
+
_createRadioElement: function (name, checked) {
|
6936
|
+
|
6937
|
+
var radioHtml = '<input type="radio" name="' + name + '"';
|
6938
|
+
if (checked) {
|
6939
|
+
radioHtml += ' checked="checked"';
|
6940
|
+
}
|
6941
|
+
radioHtml += '/>';
|
6942
|
+
|
6943
|
+
var radioFragment = document.createElement('div');
|
6944
|
+
radioFragment.innerHTML = radioHtml;
|
6945
|
+
|
6946
|
+
return radioFragment.firstChild;
|
6947
|
+
},
|
6948
|
+
|
6949
|
+
_addItem: function (obj) {
|
6950
|
+
var label = document.createElement('label'),
|
6951
|
+
input,
|
6952
|
+
checked = this._map.hasLayer(obj.layer);
|
6086
6953
|
|
6087
|
-
|
6088
|
-
|
6089
|
-
input.
|
6954
|
+
if (obj.overlay) {
|
6955
|
+
input = document.createElement('input');
|
6956
|
+
input.type = 'checkbox';
|
6957
|
+
input.defaultChecked = checked;
|
6958
|
+
} else {
|
6959
|
+
input = this._createRadioElement('leaflet-base-layers', checked);
|
6090
6960
|
}
|
6091
|
-
|
6961
|
+
|
6092
6962
|
input.layerId = L.Util.stamp(obj.layer);
|
6093
|
-
input.defaultChecked = this._map.hasLayer(obj.layer);
|
6094
6963
|
|
6095
|
-
L.DomEvent.
|
6964
|
+
L.DomEvent.on(input, 'click', this._onInputClick, this);
|
6096
6965
|
|
6097
6966
|
var name = document.createTextNode(' ' + obj.name);
|
6098
6967
|
|
@@ -6129,6 +6998,10 @@ L.Control.Layers = L.Control.extend({
|
|
6129
6998
|
}
|
6130
6999
|
});
|
6131
7000
|
|
7001
|
+
L.control.layers = function (baseLayers, overlays, options) {
|
7002
|
+
return new L.Control.Layers(baseLayers, overlays, options);
|
7003
|
+
};
|
7004
|
+
|
6132
7005
|
|
6133
7006
|
L.Transition = L.Class.extend({
|
6134
7007
|
includes: L.Mixin.Events,
|
@@ -6195,7 +7068,7 @@ L.Transition = L.Transition.extend({
|
|
6195
7068
|
this._el = el;
|
6196
7069
|
L.Util.setOptions(this, options);
|
6197
7070
|
|
6198
|
-
L.DomEvent.
|
7071
|
+
L.DomEvent.on(el, L.Transition.END, this._onTransitionEnd, this);
|
6199
7072
|
this._onFakeStep = L.Util.bind(this._onFakeStep, this);
|
6200
7073
|
},
|
6201
7074
|
|
@@ -6226,6 +7099,11 @@ L.Transition = L.Transition.extend({
|
|
6226
7099
|
|
6227
7100
|
this.fire('start');
|
6228
7101
|
|
7102
|
+
if (L.Browser.mobileWebkit) {
|
7103
|
+
// Set up a slightly delayed call to a backup event if webkitTransitionEnd doesn't fire properly
|
7104
|
+
this.backupEventFire = setTimeout(L.Util.bind(this._onBackupFireEnd, this), this.options.duration * 1.2 * 1000);
|
7105
|
+
}
|
7106
|
+
|
6229
7107
|
if (L.Transition.NATIVE) {
|
6230
7108
|
clearInterval(this._timer);
|
6231
7109
|
this._timer = setInterval(this._onFakeStep, this.options.fakeStepInterval);
|
@@ -6257,12 +7135,24 @@ L.Transition = L.Transition.extend({
|
|
6257
7135
|
|
6258
7136
|
this._el.style[L.Transition.TRANSITION] = '';
|
6259
7137
|
|
7138
|
+
// Clear the delayed call to the backup event, we have recieved some form of webkitTransitionEnd
|
7139
|
+
clearTimeout(this.backupEventFire);
|
7140
|
+
delete this.backupEventFire;
|
7141
|
+
|
6260
7142
|
this.fire('step');
|
6261
7143
|
|
6262
7144
|
if (e && e.type) {
|
6263
7145
|
this.fire('end');
|
6264
7146
|
}
|
6265
7147
|
}
|
7148
|
+
},
|
7149
|
+
|
7150
|
+
_onBackupFireEnd: function () {
|
7151
|
+
// Create and fire a transitionEnd event on the element.
|
7152
|
+
|
7153
|
+
var event = document.createEvent("Event");
|
7154
|
+
event.initEvent(L.Transition.END, true, false);
|
7155
|
+
this._el.dispatchEvent(event);
|
6266
7156
|
}
|
6267
7157
|
});
|
6268
7158
|
|
@@ -6281,11 +7171,8 @@ L.Transition = L.Transition.NATIVE ? L.Transition : L.Transition.extend({
|
|
6281
7171
|
TIMER: true,
|
6282
7172
|
|
6283
7173
|
EASINGS: {
|
6284
|
-
'
|
6285
|
-
'
|
6286
|
-
'ease-in': [0.42, 0, 1.0, 1.0],
|
6287
|
-
'ease-out': [0, 0, 0.58, 1.0],
|
6288
|
-
'ease-in-out': [0.42, 0, 0.58, 1.0]
|
7174
|
+
'linear': function (t) { return t; },
|
7175
|
+
'ease-out': function (t) { return t * (2 - t); }
|
6289
7176
|
},
|
6290
7177
|
|
6291
7178
|
CUSTOM_PROPS_GETTERS: {
|
@@ -6304,12 +7191,7 @@ L.Transition = L.Transition.NATIVE ? L.Transition : L.Transition.extend({
|
|
6304
7191
|
this._el = el;
|
6305
7192
|
L.Util.extend(this.options, options);
|
6306
7193
|
|
6307
|
-
|
6308
|
-
|
6309
|
-
this._p1 = new L.Point(0, 0);
|
6310
|
-
this._p2 = new L.Point(easings[0], easings[1]);
|
6311
|
-
this._p3 = new L.Point(easings[2], easings[3]);
|
6312
|
-
this._p4 = new L.Point(1, 1);
|
7194
|
+
this._easing = L.Transition.EASINGS[this.options.easing] || L.Transition.EASINGS['ease-out'];
|
6313
7195
|
|
6314
7196
|
this._step = L.Util.bind(this._step, this);
|
6315
7197
|
this._interval = Math.round(1000 / this.options.fps);
|
@@ -6349,7 +7231,7 @@ L.Transition = L.Transition.NATIVE ? L.Transition : L.Transition.extend({
|
|
6349
7231
|
duration = this.options.duration * 1000;
|
6350
7232
|
|
6351
7233
|
if (elapsed < duration) {
|
6352
|
-
this._runFrame(this.
|
7234
|
+
this._runFrame(this._easing(elapsed / duration));
|
6353
7235
|
} else {
|
6354
7236
|
this._runFrame(1);
|
6355
7237
|
this._complete();
|
@@ -6378,42 +7260,26 @@ L.Transition = L.Transition.NATIVE ? L.Transition : L.Transition.extend({
|
|
6378
7260
|
_complete: function () {
|
6379
7261
|
clearInterval(this._timer);
|
6380
7262
|
this.fire('end');
|
6381
|
-
},
|
6382
|
-
|
6383
|
-
_cubicBezier: function (t) {
|
6384
|
-
var a = Math.pow(1 - t, 3),
|
6385
|
-
b = 3 * Math.pow(1 - t, 2) * t,
|
6386
|
-
c = 3 * (1 - t) * Math.pow(t, 2),
|
6387
|
-
d = Math.pow(t, 3),
|
6388
|
-
p1 = this._p1.multiplyBy(a),
|
6389
|
-
p2 = this._p2.multiplyBy(b),
|
6390
|
-
p3 = this._p3.multiplyBy(c),
|
6391
|
-
p4 = this._p4.multiplyBy(d);
|
6392
|
-
|
6393
|
-
return p1.add(p2).add(p3).add(p4).y;
|
6394
7263
|
}
|
6395
7264
|
});
|
6396
7265
|
|
6397
7266
|
|
6398
7267
|
|
6399
7268
|
L.Map.include(!(L.Transition && L.Transition.implemented()) ? {} : {
|
7269
|
+
|
6400
7270
|
setView: function (center, zoom, forceReset) {
|
6401
7271
|
zoom = this._limitZoom(zoom);
|
6402
7272
|
|
6403
7273
|
var zoomChanged = (this._zoom !== zoom);
|
6404
7274
|
|
6405
7275
|
if (this._loaded && !forceReset && this._layers) {
|
6406
|
-
// difference between the new and current centers in pixels
|
6407
|
-
var offset = this._getNewTopLeftPoint(center).subtract(this._getTopLeftPoint());
|
6408
|
-
|
6409
|
-
center = new L.LatLng(center.lat, center.lng);
|
6410
|
-
|
6411
7276
|
var done = (zoomChanged ?
|
6412
|
-
this.
|
6413
|
-
this._panByIfClose(
|
7277
|
+
this._zoomToIfClose && this._zoomToIfClose(center, zoom) :
|
7278
|
+
this._panByIfClose(center));
|
6414
7279
|
|
6415
7280
|
// exit if animated pan or zoom started
|
6416
7281
|
if (done) {
|
7282
|
+
clearTimeout(this._sizeTimer);
|
6417
7283
|
return this;
|
6418
7284
|
}
|
6419
7285
|
}
|
@@ -6425,6 +7291,8 @@ L.Map.include(!(L.Transition && L.Transition.implemented()) ? {} : {
|
|
6425
7291
|
},
|
6426
7292
|
|
6427
7293
|
panBy: function (offset, options) {
|
7294
|
+
offset = L.point(offset);
|
7295
|
+
|
6428
7296
|
if (!(offset.x || offset.y)) {
|
6429
7297
|
return this;
|
6430
7298
|
}
|
@@ -6432,15 +7300,17 @@ L.Map.include(!(L.Transition && L.Transition.implemented()) ? {} : {
|
|
6432
7300
|
if (!this._panTransition) {
|
6433
7301
|
this._panTransition = new L.Transition(this._mapPane);
|
6434
7302
|
|
6435
|
-
this._panTransition.on(
|
6436
|
-
|
7303
|
+
this._panTransition.on({
|
7304
|
+
'step': this._onPanTransitionStep,
|
7305
|
+
'end': this._onPanTransitionEnd
|
7306
|
+
}, this);
|
6437
7307
|
}
|
6438
7308
|
|
6439
7309
|
L.Util.setOptions(this._panTransition, L.Util.extend({duration: 0.25}, options));
|
6440
7310
|
|
6441
7311
|
this.fire('movestart');
|
6442
7312
|
|
6443
|
-
this._mapPane
|
7313
|
+
L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');
|
6444
7314
|
|
6445
7315
|
this._panTransition.run({
|
6446
7316
|
position: L.DomUtil.getPosition(this._mapPane).subtract(offset)
|
@@ -6454,11 +7324,14 @@ L.Map.include(!(L.Transition && L.Transition.implemented()) ? {} : {
|
|
6454
7324
|
},
|
6455
7325
|
|
6456
7326
|
_onPanTransitionEnd: function () {
|
6457
|
-
|
7327
|
+
L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');
|
6458
7328
|
this.fire('moveend');
|
6459
7329
|
},
|
6460
7330
|
|
6461
|
-
_panByIfClose: function (
|
7331
|
+
_panByIfClose: function (center) {
|
7332
|
+
// difference between the new and current centers in pixels
|
7333
|
+
var offset = this._getCenterOffset(center)._floor();
|
7334
|
+
|
6462
7335
|
if (this._offsetIsWithinView(offset)) {
|
6463
7336
|
this.panBy(offset);
|
6464
7337
|
return true;
|
@@ -6477,53 +7350,37 @@ L.Map.include(!(L.Transition && L.Transition.implemented()) ? {} : {
|
|
6477
7350
|
|
6478
7351
|
|
6479
7352
|
L.Map.mergeOptions({
|
6480
|
-
zoomAnimation: L.DomUtil.TRANSITION && !L.Browser.
|
7353
|
+
zoomAnimation: L.DomUtil.TRANSITION && !L.Browser.android23 && !L.Browser.mobileOpera
|
6481
7354
|
});
|
6482
7355
|
|
6483
7356
|
L.Map.include(!L.DomUtil.TRANSITION ? {} : {
|
6484
|
-
_zoomToIfCenterInView: function (center, zoom, centerOffset) {
|
6485
7357
|
|
6486
|
-
|
6487
|
-
|
6488
|
-
}
|
6489
|
-
if (!this.options.zoomAnimation) {
|
6490
|
-
return false;
|
6491
|
-
}
|
7358
|
+
_zoomToIfClose: function (center, zoom) {
|
7359
|
+
|
7360
|
+
if (this._animatingZoom) { return true; }
|
7361
|
+
if (!this.options.zoomAnimation) { return false; }
|
6492
7362
|
|
6493
|
-
var scale =
|
6494
|
-
offset =
|
7363
|
+
var scale = this.getZoomScale(zoom),
|
7364
|
+
offset = this._getCenterOffset(center).divideBy(1 - 1 / scale);
|
6495
7365
|
|
6496
7366
|
// if offset does not exceed half of the view
|
6497
|
-
if (!this._offsetIsWithinView(offset, 1)) {
|
6498
|
-
return false;
|
6499
|
-
}
|
7367
|
+
if (!this._offsetIsWithinView(offset, 1)) { return false; }
|
6500
7368
|
|
6501
|
-
this._mapPane
|
7369
|
+
L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');
|
6502
7370
|
|
6503
7371
|
this
|
6504
7372
|
.fire('movestart')
|
6505
7373
|
.fire('zoomstart');
|
6506
7374
|
|
6507
|
-
|
6508
|
-
//if Foreground layer doesn't have many tiles but bg layer does, keep the existing bg layer
|
6509
|
-
if (!L.Browser.android && this._tileBg && this._getLoadedTilesPercentage(this._tileBg) > 0.5 && this._getLoadedTilesPercentage(this._tilePane) < 0.5) {
|
6510
|
-
//Leave current bg and just zoom it some more
|
6511
|
-
|
6512
|
-
this._tilePane.style.visibility = 'hidden';
|
6513
|
-
this._tilePane.empty = true;
|
6514
|
-
this._stopLoadingImages(this._tilePane);
|
6515
|
-
} else {
|
6516
|
-
this._prepareTileBg();
|
6517
|
-
}
|
6518
|
-
|
6519
|
-
var centerPoint = this.containerPointToLayerPoint(this.getSize().divideBy(2)),
|
6520
|
-
origin = centerPoint.add(offset);
|
7375
|
+
this._prepareTileBg();
|
6521
7376
|
|
6522
7377
|
this.fire('zoomanim', {
|
6523
7378
|
center: center,
|
6524
7379
|
zoom: zoom
|
6525
7380
|
});
|
6526
7381
|
|
7382
|
+
var origin = this._getCenterLayerPoint().add(offset);
|
7383
|
+
|
6527
7384
|
this._runAnimation(center, zoom, scale, origin);
|
6528
7385
|
|
6529
7386
|
return true;
|
@@ -6552,7 +7409,7 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : {
|
|
6552
7409
|
// it breaks touch zoom which Anroid doesn't support anyway, so that's a really ugly hack
|
6553
7410
|
|
6554
7411
|
// TODO work around this prettier
|
6555
|
-
if (L.Browser.
|
7412
|
+
if (L.Browser.android23) {
|
6556
7413
|
tileBg.style[transform + 'Origin'] = origin.x + 'px ' + origin.y + 'px';
|
6557
7414
|
scaleStr = 'scale(' + scale + ')';
|
6558
7415
|
} else {
|
@@ -6575,6 +7432,18 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : {
|
|
6575
7432
|
var tilePane = this._tilePane,
|
6576
7433
|
tileBg = this._tileBg;
|
6577
7434
|
|
7435
|
+
// If foreground layer doesn't have many tiles but bg layer does, keep the existing bg layer and just zoom it some more
|
7436
|
+
// (disable this for Android due to it not supporting double translate)
|
7437
|
+
if (!L.Browser.android23 && tileBg &&
|
7438
|
+
this._getLoadedTilesPercentage(tileBg) > 0.5 &&
|
7439
|
+
this._getLoadedTilesPercentage(tilePane) < 0.5) {
|
7440
|
+
|
7441
|
+
tilePane.style.visibility = 'hidden';
|
7442
|
+
tilePane.empty = true;
|
7443
|
+
this._stopLoadingImages(tilePane);
|
7444
|
+
return;
|
7445
|
+
}
|
7446
|
+
|
6578
7447
|
if (!tileBg) {
|
6579
7448
|
tileBg = this._tileBg = this._createPane('leaflet-tile-pane', this._mapPane);
|
6580
7449
|
tileBg.style.zIndex = 1;
|
@@ -6605,7 +7474,7 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : {
|
|
6605
7474
|
},
|
6606
7475
|
|
6607
7476
|
_getLoadedTilesPercentage: function (container) {
|
6608
|
-
var tiles =
|
7477
|
+
var tiles = container.getElementsByTagName('img'),
|
6609
7478
|
i, len, count = 0;
|
6610
7479
|
|
6611
7480
|
for (i = 0, len = tiles.length; i < len; i++) {
|
@@ -6637,10 +7506,10 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : {
|
|
6637
7506
|
_onZoomTransitionEnd: function () {
|
6638
7507
|
this._restoreTileFront();
|
6639
7508
|
|
6640
|
-
L.Util.falseFn(this._tileBg.offsetWidth);
|
7509
|
+
L.Util.falseFn(this._tileBg.offsetWidth); // force reflow
|
6641
7510
|
this._resetView(this._animateToCenter, this._animateToZoom, true, true);
|
6642
7511
|
|
6643
|
-
|
7512
|
+
L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');
|
6644
7513
|
this._animatingZoom = false;
|
6645
7514
|
},
|
6646
7515
|
|
@@ -6678,10 +7547,11 @@ L.Map.include({
|
|
6678
7547
|
options = this._locationOptions = L.Util.extend(this._defaultLocateOptions, options);
|
6679
7548
|
|
6680
7549
|
if (!navigator.geolocation) {
|
6681
|
-
|
7550
|
+
this._handleGeolocationError({
|
6682
7551
|
code: 0,
|
6683
7552
|
message: "Geolocation not supported."
|
6684
7553
|
});
|
7554
|
+
return this;
|
6685
7555
|
}
|
6686
7556
|
|
6687
7557
|
var onResponse = L.Util.bind(this._handleGeolocationResponse, this),
|
@@ -6704,7 +7574,7 @@ L.Map.include({
|
|
6704
7574
|
|
6705
7575
|
_handleGeolocationError: function (error) {
|
6706
7576
|
var c = error.code,
|
6707
|
-
message =
|
7577
|
+
message = error.message ||
|
6708
7578
|
(c === 1 ? "permission denied" :
|
6709
7579
|
(c === 2 ? "position unavailable" : "timeout"));
|
6710
7580
|
|
@@ -6748,4 +7618,4 @@ L.Map.include({
|
|
6748
7618
|
|
6749
7619
|
|
6750
7620
|
|
6751
|
-
}());
|
7621
|
+
}(this));
|