leaflet-rails 1.0.0.pre.rc1 → 1.0.0.pre.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/leaflet-rails.gemspec +2 -2
- data/lib/leaflet-rails/version.rb +1 -1
- data/lib/leaflet-rails/view_helpers.rb +3 -4
- data/spec/view_helpers_spec.rb +16 -0
- data/vendor/assets/images/layers-2x.png +0 -0
- data/vendor/assets/images/layers.png +0 -0
- data/vendor/assets/images/marker-icon-2x.png +0 -0
- data/vendor/assets/images/marker-icon.png +0 -0
- data/vendor/assets/images/marker-shadow.png +0 -0
- data/vendor/assets/javascripts/leaflet-src.js.erb +1016 -437
- data/vendor/assets/javascripts/leaflet-src.map +1 -1
- data/vendor/assets/stylesheets/leaflet.css.erb +87 -4
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b92eef4dc68d876290568325017e802bbf6a0f11
|
4
|
+
data.tar.gz: d4167cf1724cb85dff40b7148f31af902dbfb6dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b86c672ff65df137a82cc98887a28a87918d6e65fe5cdddfeae322fc4c95214dab7eb8338c999516a2280598308e01397473b9265ad4455dce5a71017d5f21a
|
7
|
+
data.tar.gz: 8d21a8ab52b96e3d3d15013eaec15802609506f10432d6fd8702bf40a5301702e72f19a4d68500a4cead7816e2a2f0112f93371c0e43aff382e262731b55bcc5
|
data/leaflet-rails.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.email = ["joshi.a@gmail.com"]
|
10
10
|
s.license = "BSD"
|
11
11
|
s.homepage = ""
|
12
|
-
s.summary = %q{Use leaflet.js with Rails 4.}
|
13
|
-
s.description = %q{This gem provides the leaflet.js map display library for your Rails 4 application.}
|
12
|
+
s.summary = %q{Use leaflet.js with Rails 4/5.}
|
13
|
+
s.description = %q{This gem provides the leaflet.js map display library for your Rails 4/5 application.}
|
14
14
|
|
15
15
|
s.rubyforge_project = "leaflet-rails"
|
16
16
|
|
@@ -40,7 +40,7 @@ module Leaflet
|
|
40
40
|
output << "marker = L.marker([#{marker[:latlng][0]}, #{marker[:latlng][1]}]).addTo(map);"
|
41
41
|
end
|
42
42
|
if marker[:popup]
|
43
|
-
output << "marker.bindPopup('#{marker[:popup]}');"
|
43
|
+
output << "marker.bindPopup('#{escape_javascript marker[:popup]}');"
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -72,9 +72,8 @@ module Leaflet
|
|
72
72
|
attribution: '#{attribution}',
|
73
73
|
maxZoom: #{max_zoom},"
|
74
74
|
|
75
|
-
if options
|
76
|
-
output << " subdomains: #{
|
77
|
-
options.delete( :subdomains )
|
75
|
+
if subdomains = options.delete(:subdomains)
|
76
|
+
output << " subdomains: #{subdomains},"
|
78
77
|
end
|
79
78
|
|
80
79
|
options.each do |key, value|
|
data/spec/view_helpers_spec.rb
CHANGED
@@ -27,6 +27,22 @@ describe Leaflet::ViewHelpers do
|
|
27
27
|
expect(result).to match(/attribution: 'Some attribution statement'/)
|
28
28
|
expect(result).to match(/maxZoom: 18/)
|
29
29
|
end
|
30
|
+
|
31
|
+
it 'should set subdomains if present' do
|
32
|
+
result = @view.map(:center => {
|
33
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
34
|
+
:zoom => 18
|
35
|
+
}, :subdomains => ['otile1', 'otile2'])
|
36
|
+
expect(result).to match(/subdomains: \["otile1", "otile2"\]/)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should not set subdomains if nil' do
|
40
|
+
result = @view.map(:center => {
|
41
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
42
|
+
:zoom => 18
|
43
|
+
}, :subdomains => nil)
|
44
|
+
expect(result).not_to match(/subdomains:/)
|
45
|
+
end
|
30
46
|
|
31
47
|
it 'should generate a basic map with the correct latitude, longitude and zoom' do
|
32
48
|
result = @view.map(:center => {
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,10 +1,10 @@
|
|
1
1
|
/*
|
2
|
-
Leaflet 1.0.0-rc.
|
2
|
+
Leaflet 1.0.0-rc.2, a JS library for interactive maps. http://leafletjs.com
|
3
3
|
(c) 2010-2015 Vladimir Agafonkin, (c) 2010-2011 CloudMade
|
4
4
|
*/
|
5
5
|
(function (window, document, undefined) {
|
6
6
|
var L = {
|
7
|
-
version:
|
7
|
+
version: "1.0.0-rc.2"
|
8
8
|
};
|
9
9
|
|
10
10
|
function expose() {
|
@@ -98,7 +98,11 @@ L.Util = {
|
|
98
98
|
|
99
99
|
// @function throttle(fn: Function, time: Number, context: Object): Function
|
100
100
|
// Returns a function which executes function `fn` with the given scope `context`
|
101
|
-
// (so that the `this` keyword refers to `context` inside `fn`'s code). The
|
101
|
+
// (so that the `this` keyword refers to `context` inside `fn`'s code). The function
|
102
|
+
// `fn` will be called no more than one time per given amount of `time`. The arguments
|
103
|
+
// received by the bound function will be any arguments passed when binding the
|
104
|
+
// function, followed by any arguments passed when invoking the bound function.
|
105
|
+
// Has an `L.bind` shortcut.
|
102
106
|
throttle: function (fn, time, context) {
|
103
107
|
var lock, args, wrapperFn, later;
|
104
108
|
|
@@ -161,7 +165,7 @@ L.Util = {
|
|
161
165
|
return L.Util.trim(str).split(/\s+/);
|
162
166
|
},
|
163
167
|
|
164
|
-
// @function setOptions(obj: Object
|
168
|
+
// @function setOptions(obj: Object, options: Object): Object
|
165
169
|
// Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut.
|
166
170
|
setOptions: function (obj, options) {
|
167
171
|
if (!obj.hasOwnProperty('options')) {
|
@@ -186,7 +190,7 @@ L.Util = {
|
|
186
190
|
return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
|
187
191
|
},
|
188
192
|
|
189
|
-
// @template
|
193
|
+
// @function template(str: String, data: Object): String
|
190
194
|
// Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`
|
191
195
|
// and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string
|
192
196
|
// `('Hello foo, bar')`. You can also specify functions instead of strings for
|
@@ -213,7 +217,7 @@ L.Util = {
|
|
213
217
|
return (Object.prototype.toString.call(obj) === '[object Array]');
|
214
218
|
},
|
215
219
|
|
216
|
-
// @function indexOf: Number
|
220
|
+
// @function indexOf(array: Array, el: Object): Number
|
217
221
|
// Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)
|
218
222
|
indexOf: function (array, el) {
|
219
223
|
for (var i = 0; i < array.length; i++) {
|
@@ -252,12 +256,12 @@ L.Util = {
|
|
252
256
|
getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); };
|
253
257
|
|
254
258
|
|
255
|
-
// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean):
|
259
|
+
// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number
|
256
260
|
// Schedules `fn` to be executed when the browser repaints. `fn` is bound to
|
257
261
|
// `context` if given. When `immediate` is set, `fn` is called immediately if
|
258
262
|
// the browser doesn't have native support for
|
259
263
|
// [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame),
|
260
|
-
// otherwise it's delayed. Returns
|
264
|
+
// otherwise it's delayed. Returns a request ID that can be used to cancel the request.
|
261
265
|
L.Util.requestAnimFrame = function (fn, context, immediate) {
|
262
266
|
if (immediate && requestFn === timeoutDefer) {
|
263
267
|
fn.call(context);
|
@@ -266,7 +270,7 @@ L.Util = {
|
|
266
270
|
}
|
267
271
|
};
|
268
272
|
|
269
|
-
// @function cancelAnimFrame(id: Number)
|
273
|
+
// @function cancelAnimFrame(id: Number): undefined
|
270
274
|
// Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame).
|
271
275
|
L.Util.cancelAnimFrame = function (id) {
|
272
276
|
if (id) {
|
@@ -366,21 +370,21 @@ L.Class.extend = function (props) {
|
|
366
370
|
};
|
367
371
|
|
368
372
|
|
369
|
-
// @function include(properties: Object)
|
373
|
+
// @function include(properties: Object): this
|
370
374
|
// [Includes a mixin](#class-includes) into the current class.
|
371
375
|
L.Class.include = function (props) {
|
372
376
|
L.extend(this.prototype, props);
|
373
377
|
return this;
|
374
378
|
};
|
375
379
|
|
376
|
-
// @function mergeOptions(options: Object)
|
380
|
+
// @function mergeOptions(options: Object): this
|
377
381
|
// [Merges `options`](#class-options) into the defaults of the class.
|
378
382
|
L.Class.mergeOptions = function (options) {
|
379
383
|
L.extend(this.prototype.options, options);
|
380
384
|
return this;
|
381
385
|
};
|
382
386
|
|
383
|
-
// @function addInitHook(fn: Function)
|
387
|
+
// @function addInitHook(fn: Function): this
|
384
388
|
// Adds a [constructor hook](#class-constructor-hooks) to the class.
|
385
389
|
L.Class.addInitHook = function (fn) { // (Function) || (String, args...)
|
386
390
|
var args = Array.prototype.slice.call(arguments, 1);
|
@@ -488,81 +492,110 @@ L.Evented = L.Class.extend({
|
|
488
492
|
|
489
493
|
// attach listener (without syntactic sugar now)
|
490
494
|
_on: function (type, fn, context) {
|
495
|
+
this._events = this._events || {};
|
496
|
+
|
497
|
+
/* get/init listeners for type */
|
498
|
+
var typeListeners = this._events[type];
|
499
|
+
if (!typeListeners) {
|
500
|
+
typeListeners = {
|
501
|
+
listeners: {},
|
502
|
+
count: 0
|
503
|
+
};
|
504
|
+
this._events[type] = typeListeners;
|
505
|
+
}
|
491
506
|
|
492
|
-
var
|
493
|
-
|
494
|
-
|
495
|
-
if (contextId) {
|
496
|
-
// store listeners with custom context in a separate hash (if it has an id);
|
497
|
-
// gives a major performance boost when firing and removing events (e.g. on map object)
|
507
|
+
var contextId = context && context !== this && L.stamp(context),
|
508
|
+
newListener = {fn: fn, ctx: context};
|
498
509
|
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
510
|
+
if (!contextId) {
|
511
|
+
contextId = 'no_context';
|
512
|
+
newListener.ctx = undefined;
|
513
|
+
}
|
503
514
|
|
504
|
-
|
505
|
-
|
515
|
+
// fn array for context
|
516
|
+
var listeners = typeListeners.listeners[contextId];
|
517
|
+
if (!listeners) {
|
518
|
+
listeners = [];
|
519
|
+
typeListeners.listeners[contextId] = listeners;
|
520
|
+
}
|
506
521
|
|
507
|
-
|
508
|
-
|
522
|
+
// check if fn already there
|
523
|
+
for (var i = 0, len = listeners.length; i < len; i++) {
|
524
|
+
if (listeners[i].fn === fn) {
|
525
|
+
return;
|
509
526
|
}
|
510
|
-
|
511
|
-
} else {
|
512
|
-
// individual layers mostly use "this" for context and don't fire listeners too often
|
513
|
-
// so simple array makes the memory footprint better while not degrading performance
|
514
|
-
|
515
|
-
events[type] = events[type] || [];
|
516
|
-
events[type].push({fn: fn});
|
517
527
|
}
|
528
|
+
|
529
|
+
listeners.push(newListener);
|
530
|
+
typeListeners.count++;
|
518
531
|
},
|
519
532
|
|
520
533
|
_off: function (type, fn, context) {
|
521
|
-
var
|
522
|
-
|
523
|
-
|
534
|
+
var typeListeners,
|
535
|
+
contextId,
|
536
|
+
listeners,
|
537
|
+
i,
|
538
|
+
len;
|
524
539
|
|
525
|
-
if (!
|
540
|
+
if (!this._events) { return; }
|
526
541
|
|
527
542
|
if (!fn) {
|
528
|
-
//
|
529
|
-
|
530
|
-
|
531
|
-
|
543
|
+
// Set all removed listeners to noop so they are not called if remove happens in fire
|
544
|
+
typeListeners = this._events[type];
|
545
|
+
if (typeListeners) {
|
546
|
+
for (contextId in typeListeners.listeners) {
|
547
|
+
listeners = typeListeners.listeners[contextId];
|
548
|
+
for (i = 0, len = listeners.length; i < len; i++) {
|
549
|
+
listeners[i].fn = L.Util.falseFn;
|
550
|
+
}
|
551
|
+
}
|
552
|
+
// clear all listeners for a type if function isn't specified
|
553
|
+
delete this._events[type];
|
554
|
+
}
|
532
555
|
return;
|
533
556
|
}
|
534
557
|
|
535
|
-
|
536
|
-
|
558
|
+
typeListeners = this._events[type];
|
559
|
+
if (!typeListeners) {
|
560
|
+
return;
|
561
|
+
}
|
537
562
|
|
538
|
-
|
539
|
-
|
540
|
-
|
563
|
+
contextId = context && context !== this && L.stamp(context);
|
564
|
+
if (!contextId) {
|
565
|
+
contextId = 'no_context';
|
566
|
+
}
|
541
567
|
|
542
|
-
|
543
|
-
|
544
|
-
delete listeners[id];
|
545
|
-
events[indexLenKey]--;
|
546
|
-
}
|
568
|
+
listeners = typeListeners.listeners[contextId];
|
569
|
+
if (listeners) {
|
547
570
|
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
if
|
554
|
-
|
555
|
-
|
556
|
-
|
571
|
+
// find fn and remove it
|
572
|
+
for (i = 0, len = listeners.length; i < len; i++) {
|
573
|
+
var l = listeners[i];
|
574
|
+
if (l.fn === fn) {
|
575
|
+
|
576
|
+
// set the removed listener to noop so that's not called if remove happens in fire
|
577
|
+
l.fn = L.Util.falseFn;
|
578
|
+
typeListeners.count--;
|
579
|
+
|
580
|
+
if (len > 1) {
|
581
|
+
if (!this._isFiring) {
|
582
|
+
listeners.splice(i, 1);
|
583
|
+
} else {
|
584
|
+
/* copy array in case events are being fired */
|
585
|
+
typeListeners.listeners[contextId] = listeners.slice();
|
586
|
+
typeListeners.listeners[contextId].splice(i, 1);
|
587
|
+
}
|
588
|
+
} else {
|
589
|
+
delete typeListeners.listeners[contextId];
|
557
590
|
}
|
591
|
+
|
592
|
+
return;
|
593
|
+
}
|
594
|
+
if (listeners.length === 0) {
|
595
|
+
delete typeListeners.listeners[contextId];
|
558
596
|
}
|
559
597
|
}
|
560
598
|
}
|
561
|
-
|
562
|
-
// set the removed listener to noop so that's not called if remove happens in fire
|
563
|
-
if (listener) {
|
564
|
-
listener.fn = L.Util.falseFn;
|
565
|
-
}
|
566
599
|
},
|
567
600
|
|
568
601
|
// @method fire(type: String, data?: Object, propagate?: Boolean): this
|
@@ -572,25 +605,26 @@ L.Evented = L.Class.extend({
|
|
572
605
|
fire: function (type, data, propagate) {
|
573
606
|
if (!this.listens(type, propagate)) { return this; }
|
574
607
|
|
575
|
-
var event = L.Util.extend({}, data, {type: type, target: this})
|
576
|
-
|
608
|
+
var event = L.Util.extend({}, data, {type: type, target: this});
|
609
|
+
|
610
|
+
if (this._events) {
|
611
|
+
var typeListeners = this._events[type];
|
577
612
|
|
578
|
-
|
579
|
-
|
580
|
-
i, len, listeners, id;
|
613
|
+
if (typeListeners) {
|
614
|
+
this._isFiring = true;
|
581
615
|
|
582
|
-
|
583
|
-
|
584
|
-
|
616
|
+
// each context
|
617
|
+
for (var contextId in typeListeners.listeners) {
|
618
|
+
var listeners = typeListeners.listeners[contextId];
|
585
619
|
|
586
|
-
|
587
|
-
|
620
|
+
// each fn in context
|
621
|
+
for (var i = 0, len = listeners.length; i < len; i++) {
|
622
|
+
var l = listeners[i];
|
623
|
+
l.fn.call(l.ctx || this, event);
|
624
|
+
}
|
588
625
|
}
|
589
|
-
}
|
590
626
|
|
591
|
-
|
592
|
-
for (id in typeIndex) {
|
593
|
-
typeIndex[id].fn.call(typeIndex[id].ctx, event);
|
627
|
+
this._isFiring = false;
|
594
628
|
}
|
595
629
|
}
|
596
630
|
|
@@ -605,9 +639,8 @@ L.Evented = L.Class.extend({
|
|
605
639
|
// @method listens(type: String): Boolean
|
606
640
|
// Returns `true` if a particular event type has any listeners attached to it.
|
607
641
|
listens: function (type, propagate) {
|
608
|
-
var
|
609
|
-
|
610
|
-
if (events && (events[type] || events[type + '_len'])) { return true; }
|
642
|
+
var typeListeners = this._events && this._events[type];
|
643
|
+
if (typeListeners && typeListeners.count) { return true; }
|
611
644
|
|
612
645
|
if (propagate) {
|
613
646
|
// also check parents for listeners if event propagates
|
@@ -724,6 +757,8 @@ L.Mixin = {Events: proto};
|
|
724
757
|
chrome = ua.indexOf('chrome') !== -1,
|
725
758
|
gecko = ua.indexOf('gecko') !== -1 && !webkit && !window.opera && !ie,
|
726
759
|
|
760
|
+
win = navigator.platform.indexOf('Win') === 0,
|
761
|
+
|
727
762
|
mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1,
|
728
763
|
msPointer = !window.PointerEvent && window.MSPointerEvent,
|
729
764
|
pointer = window.PointerEvent || msPointer,
|
@@ -733,6 +768,7 @@ L.Mixin = {Events: proto};
|
|
733
768
|
gecko3d = 'MozPerspective' in doc.style,
|
734
769
|
opera12 = 'OTransition' in doc.style;
|
735
770
|
|
771
|
+
|
736
772
|
var touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window ||
|
737
773
|
(window.DocumentTouch && document instanceof window.DocumentTouch));
|
738
774
|
|
@@ -775,6 +811,11 @@ L.Mixin = {Events: proto};
|
|
775
811
|
safari: !chrome && ua.indexOf('safari') !== -1,
|
776
812
|
|
777
813
|
|
814
|
+
// @property win: Boolean
|
815
|
+
// `true` when the browser is running in a Windows platform
|
816
|
+
win: win,
|
817
|
+
|
818
|
+
|
778
819
|
// @property ie3d: Boolean
|
779
820
|
// `true` for all Internet Explorer versions supporting CSS transforms.
|
780
821
|
ie3d: ie3d,
|
@@ -1018,6 +1059,10 @@ L.Point.prototype = {
|
|
1018
1059
|
// @alternative
|
1019
1060
|
// @factory L.point(coords: Number[])
|
1020
1061
|
// Expects an array of the form `[x, y]` instead.
|
1062
|
+
|
1063
|
+
// @alternative
|
1064
|
+
// @factory L.point(coords: Object)
|
1065
|
+
// Expects a plain object of the form `{x: Number, y: Number}` instead.
|
1021
1066
|
L.point = function (x, y, round) {
|
1022
1067
|
if (x instanceof L.Point) {
|
1023
1068
|
return x;
|
@@ -1028,6 +1073,9 @@ L.point = function (x, y, round) {
|
|
1028
1073
|
if (x === undefined || x === null) {
|
1029
1074
|
return x;
|
1030
1075
|
}
|
1076
|
+
if (typeof x === 'object' && 'x' in x && 'y' in x) {
|
1077
|
+
return new L.Point(x.x, x.y);
|
1078
|
+
}
|
1031
1079
|
return new L.Point(x, y, round);
|
1032
1080
|
};
|
1033
1081
|
|
@@ -1116,7 +1164,7 @@ L.Bounds.prototype = {
|
|
1116
1164
|
// Returns `true` if the rectangle contains the given one.
|
1117
1165
|
// @alternative
|
1118
1166
|
// @method contains(point: Point): Boolean
|
1119
|
-
// Returns `true` if the rectangle contains the given
|
1167
|
+
// Returns `true` if the rectangle contains the given point.
|
1120
1168
|
contains: function (obj) {
|
1121
1169
|
var min, max;
|
1122
1170
|
|
@@ -1220,7 +1268,7 @@ L.Transformation = function (a, b, c, d) {
|
|
1220
1268
|
};
|
1221
1269
|
|
1222
1270
|
L.Transformation.prototype = {
|
1223
|
-
// @method transform(point: Point, scale?: Number)
|
1271
|
+
// @method transform(point: Point, scale?: Number): Point
|
1224
1272
|
// Returns a transformed point, optionally multiplied by the given scale.
|
1225
1273
|
// Only accepts real `L.Point` instances, not arrays.
|
1226
1274
|
transform: function (point, scale) { // (Point, Number) -> Point
|
@@ -1235,7 +1283,7 @@ L.Transformation.prototype = {
|
|
1235
1283
|
return point;
|
1236
1284
|
},
|
1237
1285
|
|
1238
|
-
// @method untransform(point: Point, scale?: Number)
|
1286
|
+
// @method untransform(point: Point, scale?: Number): Point
|
1239
1287
|
// Returns the reverse transformation of the given point, optionally divided
|
1240
1288
|
// by the given scale. Only accepts real `L.Point` instances, not arrays.
|
1241
1289
|
untransform: function (point, scale) {
|
@@ -1288,7 +1336,7 @@ L.DomUtil = {
|
|
1288
1336
|
create: function (tagName, className, container) {
|
1289
1337
|
|
1290
1338
|
var el = document.createElement(tagName);
|
1291
|
-
el.className = className;
|
1339
|
+
el.className = className || '';
|
1292
1340
|
|
1293
1341
|
if (container) {
|
1294
1342
|
container.appendChild(el);
|
@@ -2022,7 +2070,7 @@ L.Projection.SphericalMercator = {
|
|
2022
2070
|
* @aka L.CRS
|
2023
2071
|
* Abstract class that defines coordinate reference systems for projecting
|
2024
2072
|
* geographical points into pixel (screen) coordinates and back (and to
|
2025
|
-
* coordinates in other units for WMS services). See
|
2073
|
+
* coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See
|
2026
2074
|
* [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system).
|
2027
2075
|
*
|
2028
2076
|
* Leaflet defines the most usual CRSs by default. If you want to use a
|
@@ -2092,6 +2140,9 @@ L.CRS = {
|
|
2092
2140
|
return L.bounds(min, max);
|
2093
2141
|
},
|
2094
2142
|
|
2143
|
+
// @method distance(latlng1: LatLng, latlng1: LatLng): Number
|
2144
|
+
// Returns the distance between two geographical coordinates.
|
2145
|
+
|
2095
2146
|
// @property code: String
|
2096
2147
|
// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)
|
2097
2148
|
//
|
@@ -2130,7 +2181,8 @@ L.CRS = {
|
|
2130
2181
|
*
|
2131
2182
|
* A simple CRS that maps longitude and latitude into `x` and `y` directly.
|
2132
2183
|
* May be used for maps of flat surfaces (e.g. game maps). Note that the `y`
|
2133
|
-
* axis should still be inverted (going from bottom to top).
|
2184
|
+
* axis should still be inverted (going from bottom to top). `distance()` returns
|
2185
|
+
* simple euclidean distance.
|
2134
2186
|
*/
|
2135
2187
|
|
2136
2188
|
L.CRS.Simple = L.extend({}, L.CRS, {
|
@@ -2163,7 +2215,8 @@ L.CRS.Simple = L.extend({}, L.CRS, {
|
|
2163
2215
|
*
|
2164
2216
|
* Serves as the base for CRS that are global such that they cover the earth.
|
2165
2217
|
* Can only be used as the base for other CRS and cannot be used directly,
|
2166
|
-
* since it does not have a `code`, `projection` or `transformation`.
|
2218
|
+
* since it does not have a `code`, `projection` or `transformation`. `distance()` returns
|
2219
|
+
* meters.
|
2167
2220
|
*/
|
2168
2221
|
|
2169
2222
|
L.CRS.Earth = L.extend({}, L.CRS, {
|
@@ -2364,7 +2417,7 @@ L.Map = L.Evented.extend({
|
|
2364
2417
|
|
2365
2418
|
// @section Methods for modifying map state
|
2366
2419
|
|
2367
|
-
// @method setView(center:
|
2420
|
+
// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this
|
2368
2421
|
// Sets the view of the map (geographical center and zoom) with the given
|
2369
2422
|
// animation options.
|
2370
2423
|
setView: function (center, zoom) {
|
@@ -2374,7 +2427,7 @@ L.Map = L.Evented.extend({
|
|
2374
2427
|
return this;
|
2375
2428
|
},
|
2376
2429
|
|
2377
|
-
// @method setZoom(zoom: Number, options: Zoom/
|
2430
|
+
// @method setZoom(zoom: Number, options: Zoom/pan options): this
|
2378
2431
|
// Sets the zoom of the map.
|
2379
2432
|
setZoom: function (zoom, options) {
|
2380
2433
|
if (!this._loaded) {
|
@@ -2484,7 +2537,8 @@ L.Map = L.Evented.extend({
|
|
2484
2537
|
setMaxBounds: function (bounds) {
|
2485
2538
|
bounds = L.latLngBounds(bounds);
|
2486
2539
|
|
2487
|
-
if (!bounds) {
|
2540
|
+
if (!bounds.isValid()) {
|
2541
|
+
this.options.maxBounds = null;
|
2488
2542
|
return this.off('moveend', this._panInsideMaxBounds);
|
2489
2543
|
} else if (this.options.maxBounds) {
|
2490
2544
|
this.off('moveend', this._panInsideMaxBounds);
|
@@ -2589,7 +2643,7 @@ L.Map = L.Evented.extend({
|
|
2589
2643
|
}
|
2590
2644
|
|
2591
2645
|
// @section Map state change events
|
2592
|
-
// @event resize:
|
2646
|
+
// @event resize: ResizeEvent
|
2593
2647
|
// Fired when the map is resized.
|
2594
2648
|
return this.fire('resize', {
|
2595
2649
|
oldSize: oldSize,
|
@@ -2665,7 +2719,7 @@ L.Map = L.Evented.extend({
|
|
2665
2719
|
|
2666
2720
|
// @section Other Methods
|
2667
2721
|
// @method createPane(name: String, container?: HTMLElement): HTMLElement
|
2668
|
-
// Creates a new map pane with the given name if it doesn't exist already,
|
2722
|
+
// Creates a new [map pane](#map-pane) with the given name if it doesn't exist already,
|
2669
2723
|
// then returns it. The pane is created as a children of `container`, or
|
2670
2724
|
// as a children of the main map pane if not set.
|
2671
2725
|
createPane: function (name, container) {
|
@@ -2735,8 +2789,8 @@ L.Map = L.Evented.extend({
|
|
2735
2789
|
max = this.getMaxZoom(),
|
2736
2790
|
nw = bounds.getNorthWest(),
|
2737
2791
|
se = bounds.getSouthEast(),
|
2738
|
-
size = this.getSize(),
|
2739
|
-
boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom))
|
2792
|
+
size = this.getSize().subtract(padding),
|
2793
|
+
boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)),
|
2740
2794
|
snap = L.Browser.any3d ? this.options.zoomSnap : 1;
|
2741
2795
|
|
2742
2796
|
var scale = Math.min(size.x / boundsSize.x, size.y / boundsSize.y);
|
@@ -2792,13 +2846,13 @@ L.Map = L.Evented.extend({
|
|
2792
2846
|
// @section Other Methods
|
2793
2847
|
|
2794
2848
|
// @method getPane(pane: String|HTMLElement): HTMLElement
|
2795
|
-
// Returns a map pane, given its name or its HTML element (its identity).
|
2849
|
+
// Returns a [map pane](#map-pane), given its name or its HTML element (its identity).
|
2796
2850
|
getPane: function (pane) {
|
2797
2851
|
return typeof pane === 'string' ? this._panes[pane] : pane;
|
2798
2852
|
},
|
2799
2853
|
|
2800
2854
|
// @method getPanes(): Object
|
2801
|
-
// Returns a plain object containing the names of all panes as keys and
|
2855
|
+
// Returns a plain object containing the names of all [panes](#map-pane) as keys and
|
2802
2856
|
// the panes as values.
|
2803
2857
|
getPanes: function () {
|
2804
2858
|
return this._panes;
|
@@ -2993,20 +3047,23 @@ L.Map = L.Evented.extend({
|
|
2993
3047
|
this._mapPane = this.createPane('mapPane', this._container);
|
2994
3048
|
L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
|
2995
3049
|
|
2996
|
-
// @pane tilePane: HTMLElement =
|
2997
|
-
// Pane for
|
3050
|
+
// @pane tilePane: HTMLElement = 200
|
3051
|
+
// Pane for `GridLayer`s and `TileLayer`s
|
2998
3052
|
this.createPane('tilePane');
|
2999
|
-
// @pane overlayPane: HTMLElement =
|
3000
|
-
// Pane for overlays like
|
3053
|
+
// @pane overlayPane: HTMLElement = 400
|
3054
|
+
// Pane for vector overlays (`Path`s), like `Polyline`s and `Polygon`s
|
3001
3055
|
this.createPane('shadowPane');
|
3002
|
-
// @pane shadowPane: HTMLElement =
|
3003
|
-
// Pane for overlay shadows (e.g.
|
3056
|
+
// @pane shadowPane: HTMLElement = 500
|
3057
|
+
// Pane for overlay shadows (e.g. `Marker` shadows)
|
3004
3058
|
this.createPane('overlayPane');
|
3005
|
-
// @pane markerPane: HTMLElement =
|
3006
|
-
// Pane for
|
3059
|
+
// @pane markerPane: HTMLElement = 600
|
3060
|
+
// Pane for `Icon`s of `Marker`s
|
3007
3061
|
this.createPane('markerPane');
|
3008
|
-
// @pane
|
3009
|
-
// Pane for
|
3062
|
+
// @pane tooltipPane: HTMLElement = 650
|
3063
|
+
// Pane for tooltip.
|
3064
|
+
this.createPane('tooltipPane');
|
3065
|
+
// @pane popupPane: HTMLElement = 700
|
3066
|
+
// Pane for `Popup`s.
|
3010
3067
|
this.createPane('popupPane');
|
3011
3068
|
|
3012
3069
|
if (!this.options.markerZoomAnimation) {
|
@@ -3219,17 +3276,6 @@ L.Map = L.Evented.extend({
|
|
3219
3276
|
|
3220
3277
|
var type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type;
|
3221
3278
|
|
3222
|
-
if (e.type === 'click') {
|
3223
|
-
// Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).
|
3224
|
-
// @event preclick: MouseEvent
|
3225
|
-
// Fired before mouse click on the map (sometimes useful when you
|
3226
|
-
// want something to happen on click before any existing click
|
3227
|
-
// handlers start running).
|
3228
|
-
var synth = L.Util.extend({}, e);
|
3229
|
-
synth.type = 'preclick';
|
3230
|
-
this._handleDOMEvent(synth);
|
3231
|
-
}
|
3232
|
-
|
3233
3279
|
if (type === 'mousedown') {
|
3234
3280
|
// prevents outline when clicking on keyboard-focusable element
|
3235
3281
|
L.DomUtil.preventOutline(e.target || e.srcElement);
|
@@ -3240,6 +3286,17 @@ L.Map = L.Evented.extend({
|
|
3240
3286
|
|
3241
3287
|
_fireDOMEvent: function (e, type, targets) {
|
3242
3288
|
|
3289
|
+
if (e.type === 'click') {
|
3290
|
+
// Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).
|
3291
|
+
// @event preclick: MouseEvent
|
3292
|
+
// Fired before mouse click on the map (sometimes useful when you
|
3293
|
+
// want something to happen on click before any existing click
|
3294
|
+
// handlers start running).
|
3295
|
+
var synth = L.Util.extend({}, e);
|
3296
|
+
synth.type = 'preclick';
|
3297
|
+
this._fireDOMEvent(synth, synth.type, targets);
|
3298
|
+
}
|
3299
|
+
|
3243
3300
|
if (e._stopped) { return; }
|
3244
3301
|
|
3245
3302
|
// Find the layer the event is propagating from and its parents.
|
@@ -3272,7 +3329,7 @@ L.Map = L.Evented.extend({
|
|
3272
3329
|
},
|
3273
3330
|
|
3274
3331
|
_draggableMoved: function (obj) {
|
3275
|
-
obj = obj.
|
3332
|
+
obj = obj.dragging && obj.dragging.enabled() ? obj : this;
|
3276
3333
|
return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved());
|
3277
3334
|
},
|
3278
3335
|
|
@@ -3502,7 +3559,11 @@ L.Layer = L.Evented.extend({
|
|
3502
3559
|
this._zoomAnimated = map._zoomAnimated;
|
3503
3560
|
|
3504
3561
|
if (this.getEvents) {
|
3505
|
-
|
3562
|
+
var events = this.getEvents();
|
3563
|
+
map.on(events, this);
|
3564
|
+
this.once('remove', function () {
|
3565
|
+
map.off(events, this);
|
3566
|
+
}, this);
|
3506
3567
|
}
|
3507
3568
|
|
3508
3569
|
this.onAdd(map);
|
@@ -3528,7 +3589,7 @@ L.Layer = L.Evented.extend({
|
|
3528
3589
|
* Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer).
|
3529
3590
|
*
|
3530
3591
|
* @method getEvents(): Object
|
3531
|
-
* This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#
|
3592
|
+
* This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer.
|
3532
3593
|
*
|
3533
3594
|
* @method getAttribution(): String
|
3534
3595
|
* This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible.
|
@@ -3554,7 +3615,7 @@ L.Map.include({
|
|
3554
3615
|
// Adds the given layer to the map
|
3555
3616
|
addLayer: function (layer) {
|
3556
3617
|
var id = L.stamp(layer);
|
3557
|
-
if (this._layers[id]) { return
|
3618
|
+
if (this._layers[id]) { return this; }
|
3558
3619
|
this._layers[id] = layer;
|
3559
3620
|
|
3560
3621
|
layer._mapToAdd = this;
|
@@ -3583,10 +3644,6 @@ L.Map.include({
|
|
3583
3644
|
this.attributionControl.removeAttribution(layer.getAttribution());
|
3584
3645
|
}
|
3585
3646
|
|
3586
|
-
if (layer.getEvents) {
|
3587
|
-
this.off(layer.getEvents(), layer);
|
3588
|
-
}
|
3589
|
-
|
3590
3647
|
delete this._layers[id];
|
3591
3648
|
|
3592
3649
|
if (this._loaded) {
|
@@ -3744,13 +3801,13 @@ L.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, {
|
|
3744
3801
|
* @aka L.GridLayer
|
3745
3802
|
*
|
3746
3803
|
* Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`.
|
3747
|
-
* GridLayer can be extended to create a tiled grid of HTML
|
3804
|
+
* GridLayer can be extended to create a tiled grid of HTML elements like `<canvas>`, `<img>` or `<div>`. GridLayer will handle creating and animating these DOM elements for you.
|
3748
3805
|
*
|
3749
3806
|
*
|
3750
3807
|
* @section Synchronous usage
|
3751
3808
|
* @example
|
3752
3809
|
*
|
3753
|
-
* To create a custom layer, extend GridLayer and
|
3810
|
+
* To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile.
|
3754
3811
|
*
|
3755
3812
|
* ```js
|
3756
3813
|
* var CanvasLayer = L.GridLayer.extend({
|
@@ -3764,7 +3821,7 @@ L.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, {
|
|
3764
3821
|
* tile.height = size.y;
|
3765
3822
|
*
|
3766
3823
|
* // get a canvas context and draw something on it using coords.x, coords.y and coords.z
|
3767
|
-
* var ctx =
|
3824
|
+
* var ctx = tile.getContext('2d');
|
3768
3825
|
*
|
3769
3826
|
* // return the tile so it can be rendered on screen
|
3770
3827
|
* return tile;
|
@@ -3772,10 +3829,10 @@ L.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, {
|
|
3772
3829
|
* });
|
3773
3830
|
* ```
|
3774
3831
|
*
|
3775
|
-
* @section
|
3832
|
+
* @section Asynchronous usage
|
3776
3833
|
* @example
|
3777
3834
|
*
|
3778
|
-
* Tile creation can also be
|
3835
|
+
* Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback.
|
3779
3836
|
*
|
3780
3837
|
* ```js
|
3781
3838
|
* var CanvasLayer = L.GridLayer.extend({
|
@@ -3790,8 +3847,12 @@ L.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, {
|
|
3790
3847
|
* tile.width = size.x;
|
3791
3848
|
* tile.height = size.y;
|
3792
3849
|
*
|
3793
|
-
* // draw something and pass the tile to the done() callback
|
3794
|
-
*
|
3850
|
+
* // draw something asynchronously and pass the tile to the done() callback
|
3851
|
+
* setTimeout(function() {
|
3852
|
+
* done(error, tile);
|
3853
|
+
* }, 1000);
|
3854
|
+
*
|
3855
|
+
* return tile;
|
3795
3856
|
* }
|
3796
3857
|
* });
|
3797
3858
|
* ```
|
@@ -3802,6 +3863,8 @@ L.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, {
|
|
3802
3863
|
|
3803
3864
|
L.GridLayer = L.Layer.extend({
|
3804
3865
|
|
3866
|
+
// @section
|
3867
|
+
// @aka GridLayer options
|
3805
3868
|
options: {
|
3806
3869
|
// @option tileSize: Number|Point = 256
|
3807
3870
|
// Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise.
|
@@ -3815,8 +3878,12 @@ L.GridLayer = L.Layer.extend({
|
|
3815
3878
|
// If `false`, new tiles are loaded during panning, otherwise only after it (for better performance). `true` by default on mobile browsers, otherwise `false`.
|
3816
3879
|
updateWhenIdle: L.Browser.mobile,
|
3817
3880
|
|
3881
|
+
// @option updateWhenZooming: Boolean = true
|
3882
|
+
// By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends.
|
3883
|
+
updateWhenZooming: true,
|
3884
|
+
|
3818
3885
|
// @option updateInterval: Number = 200
|
3819
|
-
// Tiles will not update more than once every `updateInterval` milliseconds.
|
3886
|
+
// Tiles will not update more than once every `updateInterval` milliseconds when panning.
|
3820
3887
|
updateInterval: 200,
|
3821
3888
|
|
3822
3889
|
// @option attribution: String = null
|
@@ -3828,7 +3895,7 @@ L.GridLayer = L.Layer.extend({
|
|
3828
3895
|
zIndex: 1,
|
3829
3896
|
|
3830
3897
|
// @option bounds: LatLngBounds = undefined
|
3831
|
-
// If set, tiles will only be loaded inside
|
3898
|
+
// If set, tiles will only be loaded inside the set `LatLngBounds`.
|
3832
3899
|
bounds: null,
|
3833
3900
|
|
3834
3901
|
// @option minZoom: Number = 0
|
@@ -3837,7 +3904,7 @@ L.GridLayer = L.Layer.extend({
|
|
3837
3904
|
|
3838
3905
|
// @option maxZoom: Number = undefined
|
3839
3906
|
// The maximum zoom level that tiles will be loaded at.
|
3840
|
-
|
3907
|
+
maxZoom: undefined,
|
3841
3908
|
|
3842
3909
|
// @option noWrap: Boolean = false
|
3843
3910
|
// Whether the layer is wrapped around the antimeridian. If `true`, the
|
@@ -3846,7 +3913,15 @@ L.GridLayer = L.Layer.extend({
|
|
3846
3913
|
|
3847
3914
|
// @option pane: String = 'tilePane'
|
3848
3915
|
// `Map pane` where the grid layer will be added.
|
3849
|
-
pane: 'tilePane'
|
3916
|
+
pane: 'tilePane',
|
3917
|
+
|
3918
|
+
// @option className: String = ''
|
3919
|
+
// A custom class name to assign to the tile layer. Empty by default.
|
3920
|
+
className: '',
|
3921
|
+
|
3922
|
+
// @option keepBuffer: Number = 2
|
3923
|
+
// When panning the map, keep this many rows and columns of tiles before unloading them.
|
3924
|
+
keepBuffer: 2
|
3850
3925
|
},
|
3851
3926
|
|
3852
3927
|
initialize: function (options) {
|
@@ -4047,7 +4122,7 @@ L.GridLayer = L.Layer.extend({
|
|
4047
4122
|
_initContainer: function () {
|
4048
4123
|
if (this._container) { return; }
|
4049
4124
|
|
4050
|
-
this._container = L.DomUtil.create('div', 'leaflet-layer');
|
4125
|
+
this._container = L.DomUtil.create('div', 'leaflet-layer ' + (this.options.className || ''));
|
4051
4126
|
this._updateZIndex();
|
4052
4127
|
|
4053
4128
|
if (this.options.opacity < 1) {
|
@@ -4225,7 +4300,7 @@ L.GridLayer = L.Layer.extend({
|
|
4225
4300
|
tileZoom = undefined;
|
4226
4301
|
}
|
4227
4302
|
|
4228
|
-
var tileZoomChanged = (tileZoom !== this._tileZoom);
|
4303
|
+
var tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom);
|
4229
4304
|
|
4230
4305
|
if (!noUpdate || tileZoomChanged) {
|
4231
4306
|
|
@@ -4296,7 +4371,7 @@ L.GridLayer = L.Layer.extend({
|
|
4296
4371
|
_onMoveEnd: function () {
|
4297
4372
|
if (!this._map || this._map._animatingZoom) { return; }
|
4298
4373
|
|
4299
|
-
this.
|
4374
|
+
this._update();
|
4300
4375
|
},
|
4301
4376
|
|
4302
4377
|
_getTiledPixelBounds: function (center) {
|
@@ -4321,10 +4396,16 @@ L.GridLayer = L.Layer.extend({
|
|
4321
4396
|
var pixelBounds = this._getTiledPixelBounds(center),
|
4322
4397
|
tileRange = this._pxBoundsToTileRange(pixelBounds),
|
4323
4398
|
tileCenter = tileRange.getCenter(),
|
4324
|
-
queue = []
|
4399
|
+
queue = [],
|
4400
|
+
margin = this.options.keepBuffer,
|
4401
|
+
noPruneRange = new L.Bounds(tileRange.getBottomLeft().subtract([margin, -margin]),
|
4402
|
+
tileRange.getTopRight().add([margin, -margin]));
|
4325
4403
|
|
4326
4404
|
for (var key in this._tiles) {
|
4327
|
-
this._tiles[key].
|
4405
|
+
var c = this._tiles[key].coords;
|
4406
|
+
if (c.z !== this._tileZoom || !noPruneRange.contains(L.point(c.x, c.y))) {
|
4407
|
+
this._tiles[key].current = false;
|
4408
|
+
}
|
4328
4409
|
}
|
4329
4410
|
|
4330
4411
|
// _update just loads more tiles. If the tile zoom level differs too much
|
@@ -4358,7 +4439,7 @@ L.GridLayer = L.Layer.extend({
|
|
4358
4439
|
if (!this._loading) {
|
4359
4440
|
this._loading = true;
|
4360
4441
|
// @event loading: Event
|
4361
|
-
// Fired when the grid layer starts loading tiles
|
4442
|
+
// Fired when the grid layer starts loading tiles.
|
4362
4443
|
this.fire('loading');
|
4363
4444
|
}
|
4364
4445
|
|
@@ -4497,7 +4578,7 @@ L.GridLayer = L.Layer.extend({
|
|
4497
4578
|
if (!this._map) { return; }
|
4498
4579
|
|
4499
4580
|
if (err) {
|
4500
|
-
// @event tileerror:
|
4581
|
+
// @event tileerror: TileErrorEvent
|
4501
4582
|
// Fired when there is an error loading a tile.
|
4502
4583
|
this.fire('tileerror', {
|
4503
4584
|
error: err,
|
@@ -4532,7 +4613,7 @@ L.GridLayer = L.Layer.extend({
|
|
4532
4613
|
|
4533
4614
|
if (this._noTilesToLoad()) {
|
4534
4615
|
this._loading = false;
|
4535
|
-
// @event load:
|
4616
|
+
// @event load: Event
|
4536
4617
|
// Fired when the grid layer loaded all visible tiles.
|
4537
4618
|
this.fire('load');
|
4538
4619
|
|
@@ -4609,13 +4690,13 @@ L.gridLayer = function (options) {
|
|
4609
4690
|
* ```
|
4610
4691
|
* L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
|
4611
4692
|
* ```
|
4612
|
-
*
|
4613
|
-
* @section
|
4614
4693
|
*/
|
4615
4694
|
|
4616
4695
|
|
4617
4696
|
L.TileLayer = L.GridLayer.extend({
|
4618
4697
|
|
4698
|
+
// @section
|
4699
|
+
// @aka TileLayer options
|
4619
4700
|
options: {
|
4620
4701
|
// @option minZoom: Number = 0
|
4621
4702
|
// Minimum zoom number.
|
@@ -4644,7 +4725,7 @@ L.TileLayer = L.GridLayer.extend({
|
|
4644
4725
|
zoomOffset: 0,
|
4645
4726
|
|
4646
4727
|
// @option tms: Boolean = false
|
4647
|
-
// If `true`, inverses Y axis numbering for tiles (turn this on for TMS services).
|
4728
|
+
// If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services).
|
4648
4729
|
tms: false,
|
4649
4730
|
|
4650
4731
|
// @option zoomReverse: Boolean = false
|
@@ -4670,10 +4751,16 @@ L.TileLayer = L.GridLayer.extend({
|
|
4670
4751
|
if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {
|
4671
4752
|
|
4672
4753
|
options.tileSize = Math.floor(options.tileSize / 2);
|
4673
|
-
|
4754
|
+
|
4755
|
+
if (!options.zoomReverse) {
|
4756
|
+
options.zoomOffset++;
|
4757
|
+
options.maxZoom--;
|
4758
|
+
} else {
|
4759
|
+
options.zoomOffset--;
|
4760
|
+
options.minZoom++;
|
4761
|
+
}
|
4674
4762
|
|
4675
4763
|
options.minZoom = Math.max(0, options.minZoom);
|
4676
|
-
options.maxZoom--;
|
4677
4764
|
}
|
4678
4765
|
|
4679
4766
|
if (typeof options.subdomains === 'string') {
|
@@ -4819,7 +4906,7 @@ L.TileLayer = L.GridLayer.extend({
|
|
4819
4906
|
});
|
4820
4907
|
|
4821
4908
|
|
4822
|
-
// @factory L.tilelayer(urlTemplate: String, options
|
4909
|
+
// @factory L.tilelayer(urlTemplate: String, options?: TileLayer options)
|
4823
4910
|
// Instantiates a tile layer object given a `URL template` and optionally an options object.
|
4824
4911
|
|
4825
4912
|
L.tileLayer = function (url, options) {
|
@@ -4832,7 +4919,7 @@ L.tileLayer = function (url, options) {
|
|
4832
4919
|
* @class TileLayer.WMS
|
4833
4920
|
* @inherits TileLayer
|
4834
4921
|
* @aka L.TileLayer.WMS
|
4835
|
-
* Used to display WMS services as tile layers on the map. Extends `TileLayer`.
|
4922
|
+
* Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`.
|
4836
4923
|
*
|
4837
4924
|
* @example
|
4838
4925
|
*
|
@@ -4850,6 +4937,9 @@ L.TileLayer.WMS = L.TileLayer.extend({
|
|
4850
4937
|
|
4851
4938
|
// @section
|
4852
4939
|
// @aka TileLayer.WMS options
|
4940
|
+
// If any custom options not documented here are used, they will be sent to the
|
4941
|
+
// WMS server as extra parameters in each request URL. This can be useful for
|
4942
|
+
// [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html).
|
4853
4943
|
defaultWmsParams: {
|
4854
4944
|
service: 'WMS',
|
4855
4945
|
request: 'GetMap',
|
@@ -4960,7 +5050,7 @@ L.tileLayer.wms = function (url, options) {
|
|
4960
5050
|
/*
|
4961
5051
|
* @class ImageOverlay
|
4962
5052
|
* @aka L.ImageOverlay
|
4963
|
-
* @inherits
|
5053
|
+
* @inherits Interactive layer
|
4964
5054
|
*
|
4965
5055
|
* Used to load and display a single image over specific bounds of the map. Extends `Layer`.
|
4966
5056
|
*
|
@@ -4975,6 +5065,8 @@ L.tileLayer.wms = function (url, options) {
|
|
4975
5065
|
|
4976
5066
|
L.ImageOverlay = L.Layer.extend({
|
4977
5067
|
|
5068
|
+
// @section
|
5069
|
+
// @aka ImageOverlay options
|
4978
5070
|
options: {
|
4979
5071
|
// @option opacity: Number = 1.0
|
4980
5072
|
// The opacity of the image overlay.
|
@@ -4985,17 +5077,16 @@ L.ImageOverlay = L.Layer.extend({
|
|
4985
5077
|
alt: '',
|
4986
5078
|
|
4987
5079
|
// @option interactive: Boolean = false
|
4988
|
-
// If `true`, the image overlay will emit mouse events when clicked or hovered.
|
5080
|
+
// If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered.
|
4989
5081
|
interactive: false,
|
4990
5082
|
|
4991
5083
|
// @option attribution: String = null
|
4992
5084
|
// An optional string containing HTML to be shown on the `Attribution control`
|
4993
|
-
attribution: null
|
5085
|
+
attribution: null,
|
4994
5086
|
|
4995
5087
|
// @option crossOrigin: Boolean = false
|
4996
5088
|
// If true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data.
|
4997
|
-
|
4998
|
-
// crossOrigin: false,
|
5089
|
+
crossOrigin: false
|
4999
5090
|
},
|
5000
5091
|
|
5001
5092
|
initialize: function (url, bounds, options) { // (String, LatLngBounds, Object)
|
@@ -5264,8 +5355,14 @@ L.Icon = L.Class.extend({
|
|
5264
5355
|
},
|
5265
5356
|
|
5266
5357
|
_setIconStyles: function (img, name) {
|
5267
|
-
var options = this.options
|
5268
|
-
|
5358
|
+
var options = this.options;
|
5359
|
+
var sizeOption = options[name + 'Size'];
|
5360
|
+
|
5361
|
+
if (typeof sizeOption === 'number') {
|
5362
|
+
sizeOption = [sizeOption, sizeOption];
|
5363
|
+
}
|
5364
|
+
|
5365
|
+
var size = L.point(sizeOption),
|
5269
5366
|
anchor = L.point(name === 'shadow' && options.shadowAnchor || options.iconAnchor ||
|
5270
5367
|
size && size.divideBy(2, true));
|
5271
5368
|
|
@@ -5312,6 +5409,7 @@ L.Icon.Default = L.Icon.extend({
|
|
5312
5409
|
iconSize: [25, 41],
|
5313
5410
|
iconAnchor: [12, 41],
|
5314
5411
|
popupAnchor: [1, -34],
|
5412
|
+
tooltipAnchor: [16, -28],
|
5315
5413
|
shadowSize: [41, 41]
|
5316
5414
|
},
|
5317
5415
|
|
@@ -5352,7 +5450,7 @@ L.Icon.Default.imagePath = (function () {
|
|
5352
5450
|
|
5353
5451
|
/*
|
5354
5452
|
* @class Marker
|
5355
|
-
* @inherits
|
5453
|
+
* @inherits Interactive layer
|
5356
5454
|
* @aka L.Marker
|
5357
5455
|
* L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`.
|
5358
5456
|
*
|
@@ -5365,13 +5463,14 @@ L.Icon.Default.imagePath = (function () {
|
|
5365
5463
|
|
5366
5464
|
L.Marker = L.Layer.extend({
|
5367
5465
|
|
5466
|
+
// @section
|
5467
|
+
// @aka Marker options
|
5368
5468
|
options: {
|
5369
|
-
// @option icon:
|
5469
|
+
// @option icon: Icon = *
|
5370
5470
|
// Icon class to use for rendering the marker. See [Icon documentation](#L.Icon) for details on how to customize the marker icon. Set to new `L.Icon.Default()` by default.
|
5371
5471
|
icon: new L.Icon.Default(),
|
5372
5472
|
|
5373
|
-
//
|
5374
|
-
// If `false`, the marker will not emit mouse events and will act as a part of the underlying map.
|
5473
|
+
// Option inherited from "Interactive layer" abstract class
|
5375
5474
|
interactive: true,
|
5376
5475
|
|
5377
5476
|
// @option draggable: Boolean = false
|
@@ -5414,31 +5513,6 @@ L.Marker = L.Layer.extend({
|
|
5414
5513
|
nonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu']
|
5415
5514
|
},
|
5416
5515
|
|
5417
|
-
/* @section
|
5418
|
-
*
|
5419
|
-
* You can subscribe to the following events using [these methods](#evented-method).
|
5420
|
-
*
|
5421
|
-
* @event click: MouseEvent
|
5422
|
-
* Fired when the user clicks (or taps) the marker.
|
5423
|
-
*
|
5424
|
-
* @event dblclick: MouseEvent
|
5425
|
-
* Fired when the user double-clicks (or double-taps) the marker.
|
5426
|
-
*
|
5427
|
-
* @event mousedown: MouseEvent
|
5428
|
-
* Fired when the user pushes the mouse button on the marker.
|
5429
|
-
*
|
5430
|
-
* @event mouseover: MouseEvent
|
5431
|
-
* Fired when the mouse enters the marker.
|
5432
|
-
*
|
5433
|
-
* @event mouseout: MouseEvent
|
5434
|
-
* Fired when the mouse leaves the marker.
|
5435
|
-
*
|
5436
|
-
* @event contextmenu: MouseEvent
|
5437
|
-
* Fired when the user right-clicks on the marker.
|
5438
|
-
*/
|
5439
|
-
|
5440
|
-
|
5441
|
-
|
5442
5516
|
/* @section
|
5443
5517
|
*
|
5444
5518
|
* In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods:
|
@@ -5452,31 +5526,33 @@ L.Marker = L.Layer.extend({
|
|
5452
5526
|
onAdd: function (map) {
|
5453
5527
|
this._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation;
|
5454
5528
|
|
5529
|
+
if (this._zoomAnimated) {
|
5530
|
+
map.on('zoomanim', this._animateZoom, this);
|
5531
|
+
}
|
5532
|
+
|
5455
5533
|
this._initIcon();
|
5456
5534
|
this.update();
|
5457
5535
|
},
|
5458
5536
|
|
5459
|
-
onRemove: function () {
|
5537
|
+
onRemove: function (map) {
|
5460
5538
|
if (this.dragging && this.dragging.enabled()) {
|
5461
5539
|
this.options.draggable = true;
|
5462
5540
|
this.dragging.removeHooks();
|
5463
5541
|
}
|
5464
5542
|
|
5543
|
+
if (this._zoomAnimated) {
|
5544
|
+
map.off('zoomanim', this._animateZoom, this);
|
5545
|
+
}
|
5546
|
+
|
5465
5547
|
this._removeIcon();
|
5466
5548
|
this._removeShadow();
|
5467
5549
|
},
|
5468
5550
|
|
5469
5551
|
getEvents: function () {
|
5470
|
-
|
5552
|
+
return {
|
5471
5553
|
zoom: this.update,
|
5472
5554
|
viewreset: this.update
|
5473
5555
|
};
|
5474
|
-
|
5475
|
-
if (this._zoomAnimated) {
|
5476
|
-
events.zoomanim = this._animateZoom;
|
5477
|
-
}
|
5478
|
-
|
5479
|
-
return events;
|
5480
5556
|
},
|
5481
5557
|
|
5482
5558
|
// @method getLatLng: LatLng
|
@@ -5776,32 +5852,12 @@ L.divIcon = function (options) {
|
|
5776
5852
|
|
5777
5853
|
|
5778
5854
|
/*
|
5779
|
-
* @class
|
5855
|
+
* @class DivOverlay
|
5780
5856
|
* @inherits Layer
|
5781
|
-
* @aka L.
|
5782
|
-
*
|
5783
|
-
* open popups while making sure that only one popup is open at one time
|
5784
|
-
* (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want.
|
5785
|
-
*
|
5786
|
-
* @example
|
5787
|
-
*
|
5788
|
-
* If you want to just bind a popup to marker click and then open it, it's really easy:
|
5789
|
-
*
|
5790
|
-
* ```js
|
5791
|
-
* marker.bindPopup(popupContent).openPopup();
|
5792
|
-
* ```
|
5793
|
-
* Path overlays like polylines also have a `bindPopup` method.
|
5794
|
-
* Here's a more complicated way to open a popup on a map:
|
5795
|
-
*
|
5796
|
-
* ```js
|
5797
|
-
* var popup = L.popup()
|
5798
|
-
* .setLatLng(latlng)
|
5799
|
-
* .setContent('<p>Hello world!<br />This is a nice popup.</p>')
|
5800
|
-
* .openOn(map);
|
5801
|
-
* ```
|
5857
|
+
* @aka L.DivOverlay
|
5858
|
+
* Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.
|
5802
5859
|
*/
|
5803
5860
|
|
5804
|
-
|
5805
5861
|
/* @namespace Map
|
5806
5862
|
* @section Interaction Options
|
5807
5863
|
* @option closePopupOnClick: Boolean = true
|
@@ -5811,64 +5867,17 @@ L.Map.mergeOptions({
|
|
5811
5867
|
closePopupOnClick: true
|
5812
5868
|
});
|
5813
5869
|
|
5814
|
-
// @namespace
|
5815
|
-
L.
|
5870
|
+
// @namespace DivOverlay
|
5871
|
+
L.DivOverlay = L.Layer.extend({
|
5816
5872
|
|
5817
5873
|
// @section
|
5818
|
-
// @aka
|
5874
|
+
// @aka DivOverlay options
|
5819
5875
|
options: {
|
5820
|
-
// @option maxWidth: Number = 300
|
5821
|
-
// Max width of the popup, in pixels.
|
5822
|
-
maxWidth: 300,
|
5823
|
-
|
5824
|
-
// @option minWidth: Number = 50
|
5825
|
-
// Min width of the popup, in pixels.
|
5826
|
-
minWidth: 50,
|
5827
|
-
|
5828
|
-
// @option maxHeight: Number = null
|
5829
|
-
// If set, creates a scrollable container of the given height
|
5830
|
-
// inside a popup if its content exceeds it.
|
5831
|
-
maxHeight: null,
|
5832
|
-
|
5833
|
-
// @option autoPan: Boolean = true
|
5834
|
-
// Set it to `false` if you don't want the map to do panning animation
|
5835
|
-
// to fit the opened popup.
|
5836
|
-
autoPan: true,
|
5837
|
-
|
5838
|
-
// @option autoPanPaddingTopLeft: Point = null
|
5839
|
-
// The margin between the popup and the top left corner of the map
|
5840
|
-
// view after autopanning was performed.
|
5841
|
-
autoPanPaddingTopLeft: null,
|
5842
|
-
|
5843
|
-
// @option autoPanPaddingBottomRight: Point = null
|
5844
|
-
// The margin between the popup and the bottom right corner of the map
|
5845
|
-
// view after autopanning was performed.
|
5846
|
-
autoPanPaddingBottomRight: null,
|
5847
|
-
|
5848
|
-
// @option autoPanPadding: Point = Point(5, 5)
|
5849
|
-
// Equivalent of setting both top left and bottom right autopan padding to the same value.
|
5850
|
-
autoPanPadding: [5, 5],
|
5851
|
-
|
5852
|
-
// @option keepInView: Boolean = false
|
5853
|
-
// Set it to `true` if you want to prevent users from panning the popup
|
5854
|
-
// off of the screen while it is open.
|
5855
|
-
keepInView: false,
|
5856
|
-
|
5857
|
-
// @option closeButton: Boolean = true
|
5858
|
-
// Controls the presence of a close button in the popup.
|
5859
|
-
closeButton: true,
|
5860
|
-
|
5861
5876
|
// @option offset: Point = Point(0, 7)
|
5862
5877
|
// The offset of the popup position. Useful to control the anchor
|
5863
5878
|
// of the popup when opening it on some overlays.
|
5864
5879
|
offset: [0, 7],
|
5865
5880
|
|
5866
|
-
// @option autoClose: Boolean = true
|
5867
|
-
// Set it to `false` if you want to override the default behavior of
|
5868
|
-
// the popup closing when user clicks the map (set globally by
|
5869
|
-
// the Map's [closePopupOnClick](#map-closepopuponclick) option).
|
5870
|
-
autoClose: true,
|
5871
|
-
|
5872
5881
|
// @option zoomAnimation: Boolean = true
|
5873
5882
|
// Whether to animate the popup on zoom. Disable it if you have
|
5874
5883
|
// problems with Flash content inside popups.
|
@@ -5908,28 +5917,7 @@ L.Popup = L.Layer.extend({
|
|
5908
5917
|
L.DomUtil.setOpacity(this._container, 1);
|
5909
5918
|
}
|
5910
5919
|
|
5911
|
-
|
5912
|
-
// @section Popup events
|
5913
|
-
// @event popupopen: PopupEvent
|
5914
|
-
// Fired when a popup is opened in the map
|
5915
|
-
map.fire('popupopen', {popup: this});
|
5916
|
-
|
5917
|
-
if (this._source) {
|
5918
|
-
// @namespace Layer
|
5919
|
-
// @section Popup events
|
5920
|
-
// @event popupopen: PopupEvent
|
5921
|
-
// Fired when a popup bound to this layer is opened
|
5922
|
-
this._source.fire('popupopen', {popup: this}, true);
|
5923
|
-
this._source.on('preclick', L.DomEvent.stopPropagation);
|
5924
|
-
}
|
5925
|
-
},
|
5926
|
-
|
5927
|
-
// @namespace Popup
|
5928
|
-
// @method openOn(map: Map): this
|
5929
|
-
// Adds the popup to the map and closes the previous one. The same as `map.openPopup(popup)`.
|
5930
|
-
openOn: function (map) {
|
5931
|
-
map.openPopup(this);
|
5932
|
-
return this;
|
5920
|
+
this.bringToFront();
|
5933
5921
|
},
|
5934
5922
|
|
5935
5923
|
onRemove: function (map) {
|
@@ -5939,22 +5927,6 @@ L.Popup = L.Layer.extend({
|
|
5939
5927
|
} else {
|
5940
5928
|
L.DomUtil.remove(this._container);
|
5941
5929
|
}
|
5942
|
-
|
5943
|
-
// @namespace Map
|
5944
|
-
// @section Popup events
|
5945
|
-
// @event popupclose: PopupEvent
|
5946
|
-
// Fired when a popup in the map is closed
|
5947
|
-
map.fire('popupclose', {popup: this});
|
5948
|
-
|
5949
|
-
if (this._source) {
|
5950
|
-
// @namespace Layer
|
5951
|
-
// @section Popup events
|
5952
|
-
// @event popupclose: PopupEvent
|
5953
|
-
// Fired when a popup bound to this layer is closed
|
5954
|
-
// @namespace Popup
|
5955
|
-
this._source.fire('popupclose', {popup: this}, true);
|
5956
|
-
this._source.off('preclick', L.DomEvent.stopPropagation);
|
5957
|
-
}
|
5958
5930
|
},
|
5959
5931
|
|
5960
5932
|
// @namespace Popup
|
@@ -6020,12 +5992,6 @@ L.Popup = L.Layer.extend({
|
|
6020
5992
|
if (this._zoomAnimated) {
|
6021
5993
|
events.zoomanim = this._animateZoom;
|
6022
5994
|
}
|
6023
|
-
if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {
|
6024
|
-
events.preclick = this._close;
|
6025
|
-
}
|
6026
|
-
if (this.options.keepInView) {
|
6027
|
-
events.moveend = this._adjustPan;
|
6028
|
-
}
|
6029
5995
|
return events;
|
6030
5996
|
},
|
6031
5997
|
|
@@ -6053,6 +6019,193 @@ L.Popup = L.Layer.extend({
|
|
6053
6019
|
return this;
|
6054
6020
|
},
|
6055
6021
|
|
6022
|
+
_updateContent: function () {
|
6023
|
+
if (!this._content) { return; }
|
6024
|
+
|
6025
|
+
var node = this._contentNode;
|
6026
|
+
var content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content;
|
6027
|
+
|
6028
|
+
if (typeof content === 'string') {
|
6029
|
+
node.innerHTML = content;
|
6030
|
+
} else {
|
6031
|
+
while (node.hasChildNodes()) {
|
6032
|
+
node.removeChild(node.firstChild);
|
6033
|
+
}
|
6034
|
+
node.appendChild(content);
|
6035
|
+
}
|
6036
|
+
this.fire('contentupdate');
|
6037
|
+
},
|
6038
|
+
|
6039
|
+
_updatePosition: function () {
|
6040
|
+
if (!this._map) { return; }
|
6041
|
+
|
6042
|
+
var pos = this._map.latLngToLayerPoint(this._latlng),
|
6043
|
+
offset = L.point(this.options.offset),
|
6044
|
+
anchor = this._getAnchor();
|
6045
|
+
|
6046
|
+
if (this._zoomAnimated) {
|
6047
|
+
L.DomUtil.setPosition(this._container, pos.add(anchor));
|
6048
|
+
} else {
|
6049
|
+
offset = offset.add(pos).add(anchor);
|
6050
|
+
}
|
6051
|
+
|
6052
|
+
var bottom = this._containerBottom = -offset.y,
|
6053
|
+
left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x;
|
6054
|
+
|
6055
|
+
// bottom position the popup in case the height of the popup changes (images loading etc)
|
6056
|
+
this._container.style.bottom = bottom + 'px';
|
6057
|
+
this._container.style.left = left + 'px';
|
6058
|
+
},
|
6059
|
+
|
6060
|
+
_getAnchor: function () {
|
6061
|
+
return [0, 0];
|
6062
|
+
}
|
6063
|
+
|
6064
|
+
});
|
6065
|
+
|
6066
|
+
|
6067
|
+
|
6068
|
+
/*
|
6069
|
+
* @class Popup
|
6070
|
+
* @inherits DivOverlay
|
6071
|
+
* @aka L.Popup
|
6072
|
+
* Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to
|
6073
|
+
* open popups while making sure that only one popup is open at one time
|
6074
|
+
* (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want.
|
6075
|
+
*
|
6076
|
+
* @example
|
6077
|
+
*
|
6078
|
+
* If you want to just bind a popup to marker click and then open it, it's really easy:
|
6079
|
+
*
|
6080
|
+
* ```js
|
6081
|
+
* marker.bindPopup(popupContent).openPopup();
|
6082
|
+
* ```
|
6083
|
+
* Path overlays like polylines also have a `bindPopup` method.
|
6084
|
+
* Here's a more complicated way to open a popup on a map:
|
6085
|
+
*
|
6086
|
+
* ```js
|
6087
|
+
* var popup = L.popup()
|
6088
|
+
* .setLatLng(latlng)
|
6089
|
+
* .setContent('<p>Hello world!<br />This is a nice popup.</p>')
|
6090
|
+
* .openOn(map);
|
6091
|
+
* ```
|
6092
|
+
*/
|
6093
|
+
|
6094
|
+
|
6095
|
+
// @namespace Popup
|
6096
|
+
L.Popup = L.DivOverlay.extend({
|
6097
|
+
|
6098
|
+
// @section
|
6099
|
+
// @aka Popup options
|
6100
|
+
options: {
|
6101
|
+
// @option maxWidth: Number = 300
|
6102
|
+
// Max width of the popup, in pixels.
|
6103
|
+
maxWidth: 300,
|
6104
|
+
|
6105
|
+
// @option minWidth: Number = 50
|
6106
|
+
// Min width of the popup, in pixels.
|
6107
|
+
minWidth: 50,
|
6108
|
+
|
6109
|
+
// @option maxHeight: Number = null
|
6110
|
+
// If set, creates a scrollable container of the given height
|
6111
|
+
// inside a popup if its content exceeds it.
|
6112
|
+
maxHeight: null,
|
6113
|
+
|
6114
|
+
// @option autoPan: Boolean = true
|
6115
|
+
// Set it to `false` if you don't want the map to do panning animation
|
6116
|
+
// to fit the opened popup.
|
6117
|
+
autoPan: true,
|
6118
|
+
|
6119
|
+
// @option autoPanPaddingTopLeft: Point = null
|
6120
|
+
// The margin between the popup and the top left corner of the map
|
6121
|
+
// view after autopanning was performed.
|
6122
|
+
autoPanPaddingTopLeft: null,
|
6123
|
+
|
6124
|
+
// @option autoPanPaddingBottomRight: Point = null
|
6125
|
+
// The margin between the popup and the bottom right corner of the map
|
6126
|
+
// view after autopanning was performed.
|
6127
|
+
autoPanPaddingBottomRight: null,
|
6128
|
+
|
6129
|
+
// @option autoPanPadding: Point = Point(5, 5)
|
6130
|
+
// Equivalent of setting both top left and bottom right autopan padding to the same value.
|
6131
|
+
autoPanPadding: [5, 5],
|
6132
|
+
|
6133
|
+
// @option keepInView: Boolean = false
|
6134
|
+
// Set it to `true` if you want to prevent users from panning the popup
|
6135
|
+
// off of the screen while it is open.
|
6136
|
+
keepInView: false,
|
6137
|
+
|
6138
|
+
// @option closeButton: Boolean = true
|
6139
|
+
// Controls the presence of a close button in the popup.
|
6140
|
+
closeButton: true,
|
6141
|
+
|
6142
|
+
// @option autoClose: Boolean = true
|
6143
|
+
// Set it to `false` if you want to override the default behavior of
|
6144
|
+
// the popup closing when user clicks the map (set globally by
|
6145
|
+
// the Map's [closePopupOnClick](#map-closepopuponclick) option).
|
6146
|
+
autoClose: true
|
6147
|
+
},
|
6148
|
+
|
6149
|
+
// @namespace Popup
|
6150
|
+
// @method openOn(map: Map): this
|
6151
|
+
// Adds the popup to the map and closes the previous one. The same as `map.openPopup(popup)`.
|
6152
|
+
openOn: function (map) {
|
6153
|
+
map.openPopup(this);
|
6154
|
+
return this;
|
6155
|
+
},
|
6156
|
+
|
6157
|
+
onAdd: function (map) {
|
6158
|
+
L.DivOverlay.prototype.onAdd.call(this, map);
|
6159
|
+
|
6160
|
+
// @namespace Map
|
6161
|
+
// @section Popup events
|
6162
|
+
// @event popupopen: PopupEvent
|
6163
|
+
// Fired when a popup is opened in the map
|
6164
|
+
map.fire('popupopen', {popup: this});
|
6165
|
+
|
6166
|
+
if (this._source) {
|
6167
|
+
// @namespace Layer
|
6168
|
+
// @section Popup events
|
6169
|
+
// @event popupopen: PopupEvent
|
6170
|
+
// Fired when a popup bound to this layer is opened
|
6171
|
+
this._source.fire('popupopen', {popup: this}, true);
|
6172
|
+
this._source.on('preclick', L.DomEvent.stopPropagation);
|
6173
|
+
}
|
6174
|
+
},
|
6175
|
+
|
6176
|
+
onRemove: function (map) {
|
6177
|
+
L.DivOverlay.prototype.onRemove.call(this, map);
|
6178
|
+
|
6179
|
+
// @namespace Map
|
6180
|
+
// @section Popup events
|
6181
|
+
// @event popupclose: PopupEvent
|
6182
|
+
// Fired when a popup in the map is closed
|
6183
|
+
map.fire('popupclose', {popup: this});
|
6184
|
+
|
6185
|
+
if (this._source) {
|
6186
|
+
// @namespace Layer
|
6187
|
+
// @section Popup events
|
6188
|
+
// @event popupclose: PopupEvent
|
6189
|
+
// Fired when a popup bound to this layer is closed
|
6190
|
+
this._source.fire('popupclose', {popup: this}, true);
|
6191
|
+
this._source.off('preclick', L.DomEvent.stopPropagation);
|
6192
|
+
}
|
6193
|
+
},
|
6194
|
+
|
6195
|
+
getEvents: function () {
|
6196
|
+
var events = L.DivOverlay.prototype.getEvents.call(this);
|
6197
|
+
|
6198
|
+
if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {
|
6199
|
+
events.preclick = this._close;
|
6200
|
+
}
|
6201
|
+
|
6202
|
+
if (this.options.keepInView) {
|
6203
|
+
events.moveend = this._adjustPan;
|
6204
|
+
}
|
6205
|
+
|
6206
|
+
return events;
|
6207
|
+
},
|
6208
|
+
|
6056
6209
|
_close: function () {
|
6057
6210
|
if (this._map) {
|
6058
6211
|
this._map.closePopup(this);
|
@@ -6085,23 +6238,6 @@ L.Popup = L.Layer.extend({
|
|
6085
6238
|
this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);
|
6086
6239
|
},
|
6087
6240
|
|
6088
|
-
_updateContent: function () {
|
6089
|
-
if (!this._content) { return; }
|
6090
|
-
|
6091
|
-
var node = this._contentNode;
|
6092
|
-
var content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content;
|
6093
|
-
|
6094
|
-
if (typeof content === 'string') {
|
6095
|
-
node.innerHTML = content;
|
6096
|
-
} else {
|
6097
|
-
while (node.hasChildNodes()) {
|
6098
|
-
node.removeChild(node.firstChild);
|
6099
|
-
}
|
6100
|
-
node.appendChild(content);
|
6101
|
-
}
|
6102
|
-
this.fire('contentupdate');
|
6103
|
-
},
|
6104
|
-
|
6105
6241
|
_updateLayout: function () {
|
6106
6242
|
var container = this._contentNode,
|
6107
6243
|
style = container.style;
|
@@ -6122,39 +6258,20 @@ L.Popup = L.Layer.extend({
|
|
6122
6258
|
maxHeight = this.options.maxHeight,
|
6123
6259
|
scrolledClass = 'leaflet-popup-scrolled';
|
6124
6260
|
|
6125
|
-
if (maxHeight && height > maxHeight) {
|
6126
|
-
style.height = maxHeight + 'px';
|
6127
|
-
L.DomUtil.addClass(container, scrolledClass);
|
6128
|
-
} else {
|
6129
|
-
L.DomUtil.removeClass(container, scrolledClass);
|
6130
|
-
}
|
6131
|
-
|
6132
|
-
this._containerWidth = this._container.offsetWidth;
|
6133
|
-
},
|
6134
|
-
|
6135
|
-
_updatePosition: function () {
|
6136
|
-
if (!this._map) { return; }
|
6137
|
-
|
6138
|
-
var pos = this._map.latLngToLayerPoint(this._latlng),
|
6139
|
-
offset = L.point(this.options.offset);
|
6140
|
-
|
6141
|
-
if (this._zoomAnimated) {
|
6142
|
-
L.DomUtil.setPosition(this._container, pos);
|
6261
|
+
if (maxHeight && height > maxHeight) {
|
6262
|
+
style.height = maxHeight + 'px';
|
6263
|
+
L.DomUtil.addClass(container, scrolledClass);
|
6143
6264
|
} else {
|
6144
|
-
|
6265
|
+
L.DomUtil.removeClass(container, scrolledClass);
|
6145
6266
|
}
|
6146
6267
|
|
6147
|
-
|
6148
|
-
left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x;
|
6149
|
-
|
6150
|
-
// bottom position the popup in case the height of the popup changes (images loading etc)
|
6151
|
-
this._container.style.bottom = bottom + 'px';
|
6152
|
-
this._container.style.left = left + 'px';
|
6268
|
+
this._containerWidth = this._container.offsetWidth;
|
6153
6269
|
},
|
6154
6270
|
|
6155
6271
|
_animateZoom: function (e) {
|
6156
|
-
var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center)
|
6157
|
-
|
6272
|
+
var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center),
|
6273
|
+
anchor = this._getAnchor();
|
6274
|
+
L.DomUtil.setPosition(this._container, pos.add(anchor));
|
6158
6275
|
},
|
6159
6276
|
|
6160
6277
|
_adjustPan: function () {
|
@@ -6192,7 +6309,7 @@ L.Popup = L.Layer.extend({
|
|
6192
6309
|
|
6193
6310
|
// @namespace Map
|
6194
6311
|
// @section Popup events
|
6195
|
-
// @event autopanstart
|
6312
|
+
// @event autopanstart: Event
|
6196
6313
|
// Fired when the map starts autopanning when opening a popup.
|
6197
6314
|
if (dx || dy) {
|
6198
6315
|
map
|
@@ -6204,12 +6321,18 @@ L.Popup = L.Layer.extend({
|
|
6204
6321
|
_onCloseButtonClick: function (e) {
|
6205
6322
|
this._close();
|
6206
6323
|
L.DomEvent.stop(e);
|
6324
|
+
},
|
6325
|
+
|
6326
|
+
_getAnchor: function () {
|
6327
|
+
// Where should we anchor the popup on the source layer?
|
6328
|
+
return L.point(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);
|
6207
6329
|
}
|
6330
|
+
|
6208
6331
|
});
|
6209
6332
|
|
6210
6333
|
// @namespace Popup
|
6211
6334
|
// @factory L.popup(options?: Popup options, source?: Layer)
|
6212
|
-
// Instantiates a Popup object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers.
|
6335
|
+
// Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers.
|
6213
6336
|
L.popup = function (options, source) {
|
6214
6337
|
return new L.Popup(options, source);
|
6215
6338
|
};
|
@@ -6304,9 +6427,6 @@ L.Layer.include({
|
|
6304
6427
|
this._popupHandlersAdded = true;
|
6305
6428
|
}
|
6306
6429
|
|
6307
|
-
// save the originally passed offset
|
6308
|
-
this._originalPopupOffset = this._popup.options.offset;
|
6309
|
-
|
6310
6430
|
return this;
|
6311
6431
|
},
|
6312
6432
|
|
@@ -6345,9 +6465,6 @@ L.Layer.include({
|
|
6345
6465
|
}
|
6346
6466
|
|
6347
6467
|
if (this._popup && this._map) {
|
6348
|
-
// set the popup offset for this layer
|
6349
|
-
this._popup.options.offset = this._popupAnchor(layer);
|
6350
|
-
|
6351
6468
|
// set popup source to this layer
|
6352
6469
|
this._popup._source = layer;
|
6353
6470
|
|
@@ -6370,7 +6487,7 @@ L.Layer.include({
|
|
6370
6487
|
return this;
|
6371
6488
|
},
|
6372
6489
|
|
6373
|
-
// @method
|
6490
|
+
// @method togglePopup(): this
|
6374
6491
|
// Opens or closes the popup bound to this layer depending on its current state.
|
6375
6492
|
togglePopup: function (target) {
|
6376
6493
|
if (this._popup) {
|
@@ -6383,13 +6500,13 @@ L.Layer.include({
|
|
6383
6500
|
return this;
|
6384
6501
|
},
|
6385
6502
|
|
6386
|
-
// @method
|
6503
|
+
// @method isPopupOpen(): boolean
|
6387
6504
|
// Returns `true` if the popup bound to this layer is currently open.
|
6388
6505
|
isPopupOpen: function () {
|
6389
6506
|
return this._popup.isOpen();
|
6390
6507
|
},
|
6391
6508
|
|
6392
|
-
// @method setPopupContent(content: String|HTMLElement|Popup
|
6509
|
+
// @method setPopupContent(content: String|HTMLElement|Popup): this
|
6393
6510
|
// Sets the content of the popup bound to this layer.
|
6394
6511
|
setPopupContent: function (content) {
|
6395
6512
|
if (this._popup) {
|
@@ -6415,6 +6532,9 @@ L.Layer.include({
|
|
6415
6532
|
return;
|
6416
6533
|
}
|
6417
6534
|
|
6535
|
+
// prevent map click
|
6536
|
+
L.DomEvent.stop(e);
|
6537
|
+
|
6418
6538
|
// if this inherits from Path its a vector and we can just
|
6419
6539
|
// open the popup at the new location
|
6420
6540
|
if (layer instanceof L.Path) {
|
@@ -6431,17 +6551,6 @@ L.Layer.include({
|
|
6431
6551
|
}
|
6432
6552
|
},
|
6433
6553
|
|
6434
|
-
_popupAnchor: function (layer) {
|
6435
|
-
// where shold we anchor the popup on this layer?
|
6436
|
-
var anchor = layer._getPopupAnchor ? layer._getPopupAnchor() : [0, 0];
|
6437
|
-
|
6438
|
-
// add the users passed offset to that
|
6439
|
-
var offsetToAdd = this._originalPopupOffset || L.Popup.prototype.options.offset;
|
6440
|
-
|
6441
|
-
// return the final point to anchor the popup
|
6442
|
-
return L.point(anchor).add(offsetToAdd);
|
6443
|
-
},
|
6444
|
-
|
6445
6554
|
_movePopup: function (e) {
|
6446
6555
|
this._popup.setLatLng(e.latlng);
|
6447
6556
|
}
|
@@ -6461,6 +6570,418 @@ L.Marker.include({
|
|
6461
6570
|
|
6462
6571
|
|
6463
6572
|
|
6573
|
+
/*
|
6574
|
+
* @class Tooltip
|
6575
|
+
* @inherits DivOverlay
|
6576
|
+
* @aka L.Tooltip
|
6577
|
+
* Used to display small texts on top of map layers.
|
6578
|
+
*
|
6579
|
+
* @example
|
6580
|
+
*
|
6581
|
+
* ```js
|
6582
|
+
* marker.bindTooltip("my tooltip text").openTooltip();
|
6583
|
+
* ```
|
6584
|
+
* Note about tooltip offset. Leaflet takes two options in consideration
|
6585
|
+
* for computing tooltip offseting:
|
6586
|
+
* - the `offset` Tooltip option: it defaults to [6, -6], because the tooltip
|
6587
|
+
* tip is 6px width and height. Remember to change this value if you override
|
6588
|
+
* the tip in CSS.
|
6589
|
+
* - the `tooltipAnchor` Icon option: this will only be considered for Marker. You
|
6590
|
+
* should adapt this value if you use a custom icon.
|
6591
|
+
*/
|
6592
|
+
|
6593
|
+
|
6594
|
+
// @namespace Tooltip
|
6595
|
+
L.Tooltip = L.DivOverlay.extend({
|
6596
|
+
|
6597
|
+
// @section
|
6598
|
+
// @aka Tooltip options
|
6599
|
+
options: {
|
6600
|
+
// @option pane: String = 'tooltipPane'
|
6601
|
+
// `Map pane` where the tooltip will be added.
|
6602
|
+
pane: 'tooltipPane',
|
6603
|
+
|
6604
|
+
// @option offset: Point = Point(6, -6)
|
6605
|
+
// The offset of the tooltip position. Update it if you customize the
|
6606
|
+
// tooltip tip in CSS.
|
6607
|
+
offset: [6, -6],
|
6608
|
+
|
6609
|
+
// @option direction: String = 'auto'
|
6610
|
+
// Direction where to open the tooltip. Possible values are: `right`, `left`,
|
6611
|
+
// `top`, `bottom`, `center`, `auto`.
|
6612
|
+
// `auto` will dynamicaly switch between `right` and `left` according to the tooltip
|
6613
|
+
// position on the map.
|
6614
|
+
direction: 'auto',
|
6615
|
+
|
6616
|
+
// @option permanent: Boolean = false
|
6617
|
+
// Whether to open the tooltip permanently or only on mouseover.
|
6618
|
+
permanent: false,
|
6619
|
+
|
6620
|
+
// @option sticky: Boolean = false
|
6621
|
+
// If true, the tooltip will follow the mouse instead of being fixed at the feature center.
|
6622
|
+
sticky: false,
|
6623
|
+
|
6624
|
+
// @option interactive: Boolean = false
|
6625
|
+
// If true, the tooltip will listen to the feature events.
|
6626
|
+
interactive: false,
|
6627
|
+
|
6628
|
+
// @option opacity: Number = 0.9
|
6629
|
+
// Tooltip container opacity.
|
6630
|
+
opacity: 0.9
|
6631
|
+
},
|
6632
|
+
|
6633
|
+
onAdd: function (map) {
|
6634
|
+
L.DivOverlay.prototype.onAdd.call(this, map);
|
6635
|
+
this.setOpacity(this.options.opacity);
|
6636
|
+
|
6637
|
+
// @namespace Map
|
6638
|
+
// @section Tooltip events
|
6639
|
+
// @event tooltipopen: TooltipEvent
|
6640
|
+
// Fired when a tooltip is opened in the map.
|
6641
|
+
map.fire('tooltipopen', {tooltip: this});
|
6642
|
+
|
6643
|
+
if (this._source) {
|
6644
|
+
// @namespace Layer
|
6645
|
+
// @section Tooltip events
|
6646
|
+
// @event tooltipopen: TooltipEvent
|
6647
|
+
// Fired when a tooltip bound to this layer is opened.
|
6648
|
+
this._source.fire('tooltipopen', {tooltip: this}, true);
|
6649
|
+
}
|
6650
|
+
},
|
6651
|
+
|
6652
|
+
onRemove: function (map) {
|
6653
|
+
L.DivOverlay.prototype.onRemove.call(this, map);
|
6654
|
+
|
6655
|
+
// @namespace Map
|
6656
|
+
// @section Tooltip events
|
6657
|
+
// @event tooltipclose: TooltipEvent
|
6658
|
+
// Fired when a tooltip in the map is closed.
|
6659
|
+
map.fire('tooltipclose', {tooltip: this});
|
6660
|
+
|
6661
|
+
if (this._source) {
|
6662
|
+
// @namespace Layer
|
6663
|
+
// @section Tooltip events
|
6664
|
+
// @event tooltipclose: TooltipEvent
|
6665
|
+
// Fired when a tooltip bound to this layer is closed.
|
6666
|
+
this._source.fire('tooltipclose', {tooltip: this}, true);
|
6667
|
+
}
|
6668
|
+
},
|
6669
|
+
|
6670
|
+
_close: function () {
|
6671
|
+
if (this._map) {
|
6672
|
+
this._map.closeTooltip(this);
|
6673
|
+
}
|
6674
|
+
},
|
6675
|
+
|
6676
|
+
_initLayout: function () {
|
6677
|
+
var prefix = 'leaflet-tooltip',
|
6678
|
+
className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');
|
6679
|
+
|
6680
|
+
this._contentNode = this._container = L.DomUtil.create('div', className);
|
6681
|
+
},
|
6682
|
+
|
6683
|
+
_updateLayout: function () {},
|
6684
|
+
|
6685
|
+
_adjustPan: function () {},
|
6686
|
+
|
6687
|
+
_updatePosition: function () {
|
6688
|
+
var map = this._map,
|
6689
|
+
pos = map.latLngToLayerPoint(this._latlng),
|
6690
|
+
container = this._container,
|
6691
|
+
centerPoint = map.latLngToContainerPoint(map.getCenter()),
|
6692
|
+
tooltipPoint = map.layerPointToContainerPoint(pos),
|
6693
|
+
direction = this.options.direction,
|
6694
|
+
tooltipWidth = container.offsetWidth,
|
6695
|
+
tooltipHeight = container.offsetHeight,
|
6696
|
+
offset = L.point(this.options.offset),
|
6697
|
+
anchor = this._getAnchor();
|
6698
|
+
|
6699
|
+
if (direction === 'top') {
|
6700
|
+
pos = pos.add(L.point(-tooltipWidth / 2, -tooltipHeight + offset.y + anchor.y));
|
6701
|
+
} else if (direction === 'bottom') {
|
6702
|
+
pos = pos.subtract(L.point(tooltipWidth / 2, offset.y));
|
6703
|
+
} else if (direction === 'center') {
|
6704
|
+
pos = pos.subtract(L.point(tooltipWidth / 2, tooltipHeight / 2 - anchor.y));
|
6705
|
+
} else if (direction === 'right' || direction === 'auto' && tooltipPoint.x < centerPoint.x) {
|
6706
|
+
direction = 'right';
|
6707
|
+
pos = pos.add([offset.x + anchor.x, anchor.y - tooltipHeight / 2]);
|
6708
|
+
} else {
|
6709
|
+
direction = 'left';
|
6710
|
+
pos = pos.subtract(L.point(offset.x + tooltipWidth + anchor.x, tooltipHeight / 2 - anchor.y));
|
6711
|
+
}
|
6712
|
+
|
6713
|
+
L.DomUtil.removeClass(container, 'leaflet-tooltip-right');
|
6714
|
+
L.DomUtil.removeClass(container, 'leaflet-tooltip-left');
|
6715
|
+
L.DomUtil.removeClass(container, 'leaflet-tooltip-top');
|
6716
|
+
L.DomUtil.removeClass(container, 'leaflet-tooltip-bottom');
|
6717
|
+
L.DomUtil.addClass(container, 'leaflet-tooltip-' + direction);
|
6718
|
+
L.DomUtil.setPosition(container, pos);
|
6719
|
+
},
|
6720
|
+
|
6721
|
+
setOpacity: function (opacity) {
|
6722
|
+
this.options.opacity = opacity;
|
6723
|
+
|
6724
|
+
if (this._container) {
|
6725
|
+
L.DomUtil.setOpacity(this._container, opacity);
|
6726
|
+
}
|
6727
|
+
},
|
6728
|
+
|
6729
|
+
_animateZoom: function (e) {
|
6730
|
+
var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center), offset;
|
6731
|
+
if (this.options.offset) {
|
6732
|
+
offset = L.point(this.options.offset);
|
6733
|
+
pos = pos.add(offset);
|
6734
|
+
}
|
6735
|
+
L.DomUtil.setPosition(this._container, pos);
|
6736
|
+
},
|
6737
|
+
|
6738
|
+
_getAnchor: function () {
|
6739
|
+
// Where should we anchor the tooltip on the source layer?
|
6740
|
+
return L.point(this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);
|
6741
|
+
}
|
6742
|
+
|
6743
|
+
});
|
6744
|
+
|
6745
|
+
// @namespace Tooltip
|
6746
|
+
// @factory L.tooltip(options?: Tooltip options, source?: Layer)
|
6747
|
+
// Instantiates a Tooltip object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers.
|
6748
|
+
L.tooltip = function (options, source) {
|
6749
|
+
return new L.Tooltip(options, source);
|
6750
|
+
};
|
6751
|
+
|
6752
|
+
// @namespace Map
|
6753
|
+
// @section Methods for Layers and Controls
|
6754
|
+
L.Map.include({
|
6755
|
+
|
6756
|
+
// @method openTooltip(tooltip: Tooltip): this
|
6757
|
+
// Opens the specified tooltip.
|
6758
|
+
// @alternative
|
6759
|
+
// @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this
|
6760
|
+
// Creates a tooltip with the specified content and options and open it.
|
6761
|
+
openTooltip: function (tooltip, latlng, options) {
|
6762
|
+
if (!(tooltip instanceof L.Tooltip)) {
|
6763
|
+
tooltip = new L.Tooltip(options).setContent(tooltip);
|
6764
|
+
}
|
6765
|
+
|
6766
|
+
if (latlng) {
|
6767
|
+
tooltip.setLatLng(latlng);
|
6768
|
+
}
|
6769
|
+
|
6770
|
+
if (this.hasLayer(tooltip)) {
|
6771
|
+
return this;
|
6772
|
+
}
|
6773
|
+
|
6774
|
+
return this.addLayer(tooltip);
|
6775
|
+
},
|
6776
|
+
|
6777
|
+
// @method closeTooltip(tooltip?: Tooltip): this
|
6778
|
+
// Closes the tooltip given as parameter.
|
6779
|
+
closeTooltip: function (tooltip) {
|
6780
|
+
if (tooltip) {
|
6781
|
+
this.removeLayer(tooltip);
|
6782
|
+
}
|
6783
|
+
return this;
|
6784
|
+
}
|
6785
|
+
|
6786
|
+
});
|
6787
|
+
|
6788
|
+
|
6789
|
+
|
6790
|
+
/*
|
6791
|
+
* @namespace Layer
|
6792
|
+
* @section Tooltip methods example
|
6793
|
+
*
|
6794
|
+
* All layers share a set of methods convenient for binding tooltips to it.
|
6795
|
+
*
|
6796
|
+
* ```js
|
6797
|
+
* var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
|
6798
|
+
* layer.openTooltip();
|
6799
|
+
* layer.closeTooltip();
|
6800
|
+
* ```
|
6801
|
+
*/
|
6802
|
+
|
6803
|
+
// @section Tooltip methods
|
6804
|
+
L.Layer.include({
|
6805
|
+
|
6806
|
+
// @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this
|
6807
|
+
// Binds a tooltip to the layer with the passed `content` and sets up the
|
6808
|
+
// neccessary event listeners. If a `Function` is passed it will receive
|
6809
|
+
// the layer as the first argument and should return a `String` or `HTMLElement`.
|
6810
|
+
bindTooltip: function (content, options) {
|
6811
|
+
|
6812
|
+
if (content instanceof L.Tooltip) {
|
6813
|
+
L.setOptions(content, options);
|
6814
|
+
this._tooltip = content;
|
6815
|
+
content._source = this;
|
6816
|
+
} else {
|
6817
|
+
if (!this._tooltip || options) {
|
6818
|
+
this._tooltip = L.tooltip(options, this);
|
6819
|
+
}
|
6820
|
+
this._tooltip.setContent(content);
|
6821
|
+
|
6822
|
+
}
|
6823
|
+
|
6824
|
+
this._initTooltipInteractions();
|
6825
|
+
|
6826
|
+
if (this._tooltip.options.permanent) { this.openTooltip(); }
|
6827
|
+
|
6828
|
+
return this;
|
6829
|
+
},
|
6830
|
+
|
6831
|
+
// @method unbindTooltip(): this
|
6832
|
+
// Removes the tooltip previously bound with `bindTooltip`.
|
6833
|
+
unbindTooltip: function () {
|
6834
|
+
if (this._tooltip) {
|
6835
|
+
this._initTooltipInteractions(true);
|
6836
|
+
this.closeTooltip();
|
6837
|
+
this._tooltip = null;
|
6838
|
+
}
|
6839
|
+
return this;
|
6840
|
+
},
|
6841
|
+
|
6842
|
+
_initTooltipInteractions: function (remove) {
|
6843
|
+
if (!remove && this._tooltipHandlersAdded) { return; }
|
6844
|
+
var onOff = remove ? 'off' : 'on',
|
6845
|
+
events = {
|
6846
|
+
remove: this.closeTooltip,
|
6847
|
+
move: this._moveTooltip
|
6848
|
+
};
|
6849
|
+
if (!this._tooltip.options.permanent) {
|
6850
|
+
events.mouseover = this._openTooltip;
|
6851
|
+
events.mouseout = this.closeTooltip;
|
6852
|
+
if (this._tooltip.options.sticky) {
|
6853
|
+
events.mousemove = this._moveTooltip;
|
6854
|
+
}
|
6855
|
+
if (L.Browser.touch) {
|
6856
|
+
events.click = this._openTooltip;
|
6857
|
+
}
|
6858
|
+
}
|
6859
|
+
this[onOff](events);
|
6860
|
+
this._tooltipHandlersAdded = !remove;
|
6861
|
+
},
|
6862
|
+
|
6863
|
+
// @method openTooltip(latlng?: LatLng): this
|
6864
|
+
// Opens the bound tooltip at the specificed `latlng` or at the default tooltip anchor if no `latlng` is passed.
|
6865
|
+
openTooltip: function (layer, latlng) {
|
6866
|
+
if (!(layer instanceof L.Layer)) {
|
6867
|
+
latlng = layer;
|
6868
|
+
layer = this;
|
6869
|
+
}
|
6870
|
+
|
6871
|
+
if (layer instanceof L.FeatureGroup) {
|
6872
|
+
for (var id in this._layers) {
|
6873
|
+
layer = this._layers[id];
|
6874
|
+
break;
|
6875
|
+
}
|
6876
|
+
}
|
6877
|
+
|
6878
|
+
if (!latlng) {
|
6879
|
+
latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();
|
6880
|
+
}
|
6881
|
+
|
6882
|
+
if (this._tooltip && this._map) {
|
6883
|
+
|
6884
|
+
// set tooltip source to this layer
|
6885
|
+
this._tooltip._source = layer;
|
6886
|
+
|
6887
|
+
// update the tooltip (content, layout, ect...)
|
6888
|
+
this._tooltip.update();
|
6889
|
+
|
6890
|
+
// open the tooltip on the map
|
6891
|
+
this._map.openTooltip(this._tooltip, latlng);
|
6892
|
+
|
6893
|
+
// Tooltip container may not be defined if not permanent and never
|
6894
|
+
// opened.
|
6895
|
+
if (this._tooltip.options.interactive && this._tooltip._container) {
|
6896
|
+
L.DomUtil.addClass(this._tooltip._container, 'leaflet-clickable');
|
6897
|
+
this.addInteractiveTarget(this._tooltip._container);
|
6898
|
+
}
|
6899
|
+
}
|
6900
|
+
|
6901
|
+
return this;
|
6902
|
+
},
|
6903
|
+
|
6904
|
+
// @method closeTooltip(): this
|
6905
|
+
// Closes the tooltip bound to this layer if it is open.
|
6906
|
+
closeTooltip: function () {
|
6907
|
+
if (this._tooltip) {
|
6908
|
+
this._tooltip._close();
|
6909
|
+
if (this._tooltip.options.interactive) {
|
6910
|
+
L.DomUtil.removeClass(this._tooltip._container, 'leaflet-clickable');
|
6911
|
+
this.removeInteractiveTarget(this._tooltip._container);
|
6912
|
+
}
|
6913
|
+
}
|
6914
|
+
return this;
|
6915
|
+
},
|
6916
|
+
|
6917
|
+
// @method toggleTooltip(): this
|
6918
|
+
// Opens or closes the tooltip bound to this layer depending on its current state.
|
6919
|
+
toggleTooltip: function (target) {
|
6920
|
+
if (this._tooltip) {
|
6921
|
+
if (this._tooltip._map) {
|
6922
|
+
this.closeTooltip();
|
6923
|
+
} else {
|
6924
|
+
this.openTooltip(target);
|
6925
|
+
}
|
6926
|
+
}
|
6927
|
+
return this;
|
6928
|
+
},
|
6929
|
+
|
6930
|
+
// @method isTooltipOpen(): boolean
|
6931
|
+
// Returns `true` if the tooltip bound to this layer is currently open.
|
6932
|
+
isTooltipOpen: function () {
|
6933
|
+
return this._tooltip.isOpen();
|
6934
|
+
},
|
6935
|
+
|
6936
|
+
// @method setTooltipContent(content: String|HTMLElement|Tooltip): this
|
6937
|
+
// Sets the content of the tooltip bound to this layer.
|
6938
|
+
setTooltipContent: function (content) {
|
6939
|
+
if (this._tooltip) {
|
6940
|
+
this._tooltip.setContent(content);
|
6941
|
+
}
|
6942
|
+
return this;
|
6943
|
+
},
|
6944
|
+
|
6945
|
+
// @method getTooltip(): Tooltip
|
6946
|
+
// Returns the tooltip bound to this layer.
|
6947
|
+
getTooltip: function () {
|
6948
|
+
return this._tooltip;
|
6949
|
+
},
|
6950
|
+
|
6951
|
+
_openTooltip: function (e) {
|
6952
|
+
var layer = e.layer || e.target;
|
6953
|
+
|
6954
|
+
if (!this._tooltip || !this._map) {
|
6955
|
+
return;
|
6956
|
+
}
|
6957
|
+
this.openTooltip(layer, this._tooltip.options.sticky ? e.latlng : undefined);
|
6958
|
+
},
|
6959
|
+
|
6960
|
+
_moveTooltip: function (e) {
|
6961
|
+
var latlng = e.latlng, containerPoint, layerPoint;
|
6962
|
+
if (this._tooltip.options.sticky && e.originalEvent) {
|
6963
|
+
containerPoint = this._map.mouseEventToContainerPoint(e.originalEvent);
|
6964
|
+
layerPoint = this._map.containerPointToLayerPoint(containerPoint);
|
6965
|
+
latlng = this._map.layerPointToLatLng(layerPoint);
|
6966
|
+
}
|
6967
|
+
this._tooltip.setLatLng(latlng);
|
6968
|
+
}
|
6969
|
+
});
|
6970
|
+
|
6971
|
+
|
6972
|
+
|
6973
|
+
/*
|
6974
|
+
* Tooltip extension to L.Marker, adding tooltip-related methods.
|
6975
|
+
*/
|
6976
|
+
|
6977
|
+
L.Marker.include({
|
6978
|
+
_getTooltipAnchor: function () {
|
6979
|
+
return this.options.icon.options.tooltipAnchor || [0, 0];
|
6980
|
+
}
|
6981
|
+
});
|
6982
|
+
|
6983
|
+
|
6984
|
+
|
6464
6985
|
/*
|
6465
6986
|
* @class LayerGroup
|
6466
6987
|
* @aka L.LayerGroup
|
@@ -6539,7 +7060,7 @@ L.LayerGroup = L.Layer.extend({
|
|
6539
7060
|
return this;
|
6540
7061
|
},
|
6541
7062
|
|
6542
|
-
// @method invoke(methodName:
|
7063
|
+
// @method invoke(methodName: String, …): this
|
6543
7064
|
// Calls `methodName` on every layer contained in this group, passing any
|
6544
7065
|
// additional parameters. Has no effect if the layers contained do not
|
6545
7066
|
// implement `methodName`.
|
@@ -6727,6 +7248,8 @@ L.featureGroup = function (layers) {
|
|
6727
7248
|
|
6728
7249
|
L.Renderer = L.Layer.extend({
|
6729
7250
|
|
7251
|
+
// @section
|
7252
|
+
// @aka Renderer options
|
6730
7253
|
options: {
|
6731
7254
|
// @option padding: Number = 0.1
|
6732
7255
|
// How much to extend the clip area around the map view (relative to its size)
|
@@ -6855,7 +7378,7 @@ L.Map.include({
|
|
6855
7378
|
/*
|
6856
7379
|
* @class Path
|
6857
7380
|
* @aka L.Path
|
6858
|
-
* @inherits
|
7381
|
+
* @inherits Interactive layer
|
6859
7382
|
*
|
6860
7383
|
* An abstract class that contains options and constants shared between vector
|
6861
7384
|
* overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`.
|
@@ -6891,11 +7414,11 @@ L.Path = L.Layer.extend({
|
|
6891
7414
|
lineJoin: 'round',
|
6892
7415
|
|
6893
7416
|
// @option dashArray: String = null
|
6894
|
-
// A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on
|
7417
|
+
// A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).
|
6895
7418
|
dashArray: null,
|
6896
7419
|
|
6897
7420
|
// @option dashOffset: String = null
|
6898
|
-
// A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on
|
7421
|
+
// A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).
|
6899
7422
|
dashOffset: null,
|
6900
7423
|
|
6901
7424
|
// @option fill: Boolean = depends
|
@@ -6916,8 +7439,7 @@ L.Path = L.Layer.extend({
|
|
6916
7439
|
|
6917
7440
|
// className: '',
|
6918
7441
|
|
6919
|
-
//
|
6920
|
-
// If `false`, the vector will not emit mouse events and will act as a part of the underlying map.
|
7442
|
+
// Option inherited from "Interactive layer" abstract class
|
6921
7443
|
interactive: true
|
6922
7444
|
},
|
6923
7445
|
|
@@ -7109,6 +7631,7 @@ L.LineUtil = {
|
|
7109
7631
|
},
|
7110
7632
|
|
7111
7633
|
|
7634
|
+
// @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean
|
7112
7635
|
// Clips the segment a to b by rectangular bounds with the
|
7113
7636
|
// [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm)
|
7114
7637
|
// (modifying the segment points directly!). Used by Leaflet to only show polyline
|
@@ -7124,10 +7647,14 @@ L.LineUtil = {
|
|
7124
7647
|
|
7125
7648
|
while (true) {
|
7126
7649
|
// if a,b is inside the clip window (trivial accept)
|
7127
|
-
if (!(codeA | codeB)) {
|
7650
|
+
if (!(codeA | codeB)) {
|
7651
|
+
return [a, b];
|
7652
|
+
}
|
7128
7653
|
|
7129
7654
|
// if a,b is outside the clip window (trivial reject)
|
7130
|
-
if (codeA & codeB) {
|
7655
|
+
if (codeA & codeB) {
|
7656
|
+
return false;
|
7657
|
+
}
|
7131
7658
|
|
7132
7659
|
// other cases
|
7133
7660
|
codeOut = codeA || codeB;
|
@@ -7266,13 +7793,15 @@ L.LineUtil = {
|
|
7266
7793
|
|
7267
7794
|
L.Polyline = L.Path.extend({
|
7268
7795
|
|
7796
|
+
// @section
|
7797
|
+
// @aka Polyline options
|
7269
7798
|
options: {
|
7270
7799
|
// @option smoothFactor: Number = 1.0
|
7271
7800
|
// How much to simplify the polyline on each zoom level. More means
|
7272
7801
|
// better performance and smoother look, and less means more accurate representation.
|
7273
7802
|
smoothFactor: 1.0,
|
7274
7803
|
|
7275
|
-
// @option noClip: Boolean
|
7804
|
+
// @option noClip: Boolean = false
|
7276
7805
|
// Disable polyline clipping.
|
7277
7806
|
noClip: false
|
7278
7807
|
},
|
@@ -7503,7 +8032,7 @@ L.Polyline = L.Path.extend({
|
|
7503
8032
|
}
|
7504
8033
|
});
|
7505
8034
|
|
7506
|
-
// @factory L.polyline(latlngs: LatLng[], options?:
|
8035
|
+
// @factory L.polyline(latlngs: LatLng[], options?: Polyline options)
|
7507
8036
|
// Instantiates a polyline object given an array of geographical points and
|
7508
8037
|
// optionally an options object. You can create a `Polyline` object with
|
7509
8038
|
// multiple separate lines (`MultiPolyline`) by passing an array of arrays
|
@@ -7794,6 +8323,8 @@ L.rectangle = function (latLngBounds, options) {
|
|
7794
8323
|
|
7795
8324
|
L.CircleMarker = L.Path.extend({
|
7796
8325
|
|
8326
|
+
// @section
|
8327
|
+
// @aka CircleMarker options
|
7797
8328
|
options: {
|
7798
8329
|
fill: true,
|
7799
8330
|
|
@@ -7871,8 +8402,8 @@ L.CircleMarker = L.Path.extend({
|
|
7871
8402
|
});
|
7872
8403
|
|
7873
8404
|
|
7874
|
-
// @factory L.circleMarker(latlng: LatLng, options
|
7875
|
-
//
|
8405
|
+
// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options)
|
8406
|
+
// Instantiates a circle marker object given a geographical point, and an optional options object.
|
7876
8407
|
L.circleMarker = function (latlng, options) {
|
7877
8408
|
return new L.CircleMarker(latlng, options);
|
7878
8409
|
};
|
@@ -7907,6 +8438,8 @@ L.Circle = L.CircleMarker.extend({
|
|
7907
8438
|
|
7908
8439
|
if (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); }
|
7909
8440
|
|
8441
|
+
// @section
|
8442
|
+
// @aka Circle options
|
7910
8443
|
// @option radius: Number; Radius of the circle, in meters.
|
7911
8444
|
this._mRadius = this.options.radius;
|
7912
8445
|
},
|
@@ -7972,11 +8505,11 @@ L.Circle = L.CircleMarker.extend({
|
|
7972
8505
|
}
|
7973
8506
|
});
|
7974
8507
|
|
7975
|
-
// @factory L.circle(latlng: LatLng, options?:
|
8508
|
+
// @factory L.circle(latlng: LatLng, options?: Circle options)
|
7976
8509
|
// Instantiates a circle object given a geographical point, and an options object
|
7977
8510
|
// which contains the circle radius.
|
7978
8511
|
// @alternative
|
7979
|
-
// @factory L.circle(latlng: LatLng, radius: Number, options?:
|
8512
|
+
// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options)
|
7980
8513
|
// Obsolete way of instantiating a circle, for compatibility with 0.7.x code.
|
7981
8514
|
// Do not use in new applications or plugins.
|
7982
8515
|
L.circle = function (latlng, options, legacyOptions) {
|
@@ -8073,7 +8606,7 @@ L.SVG = L.Renderer.extend({
|
|
8073
8606
|
var path = layer._path = L.SVG.create('path');
|
8074
8607
|
|
8075
8608
|
// @namespace Path
|
8076
|
-
// @option className:
|
8609
|
+
// @option className: String = null
|
8077
8610
|
// Custom class name set on an element. Only for SVG renderer.
|
8078
8611
|
if (layer.options.className) {
|
8079
8612
|
L.DomUtil.addClass(path, layer.options.className);
|
@@ -8183,7 +8716,7 @@ L.extend(L.SVG, {
|
|
8183
8716
|
return document.createElementNS('http://www.w3.org/2000/svg', name);
|
8184
8717
|
},
|
8185
8718
|
|
8186
|
-
// @function pointsToPath(rings: [], closed: Boolean): String
|
8719
|
+
// @function pointsToPath(rings: Point[], closed: Boolean): String
|
8187
8720
|
// Generates a SVG path string for multiple rings, with each ring turning
|
8188
8721
|
// into "M..L..L.." instructions
|
8189
8722
|
pointsToPath: function (rings, closed) {
|
@@ -8213,7 +8746,7 @@ L.Browser.svg = !!(document.createElementNS && L.SVG.create('svg').createSVGRect
|
|
8213
8746
|
|
8214
8747
|
|
8215
8748
|
// @namespace SVG
|
8216
|
-
// @factory L.svg(options?:
|
8749
|
+
// @factory L.svg(options?: Renderer options)
|
8217
8750
|
// Creates a SVG renderer with the given options.
|
8218
8751
|
L.svg = function (options) {
|
8219
8752
|
return L.Browser.svg || L.Browser.vml ? new L.SVG(options) : null;
|
@@ -8530,7 +9063,7 @@ L.Canvas = L.Renderer.extend({
|
|
8530
9063
|
|
8531
9064
|
for (var id in this._layers) {
|
8532
9065
|
layer = this._layers[id];
|
8533
|
-
if (!bounds || layer._pxBounds.intersects(bounds)) {
|
9066
|
+
if (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) {
|
8534
9067
|
layer._updatePath();
|
8535
9068
|
}
|
8536
9069
|
if (clear && layer._removed) {
|
@@ -8632,7 +9165,7 @@ L.Canvas = L.Renderer.extend({
|
|
8632
9165
|
|
8633
9166
|
for (var id in this._layers) {
|
8634
9167
|
layer = this._layers[id];
|
8635
|
-
if (layer.options.interactive && layer._containsPoint(point)) {
|
9168
|
+
if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) {
|
8636
9169
|
L.DomEvent._fakeStop(e);
|
8637
9170
|
layers.push(layer);
|
8638
9171
|
}
|
@@ -8695,7 +9228,7 @@ L.Browser.canvas = (function () {
|
|
8695
9228
|
}());
|
8696
9229
|
|
8697
9230
|
// @namespace Canvas
|
8698
|
-
// @factory L.canvas(options?:
|
9231
|
+
// @factory L.canvas(options?: Renderer options)
|
8699
9232
|
// Creates a Canvas renderer with the given options.
|
8700
9233
|
L.canvas = function (options) {
|
8701
9234
|
return L.Browser.canvas ? new L.Canvas(options) : null;
|
@@ -8799,11 +9332,11 @@ L.GeoJSON = L.FeatureGroup.extend({
|
|
8799
9332
|
* ```
|
8800
9333
|
*
|
8801
9334
|
* @option onEachFeature: Function = *
|
8802
|
-
* A `Function` that will be called once for each created `
|
9335
|
+
* A `Function` that will be called once for each created `Feature`, after it has
|
8803
9336
|
* been created and styled. Useful for attaching events and popups to features.
|
8804
9337
|
* The default is to do nothing with the newly created layers:
|
8805
9338
|
* ```js
|
8806
|
-
* function (layer) {}
|
9339
|
+
* function (feature, layer) {}
|
8807
9340
|
* ```
|
8808
9341
|
*
|
8809
9342
|
* @option filter: Function = *
|
@@ -8830,6 +9363,8 @@ L.GeoJSON = L.FeatureGroup.extend({
|
|
8830
9363
|
}
|
8831
9364
|
},
|
8832
9365
|
|
9366
|
+
// @function addData( <GeoJSON> data ): Layer
|
9367
|
+
// Adds a GeoJSON object to the layer.
|
8833
9368
|
addData: function (geojson) {
|
8834
9369
|
var features = L.Util.isArray(geojson) ? geojson : geojson.features,
|
8835
9370
|
i, len, feature;
|
@@ -8865,6 +9400,8 @@ L.GeoJSON = L.FeatureGroup.extend({
|
|
8865
9400
|
return this.addLayer(layer);
|
8866
9401
|
},
|
8867
9402
|
|
9403
|
+
// @function resetStyle( <Path> layer ): Layer
|
9404
|
+
// Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.
|
8868
9405
|
resetStyle: function (layer) {
|
8869
9406
|
// reset any custom styles
|
8870
9407
|
layer.options = L.Util.extend({}, layer.defaultOptions);
|
@@ -8872,6 +9409,8 @@ L.GeoJSON = L.FeatureGroup.extend({
|
|
8872
9409
|
return this;
|
8873
9410
|
},
|
8874
9411
|
|
9412
|
+
// @function setStyle( <Function> style ): Layer
|
9413
|
+
// Changes styles of GeoJSON vector layers with the given style function.
|
8875
9414
|
setStyle: function (style) {
|
8876
9415
|
return this.eachLayer(function (layer) {
|
8877
9416
|
this._setLayerStyle(layer, style);
|
@@ -9175,14 +9714,15 @@ L.DomEvent = {
|
|
9175
9714
|
return this;
|
9176
9715
|
},
|
9177
9716
|
|
9178
|
-
// @function off(el: HTMLElement, types: String, fn: Function, context?: Object)
|
9717
|
+
// @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this
|
9179
9718
|
// Removes a previously added listener function. If no function is specified,
|
9180
9719
|
// it will remove all the listeners of that particular DOM event from the element.
|
9181
9720
|
// Note that if you passed a custom context to on, you must pass the same
|
9182
9721
|
// context to `off` in order to remove the listener.
|
9183
9722
|
|
9184
9723
|
// @alternative
|
9185
|
-
// @function off(el: HTMLElement,
|
9724
|
+
// @function off(el: HTMLElement, eventMap: Object, context?: Object): this
|
9725
|
+
// Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
|
9186
9726
|
off: function (obj, types, fn, context) {
|
9187
9727
|
|
9188
9728
|
if (typeof types === 'object') {
|
@@ -9362,19 +9902,26 @@ L.DomEvent = {
|
|
9362
9902
|
e.clientY - rect.top - container.clientTop);
|
9363
9903
|
},
|
9364
9904
|
|
9905
|
+
// Chrome on Win scrolls double the pixels as in other platforms (see #4538),
|
9906
|
+
// and Firefox scrolls device pixels, not CSS pixels
|
9907
|
+
_wheelPxFactor: (L.Browser.win && L.Browser.chrome) ? 2 :
|
9908
|
+
L.Browser.gecko ? window.devicePixelRatio :
|
9909
|
+
1,
|
9910
|
+
|
9365
9911
|
// @function getWheelDelta(ev: DOMEvent): Number
|
9366
9912
|
// Gets normalized wheel delta from a mousewheel DOM event, in vertical
|
9367
9913
|
// pixels scrolled (negative if scrolling down).
|
9368
9914
|
// Events from pointing devices without precise scrolling are mapped to
|
9369
|
-
// a best guess of
|
9915
|
+
// a best guess of 60 pixels.
|
9370
9916
|
getWheelDelta: function (e) {
|
9371
|
-
return (
|
9372
|
-
(e.deltaY && e.deltaMode ===
|
9373
|
-
(e.deltaY && e.deltaMode ===
|
9917
|
+
return (L.Browser.edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta
|
9918
|
+
(e.deltaY && e.deltaMode === 0) ? -e.deltaY / L.DomEvent._wheelPxFactor : // Pixels
|
9919
|
+
(e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines
|
9920
|
+
(e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages
|
9374
9921
|
(e.deltaX || e.deltaZ) ? 0 : // Skip horizontal/depth wheel events
|
9375
9922
|
e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels
|
9376
|
-
(e.detail && Math.abs(e.detail) < 32765) ? -e.detail *
|
9377
|
-
e.detail ? e.detail / -32765 *
|
9923
|
+
(e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines
|
9924
|
+
e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages
|
9378
9925
|
0;
|
9379
9926
|
},
|
9380
9927
|
|
@@ -9513,7 +10060,9 @@ L.Draggable = L.Evented.extend({
|
|
9513
10060
|
// Ignore simulated events, since we handle both touch and
|
9514
10061
|
// mouse explicitly; otherwise we risk getting duplicates of
|
9515
10062
|
// touch events, see #4315.
|
9516
|
-
|
10063
|
+
// Also ignore the event if disabled; this happens in IE11
|
10064
|
+
// under some circumstances, see #3666.
|
10065
|
+
if (e._simulated || !this._enabled) { return; }
|
9517
10066
|
|
9518
10067
|
this._moved = false;
|
9519
10068
|
|
@@ -9538,7 +10087,6 @@ L.Draggable = L.Evented.extend({
|
|
9538
10087
|
var first = e.touches ? e.touches[0] : e;
|
9539
10088
|
|
9540
10089
|
this._startPoint = new L.Point(first.clientX, first.clientY);
|
9541
|
-
this._startPos = this._newPos = L.DomUtil.getPosition(this._element);
|
9542
10090
|
|
9543
10091
|
L.DomEvent
|
9544
10092
|
.on(document, L.Draggable.MOVE[e.type], this._onMove, this)
|
@@ -9549,7 +10097,9 @@ L.Draggable = L.Evented.extend({
|
|
9549
10097
|
// Ignore simulated events, since we handle both touch and
|
9550
10098
|
// mouse explicitly; otherwise we risk getting duplicates of
|
9551
10099
|
// touch events, see #4315.
|
9552
|
-
|
10100
|
+
// Also ignore the event if disabled; this happens in IE11
|
10101
|
+
// under some circumstances, see #3666.
|
10102
|
+
if (e._simulated || !this._enabled) { return; }
|
9553
10103
|
|
9554
10104
|
if (e.touches && e.touches.length > 1) {
|
9555
10105
|
this._moved = true;
|
@@ -9601,7 +10151,7 @@ L.Draggable = L.Evented.extend({
|
|
9601
10151
|
this.fire('predrag', e);
|
9602
10152
|
L.DomUtil.setPosition(this._element, this._newPos);
|
9603
10153
|
|
9604
|
-
// @event
|
10154
|
+
// @event drag: Event
|
9605
10155
|
// Fired continuously during dragging.
|
9606
10156
|
this.fire('drag', e);
|
9607
10157
|
},
|
@@ -9610,7 +10160,9 @@ L.Draggable = L.Evented.extend({
|
|
9610
10160
|
// Ignore simulated events, since we handle both touch and
|
9611
10161
|
// mouse explicitly; otherwise we risk getting duplicates of
|
9612
10162
|
// touch events, see #4315.
|
9613
|
-
|
10163
|
+
// Also ignore the event if disabled; this happens in IE11
|
10164
|
+
// under some circumstances, see #3666.
|
10165
|
+
if (e._simulated || !this._enabled) { return; }
|
9614
10166
|
|
9615
10167
|
L.DomUtil.removeClass(document.body, 'leaflet-dragging');
|
9616
10168
|
|
@@ -9632,7 +10184,7 @@ L.Draggable = L.Evented.extend({
|
|
9632
10184
|
// ensure drag is not fired after dragend
|
9633
10185
|
L.Util.cancelAnimFrame(this._animRequest);
|
9634
10186
|
|
9635
|
-
// @event dragend:
|
10187
|
+
// @event dragend: DragEndEvent
|
9636
10188
|
// Fired when the drag ends.
|
9637
10189
|
this.fire('dragend', {
|
9638
10190
|
distance: this._newPos.distanceTo(this._startPos)
|
@@ -9660,22 +10212,24 @@ L.Handler = L.Class.extend({
|
|
9660
10212
|
this._map = map;
|
9661
10213
|
},
|
9662
10214
|
|
9663
|
-
// @method enable()
|
10215
|
+
// @method enable(): this
|
9664
10216
|
// Enables the handler
|
9665
10217
|
enable: function () {
|
9666
|
-
if (this._enabled) { return; }
|
10218
|
+
if (this._enabled) { return this; }
|
9667
10219
|
|
9668
10220
|
this._enabled = true;
|
9669
10221
|
this.addHooks();
|
10222
|
+
return this;
|
9670
10223
|
},
|
9671
10224
|
|
9672
|
-
// @method disable()
|
10225
|
+
// @method disable(): this
|
9673
10226
|
// Disables the handler
|
9674
10227
|
disable: function () {
|
9675
|
-
if (!this._enabled) { return; }
|
10228
|
+
if (!this._enabled) { return this; }
|
9676
10229
|
|
9677
10230
|
this._enabled = false;
|
9678
10231
|
this.removeHooks();
|
10232
|
+
return this;
|
9679
10233
|
},
|
9680
10234
|
|
9681
10235
|
// @method enabled(): Boolean
|
@@ -9762,7 +10316,7 @@ L.Map.Drag = L.Handler.extend({
|
|
9762
10316
|
map.whenReady(this._onZoomEnd, this);
|
9763
10317
|
}
|
9764
10318
|
}
|
9765
|
-
L.DomUtil.addClass(this._map._container, 'leaflet-grab');
|
10319
|
+
L.DomUtil.addClass(this._map._container, 'leaflet-grab leaflet-touch-drag');
|
9766
10320
|
this._draggable.enable();
|
9767
10321
|
this._positions = [];
|
9768
10322
|
this._times = [];
|
@@ -9770,6 +10324,7 @@ L.Map.Drag = L.Handler.extend({
|
|
9770
10324
|
|
9771
10325
|
removeHooks: function () {
|
9772
10326
|
L.DomUtil.removeClass(this._map._container, 'leaflet-grab');
|
10327
|
+
L.DomUtil.removeClass(this._map._container, 'leaflet-touch-drag');
|
9773
10328
|
this._draggable.disable();
|
9774
10329
|
},
|
9775
10330
|
|
@@ -9930,7 +10485,7 @@ L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);
|
|
9930
10485
|
// @section Interaction Options
|
9931
10486
|
|
9932
10487
|
L.Map.mergeOptions({
|
9933
|
-
// @option doubleClickZoom: Boolean = true
|
10488
|
+
// @option doubleClickZoom: Boolean|String = true
|
9934
10489
|
// Whether the map can be zoomed in by double clicking on it and
|
9935
10490
|
// zoomed out by double clicking while holding shift. If passed
|
9936
10491
|
// `'center'`, double-click zoom will zoom to the center of the
|
@@ -9985,7 +10540,7 @@ L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);
|
|
9985
10540
|
// @section Interaction Options
|
9986
10541
|
L.Map.mergeOptions({
|
9987
10542
|
// @section Mousewheel options
|
9988
|
-
// @option scrollWheelZoom: Boolean = true
|
10543
|
+
// @option scrollWheelZoom: Boolean|String = true
|
9989
10544
|
// Whether the map can be zoomed by using the mouse wheel. If passed `'center'`,
|
9990
10545
|
// it will zoom to the center of the view regardless of where the mouse was.
|
9991
10546
|
scrollWheelZoom: true,
|
@@ -9995,11 +10550,11 @@ L.Map.mergeOptions({
|
|
9995
10550
|
// user can't zoom via wheel more often than once per 40 ms.
|
9996
10551
|
wheelDebounceTime: 40,
|
9997
10552
|
|
9998
|
-
// @option wheelPxPerZoomLevel: Number =
|
10553
|
+
// @option wheelPxPerZoomLevel: Number = 60
|
9999
10554
|
// How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta))
|
10000
10555
|
// mean a change of one full zoom level. Smaller values will make wheel-zooming
|
10001
10556
|
// faster (and vice versa).
|
10002
|
-
wheelPxPerZoomLevel:
|
10557
|
+
wheelPxPerZoomLevel: 60
|
10003
10558
|
});
|
10004
10559
|
|
10005
10560
|
L.Map.ScrollWheelZoom = L.Handler.extend({
|
@@ -10300,7 +10855,7 @@ L.extend(L.DomEvent, {
|
|
10300
10855
|
// @section Interaction Options
|
10301
10856
|
L.Map.mergeOptions({
|
10302
10857
|
// @section Touch interaction options
|
10303
|
-
// @option touchZoom: Boolean = *
|
10858
|
+
// @option touchZoom: Boolean|String = *
|
10304
10859
|
// Whether the map can be zoomed by touch-dragging with two fingers. If
|
10305
10860
|
// passed `'center'`, it will zoom to the center of the view regardless of
|
10306
10861
|
// where the touch events (fingers) were. Enabled for touch-capable web
|
@@ -10315,10 +10870,12 @@ L.Map.mergeOptions({
|
|
10315
10870
|
|
10316
10871
|
L.Map.TouchZoom = L.Handler.extend({
|
10317
10872
|
addHooks: function () {
|
10873
|
+
L.DomUtil.addClass(this._map._container, 'leaflet-touch-zoom');
|
10318
10874
|
L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);
|
10319
10875
|
},
|
10320
10876
|
|
10321
10877
|
removeHooks: function () {
|
10878
|
+
L.DomUtil.removeClass(this._map._container, 'leaflet-touch-zoom');
|
10322
10879
|
L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);
|
10323
10880
|
},
|
10324
10881
|
|
@@ -11062,15 +11619,31 @@ L.control = function (options) {
|
|
11062
11619
|
return new L.Control(options);
|
11063
11620
|
};
|
11064
11621
|
|
11622
|
+
/* @section Extension methods
|
11623
|
+
* @uninheritable
|
11624
|
+
*
|
11625
|
+
* Every control should extend from `L.Control` and (re-)implement the following methods.
|
11626
|
+
*
|
11627
|
+
* @method onAdd(map: Map): HTMLElement
|
11628
|
+
* Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo).
|
11629
|
+
*
|
11630
|
+
* @method onRemove(map: Map)
|
11631
|
+
* Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove).
|
11632
|
+
*/
|
11065
11633
|
|
11066
|
-
|
11067
|
-
|
11634
|
+
/* @namespace Map
|
11635
|
+
* @section Methods for Layers and Controls
|
11636
|
+
*/
|
11068
11637
|
L.Map.include({
|
11638
|
+
// @method addControl(control: Control): this
|
11639
|
+
// Adds the given control to the map
|
11069
11640
|
addControl: function (control) {
|
11070
11641
|
control.addTo(this);
|
11071
11642
|
return this;
|
11072
11643
|
},
|
11073
11644
|
|
11645
|
+
// @method removeControl(control: Control): this
|
11646
|
+
// Removes the given control from the map
|
11074
11647
|
removeControl: function (control) {
|
11075
11648
|
control.remove();
|
11076
11649
|
return this;
|
@@ -11576,8 +12149,8 @@ L.Control.Layers = L.Control.extend({
|
|
11576
12149
|
onRemove: function () {
|
11577
12150
|
this._map.off('zoomend', this._checkDisabledLayers, this);
|
11578
12151
|
|
11579
|
-
for (var
|
11580
|
-
this._layers[
|
12152
|
+
for (var i = 0; i < this._layers.length; i++) {
|
12153
|
+
this._layers[i].layer.off('add remove', this._onLayerChange, this);
|
11581
12154
|
}
|
11582
12155
|
},
|
11583
12156
|
|
@@ -11601,7 +12174,9 @@ L.Control.Layers = L.Control.extend({
|
|
11601
12174
|
layer.off('add remove', this._onLayerChange, this);
|
11602
12175
|
|
11603
12176
|
var obj = this._getLayer(L.stamp(layer));
|
11604
|
-
|
12177
|
+
if (obj) {
|
12178
|
+
this._layers.splice(this._layers.indexOf(obj), 1);
|
12179
|
+
}
|
11605
12180
|
return (this._map) ? this._update() : this;
|
11606
12181
|
},
|
11607
12182
|
|
@@ -11681,8 +12256,9 @@ L.Control.Layers = L.Control.extend({
|
|
11681
12256
|
},
|
11682
12257
|
|
11683
12258
|
_getLayer: function (id) {
|
11684
|
-
for (var i = 0; i
|
11685
|
-
|
12259
|
+
for (var i = 0; i < this._layers.length; i++) {
|
12260
|
+
|
12261
|
+
if (this._layers[i] && L.stamp(this._layers[i].layer) === id) {
|
11686
12262
|
return this._layers[i];
|
11687
12263
|
}
|
11688
12264
|
}
|
@@ -11711,7 +12287,7 @@ L.Control.Layers = L.Control.extend({
|
|
11711
12287
|
|
11712
12288
|
var baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0;
|
11713
12289
|
|
11714
|
-
for (i
|
12290
|
+
for (i = 0; i < this._layers.length; i++) {
|
11715
12291
|
obj = this._layers[i];
|
11716
12292
|
this._addItem(obj);
|
11717
12293
|
overlaysPresent = overlaysPresent || obj.overlay;
|
@@ -11882,7 +12458,7 @@ L.control.layers = function (baseLayers, overlays, options) {
|
|
11882
12458
|
* @example
|
11883
12459
|
* ```js
|
11884
12460
|
* var fx = new L.PosAnimation();
|
11885
|
-
|
12461
|
+
* fx.run(el, [300, 500], 0.5);
|
11886
12462
|
* ```
|
11887
12463
|
*
|
11888
12464
|
* @constructor L.PosAnimation()
|
@@ -12329,10 +12905,12 @@ L.Map.include({
|
|
12329
12905
|
},
|
12330
12906
|
|
12331
12907
|
// @method locate(options?: Locate options): this
|
12332
|
-
// Tries to locate the user using the Geolocation API, firing a `locationfound`
|
12333
|
-
// event with location data on success or a `locationerror` event on failure,
|
12908
|
+
// Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound)
|
12909
|
+
// event with location data on success or a [`locationerror`](#map-locationerror) event on failure,
|
12334
12910
|
// and optionally sets the map view to the user's location with respect to
|
12335
12911
|
// detection accuracy (or to the world view if geolocation failed).
|
12912
|
+
// Note that, if your page doesn't use HTTPS, this method will fail in
|
12913
|
+
// modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins))
|
12336
12914
|
// See `Locate options` for more details.
|
12337
12915
|
locate: function (options) {
|
12338
12916
|
|
@@ -12423,5 +13001,6 @@ L.Map.include({
|
|
12423
13001
|
});
|
12424
13002
|
|
12425
13003
|
|
13004
|
+
|
12426
13005
|
}(window, document));
|
12427
13006
|
//# sourceMappingURL=<%= asset_path('leaflet-src.map') %>
|