leaflet-rails 0.6.4 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +1 -2
- data/README.md +1 -6
- data/lib/leaflet-rails.rb +2 -2
- data/lib/leaflet-rails/version.rb +1 -1
- data/lib/leaflet-rails/view_helpers.rb +4 -4
- data/vendor/assets/javascripts/leaflet.js.erb +687 -405
- data/vendor/assets/stylesheets/leaflet.css.erb +70 -59
- metadata +2 -3
- data/vendor/assets/stylesheets/leaflet.ie.css +0 -51
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
[](https://travis-ci.org/axyjo/leaflet-rails)
|
2
|
+
[](http://badge.fury.io/rb/leaflet-rails)
|
2
3
|
|
3
4
|
Quickstart Guide
|
4
5
|
================
|
@@ -17,12 +18,6 @@ Then, run `bundle install` from within your project to download the necessary fi
|
|
17
18
|
= require leaflet
|
18
19
|
```
|
19
20
|
|
20
|
-
If you require support for Internet Explorer, add the following line as well:
|
21
|
-
|
22
|
-
```
|
23
|
-
= require leaflet.ie
|
24
|
-
```
|
25
|
-
|
26
21
|
After that, open your application-wide Javascript file (typically `app/assets/javascripts/application.js`) and add the following line before requiring files which depend on Leaflet:
|
27
22
|
|
28
23
|
```
|
data/lib/leaflet-rails.rb
CHANGED
@@ -5,13 +5,13 @@ module Leaflet
|
|
5
5
|
mattr_accessor :tile_layer
|
6
6
|
mattr_accessor :attribution
|
7
7
|
mattr_accessor :max_zoom
|
8
|
-
|
8
|
+
|
9
9
|
module Rails
|
10
10
|
class Engine < ::Rails::Engine
|
11
11
|
initializer 'leaflet-rails.precompile' do |app|
|
12
12
|
app.config.assets.precompile += %w(layers-2x.png layers.png marker-icon-2x.png marker-icon.png marker-shadow.png)
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
initializer 'leaflet-rails.helpers' do
|
16
16
|
ActionView::Base.send :include, Leaflet::ViewHelpers
|
17
17
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module Leaflet
|
2
2
|
module ViewHelpers
|
3
|
-
|
3
|
+
|
4
4
|
def map(options)
|
5
5
|
options[:tile_layer] ||= Leaflet.tile_layer
|
6
6
|
options[:attribution] ||= Leaflet.attribution
|
7
7
|
options[:max_zoom] ||= Leaflet.max_zoom
|
8
8
|
options[:container_id] ||= 'map'
|
9
|
-
|
9
|
+
|
10
10
|
output = []
|
11
11
|
output << "<div id='#{options[:container_id]}'></div>"
|
12
12
|
output << "<script>"
|
@@ -27,7 +27,7 @@ module Leaflet
|
|
27
27
|
output << "</script>"
|
28
28
|
output.join("\n").html_safe
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
end
|
@@ -7,7 +7,7 @@
|
|
7
7
|
var oldL = window.L,
|
8
8
|
L = {};
|
9
9
|
|
10
|
-
L.version = '0.
|
10
|
+
L.version = '0.7';
|
11
11
|
|
12
12
|
// define Leaflet for Node module pattern loaders, including Browserify
|
13
13
|
if (typeof module === 'object' && typeof module.exports === 'object') {
|
@@ -135,19 +135,23 @@ L.Util = {
|
|
135
135
|
return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
|
136
136
|
},
|
137
137
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
} else if (typeof value === 'function') {
|
144
|
-
value = value(data);
|
145
|
-
}
|
146
|
-
return value;
|
138
|
+
compileTemplate: function (str, data) {
|
139
|
+
// based on https://gist.github.com/padolsey/6008842
|
140
|
+
str = str.replace(/"/g, '\\\"');
|
141
|
+
str = str.replace(/\{ *([\w_]+) *\}/g, function (str, key) {
|
142
|
+
return '" + o["' + key + '"]' + (typeof data[key] === 'function' ? '(o)' : '') + ' + "';
|
147
143
|
});
|
144
|
+
// jshint evil: true
|
145
|
+
return new Function('o', 'return "' + str + '";');
|
146
|
+
},
|
147
|
+
|
148
|
+
template: function (str, data) {
|
149
|
+
var cache = L.Util._templateCache = L.Util._templateCache || {};
|
150
|
+
cache[str] = cache[str] || L.Util.compileTemplate(str, data);
|
151
|
+
return cache[str](data);
|
148
152
|
},
|
149
153
|
|
150
|
-
isArray: function (obj) {
|
154
|
+
isArray: Array.isArray || function (obj) {
|
151
155
|
return (Object.prototype.toString.call(obj) === '[object Array]');
|
152
156
|
},
|
153
157
|
|
@@ -337,7 +341,7 @@ L.Mixin.Events = {
|
|
337
341
|
if (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; }
|
338
342
|
|
339
343
|
var events = this[eventsKey] = this[eventsKey] || {},
|
340
|
-
contextId = context && L.stamp(context),
|
344
|
+
contextId = context && context !== this && L.stamp(context),
|
341
345
|
i, len, event, type, indexKey, indexLenKey, typeIndex;
|
342
346
|
|
343
347
|
// types can be a string of space-separated words
|
@@ -350,7 +354,7 @@ L.Mixin.Events = {
|
|
350
354
|
};
|
351
355
|
type = types[i];
|
352
356
|
|
353
|
-
if (
|
357
|
+
if (contextId) {
|
354
358
|
// store listeners of a particular context in a separate hash (if it has an id)
|
355
359
|
// gives a major performance boost when removing thousands of map layers
|
356
360
|
|
@@ -397,7 +401,7 @@ L.Mixin.Events = {
|
|
397
401
|
if (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; }
|
398
402
|
|
399
403
|
var events = this[eventsKey],
|
400
|
-
contextId = context && L.stamp(context),
|
404
|
+
contextId = context && context !== this && L.stamp(context),
|
401
405
|
i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed;
|
402
406
|
|
403
407
|
types = L.Util.splitWords(types);
|
@@ -413,9 +417,10 @@ L.Mixin.Events = {
|
|
413
417
|
// clear all listeners for a type if function isn't specified
|
414
418
|
delete events[type];
|
415
419
|
delete events[indexKey];
|
420
|
+
delete events[indexLenKey];
|
416
421
|
|
417
422
|
} else {
|
418
|
-
listeners =
|
423
|
+
listeners = contextId && typeIndex ? typeIndex[contextId] : events[type];
|
419
424
|
|
420
425
|
if (listeners) {
|
421
426
|
for (j = listeners.length - 1; j >= 0; j--) {
|
@@ -458,7 +463,7 @@ L.Mixin.Events = {
|
|
458
463
|
listeners = events[type].slice();
|
459
464
|
|
460
465
|
for (i = 0, len = listeners.length; i < len; i++) {
|
461
|
-
listeners[i].action.call(listeners[i].context
|
466
|
+
listeners[i].action.call(listeners[i].context, event);
|
462
467
|
}
|
463
468
|
}
|
464
469
|
|
@@ -470,7 +475,7 @@ L.Mixin.Events = {
|
|
470
475
|
|
471
476
|
if (listeners) {
|
472
477
|
for (i = 0, len = listeners.length; i < len; i++) {
|
473
|
-
listeners[i].action.call(listeners[i].context
|
478
|
+
listeners[i].action.call(listeners[i].context, event);
|
474
479
|
}
|
475
480
|
}
|
476
481
|
}
|
@@ -506,9 +511,7 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
|
|
506
511
|
|
507
512
|
(function () {
|
508
513
|
|
509
|
-
var ie =
|
510
|
-
ie6 = ie && !window.XMLHttpRequest,
|
511
|
-
ie7 = ie && !document.querySelector,
|
514
|
+
var ie = 'ActiveXObject' in window,
|
512
515
|
ielt9 = ie && !document.addEventListener,
|
513
516
|
|
514
517
|
// terrible browser detection to work around Safari / iOS / Android browser bugs
|
@@ -518,10 +521,13 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
|
|
518
521
|
phantomjs = ua.indexOf('phantom') !== -1,
|
519
522
|
android = ua.indexOf('android') !== -1,
|
520
523
|
android23 = ua.search('android [23]') !== -1,
|
524
|
+
gecko = ua.indexOf('gecko') !== -1,
|
521
525
|
|
522
526
|
mobile = typeof orientation !== undefined + '',
|
523
|
-
|
524
|
-
window.navigator.msMaxTouchPoints,
|
527
|
+
msPointer = window.navigator && window.navigator.msPointerEnabled &&
|
528
|
+
window.navigator.msMaxTouchPoints && !window.PointerEvent,
|
529
|
+
pointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) ||
|
530
|
+
msPointer,
|
525
531
|
retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) ||
|
526
532
|
('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') &&
|
527
533
|
window.matchMedia('(min-resolution:144dpi)').matches),
|
@@ -541,8 +547,8 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
|
|
541
547
|
|
542
548
|
var startName = 'ontouchstart';
|
543
549
|
|
544
|
-
// IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.
|
545
|
-
if (
|
550
|
+
// IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.Pointer) or WebKit, etc.
|
551
|
+
if (pointer || (startName in doc)) {
|
546
552
|
return true;
|
547
553
|
}
|
548
554
|
|
@@ -568,10 +574,9 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
|
|
568
574
|
|
569
575
|
L.Browser = {
|
570
576
|
ie: ie,
|
571
|
-
ie6: ie6,
|
572
|
-
ie7: ie7,
|
573
577
|
ielt9: ielt9,
|
574
578
|
webkit: webkit,
|
579
|
+
gecko: gecko && !webkit && !window.opera && !ie,
|
575
580
|
|
576
581
|
android: android,
|
577
582
|
android23: android23,
|
@@ -590,7 +595,8 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
|
|
590
595
|
mobileOpera: mobile && window.opera,
|
591
596
|
|
592
597
|
touch: touch,
|
593
|
-
|
598
|
+
msPointer: msPointer,
|
599
|
+
pointer: pointer,
|
594
600
|
|
595
601
|
retina: retina
|
596
602
|
};
|
@@ -881,8 +887,7 @@ L.DomUtil = {
|
|
881
887
|
el = element,
|
882
888
|
docBody = document.body,
|
883
889
|
docEl = document.documentElement,
|
884
|
-
pos
|
885
|
-
ie7 = L.Browser.ie7;
|
890
|
+
pos;
|
886
891
|
|
887
892
|
do {
|
888
893
|
top += el.offsetTop || 0;
|
@@ -929,19 +934,6 @@ L.DomUtil = {
|
|
929
934
|
top -= el.scrollTop || 0;
|
930
935
|
left -= el.scrollLeft || 0;
|
931
936
|
|
932
|
-
// webkit (and ie <= 7) handles RTL scrollLeft different to everyone else
|
933
|
-
// https://code.google.com/p/closure-library/source/browse/trunk/closure/goog/style/bidi.js
|
934
|
-
if (!L.DomUtil.documentIsLtr() && (L.Browser.webkit || ie7)) {
|
935
|
-
left += el.scrollWidth - el.clientWidth;
|
936
|
-
|
937
|
-
// ie7 shows the scrollbar by default and provides clientWidth counting it, so we
|
938
|
-
// need to add it back in if it is visible; scrollbar is on the left as we are RTL
|
939
|
-
if (ie7 && L.DomUtil.getStyle(el, 'overflow-y') !== 'hidden' &&
|
940
|
-
L.DomUtil.getStyle(el, 'overflow') !== 'hidden') {
|
941
|
-
left += 17;
|
942
|
-
}
|
943
|
-
}
|
944
|
-
|
945
937
|
el = el.parentNode;
|
946
938
|
} while (el);
|
947
939
|
|
@@ -969,18 +961,44 @@ L.DomUtil = {
|
|
969
961
|
},
|
970
962
|
|
971
963
|
hasClass: function (el, name) {
|
972
|
-
|
973
|
-
|
964
|
+
if (el.classList !== undefined) {
|
965
|
+
return el.classList.contains(name);
|
966
|
+
}
|
967
|
+
var className = L.DomUtil._getClass(el);
|
968
|
+
return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className);
|
974
969
|
},
|
975
970
|
|
976
971
|
addClass: function (el, name) {
|
977
|
-
if (
|
978
|
-
|
972
|
+
if (el.classList !== undefined) {
|
973
|
+
var classes = L.Util.splitWords(name);
|
974
|
+
for (var i = 0, len = classes.length; i < len; i++) {
|
975
|
+
el.classList.add(classes[i]);
|
976
|
+
}
|
977
|
+
} else if (!L.DomUtil.hasClass(el, name)) {
|
978
|
+
var className = L.DomUtil._getClass(el);
|
979
|
+
L.DomUtil._setClass(el, (className ? className + ' ' : '') + name);
|
979
980
|
}
|
980
981
|
},
|
981
982
|
|
982
983
|
removeClass: function (el, name) {
|
983
|
-
|
984
|
+
if (el.classList !== undefined) {
|
985
|
+
el.classList.remove(name);
|
986
|
+
} else {
|
987
|
+
L.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' ')));
|
988
|
+
}
|
989
|
+
},
|
990
|
+
|
991
|
+
_setClass: function (el, name) {
|
992
|
+
if (el.className.baseVal === undefined) {
|
993
|
+
el.className = name;
|
994
|
+
} else {
|
995
|
+
// in case of SVG element
|
996
|
+
el.className.baseVal = name;
|
997
|
+
}
|
998
|
+
},
|
999
|
+
|
1000
|
+
_getClass: function (el) {
|
1001
|
+
return el.className.baseVal === undefined ? el.className : el.className.baseVal;
|
984
1002
|
},
|
985
1003
|
|
986
1004
|
setOpacity: function (el, value) {
|
@@ -1089,27 +1107,39 @@ L.DomUtil.TRANSITION_END =
|
|
1089
1107
|
L.DomUtil.TRANSITION + 'End' : 'transitionend';
|
1090
1108
|
|
1091
1109
|
(function () {
|
1092
|
-
|
1093
|
-
|
1110
|
+
if ('onselectstart' in document) {
|
1111
|
+
L.extend(L.DomUtil, {
|
1112
|
+
disableTextSelection: function () {
|
1113
|
+
L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);
|
1114
|
+
},
|
1115
|
+
|
1116
|
+
enableTextSelection: function () {
|
1117
|
+
L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);
|
1118
|
+
}
|
1119
|
+
});
|
1120
|
+
} else {
|
1121
|
+
var userSelectProperty = L.DomUtil.testProp(
|
1122
|
+
['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);
|
1123
|
+
|
1124
|
+
L.extend(L.DomUtil, {
|
1125
|
+
disableTextSelection: function () {
|
1126
|
+
if (userSelectProperty) {
|
1127
|
+
var style = document.documentElement.style;
|
1128
|
+
this._userSelect = style[userSelectProperty];
|
1129
|
+
style[userSelectProperty] = 'none';
|
1130
|
+
}
|
1131
|
+
},
|
1132
|
+
|
1133
|
+
enableTextSelection: function () {
|
1134
|
+
if (userSelectProperty) {
|
1135
|
+
document.documentElement.style[userSelectProperty] = this._userSelect;
|
1136
|
+
delete this._userSelect;
|
1137
|
+
}
|
1138
|
+
}
|
1139
|
+
});
|
1140
|
+
}
|
1094
1141
|
|
1095
1142
|
L.extend(L.DomUtil, {
|
1096
|
-
disableTextSelection: function () {
|
1097
|
-
L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);
|
1098
|
-
if (userSelectProperty) {
|
1099
|
-
var style = document.documentElement.style;
|
1100
|
-
this._userSelect = style[userSelectProperty];
|
1101
|
-
style[userSelectProperty] = 'none';
|
1102
|
-
}
|
1103
|
-
},
|
1104
|
-
|
1105
|
-
enableTextSelection: function () {
|
1106
|
-
L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);
|
1107
|
-
if (userSelectProperty) {
|
1108
|
-
document.documentElement.style[userSelectProperty] = this._userSelect;
|
1109
|
-
delete this._userSelect;
|
1110
|
-
}
|
1111
|
-
},
|
1112
|
-
|
1113
1143
|
disableImageDrag: function () {
|
1114
1144
|
L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);
|
1115
1145
|
},
|
@@ -1125,16 +1155,20 @@ L.DomUtil.TRANSITION_END =
|
|
1125
1155
|
* L.LatLng represents a geographical point with latitude and longitude coordinates.
|
1126
1156
|
*/
|
1127
1157
|
|
1128
|
-
L.LatLng = function (
|
1129
|
-
|
1130
|
-
|
1158
|
+
L.LatLng = function (lat, lng, alt) { // (Number, Number, Number)
|
1159
|
+
lat = parseFloat(lat);
|
1160
|
+
lng = parseFloat(lng);
|
1131
1161
|
|
1132
1162
|
if (isNaN(lat) || isNaN(lng)) {
|
1133
|
-
throw new Error('Invalid LatLng object: (' +
|
1163
|
+
throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');
|
1134
1164
|
}
|
1135
1165
|
|
1136
1166
|
this.lat = lat;
|
1137
1167
|
this.lng = lng;
|
1168
|
+
|
1169
|
+
if (alt !== undefined) {
|
1170
|
+
this.alt = parseFloat(alt);
|
1171
|
+
}
|
1138
1172
|
};
|
1139
1173
|
|
1140
1174
|
L.extend(L.LatLng, {
|
@@ -1198,7 +1232,11 @@ L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Numbe
|
|
1198
1232
|
return a;
|
1199
1233
|
}
|
1200
1234
|
if (L.Util.isArray(a)) {
|
1201
|
-
|
1235
|
+
if (typeof a[0] === 'number' || typeof a[0] === 'string') {
|
1236
|
+
return new L.LatLng(a[0], a[1], a[2]);
|
1237
|
+
} else {
|
1238
|
+
return null;
|
1239
|
+
}
|
1202
1240
|
}
|
1203
1241
|
if (a === undefined || a === null) {
|
1204
1242
|
return a;
|
@@ -1206,6 +1244,9 @@ L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Numbe
|
|
1206
1244
|
if (typeof a === 'object' && 'lat' in a) {
|
1207
1245
|
return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon);
|
1208
1246
|
}
|
1247
|
+
if (b === undefined) {
|
1248
|
+
return null;
|
1249
|
+
}
|
1209
1250
|
return new L.LatLng(a, b);
|
1210
1251
|
};
|
1211
1252
|
|
@@ -1230,8 +1271,9 @@ L.LatLngBounds.prototype = {
|
|
1230
1271
|
extend: function (obj) { // (LatLng) or (LatLngBounds)
|
1231
1272
|
if (!obj) { return this; }
|
1232
1273
|
|
1233
|
-
|
1234
|
-
|
1274
|
+
var latLng = L.latLng(obj);
|
1275
|
+
if (latLng !== null) {
|
1276
|
+
obj = latLng;
|
1235
1277
|
} else {
|
1236
1278
|
obj = L.latLngBounds(obj);
|
1237
1279
|
}
|
@@ -1444,6 +1486,11 @@ L.CRS = {
|
|
1444
1486
|
|
1445
1487
|
scale: function (zoom) {
|
1446
1488
|
return 256 * Math.pow(2, zoom);
|
1489
|
+
},
|
1490
|
+
|
1491
|
+
getSize: function (zoom) {
|
1492
|
+
var s = this.scale(zoom);
|
1493
|
+
return L.point(s, s);
|
1447
1494
|
}
|
1448
1495
|
};
|
1449
1496
|
|
@@ -1522,8 +1569,13 @@ L.Map = L.Class.extend({
|
|
1522
1569
|
initialize: function (id, options) { // (HTMLElement or String, Object)
|
1523
1570
|
options = L.setOptions(this, options);
|
1524
1571
|
|
1572
|
+
|
1525
1573
|
this._initContainer(id);
|
1526
1574
|
this._initLayout();
|
1575
|
+
|
1576
|
+
// hack for https://github.com/Leaflet/Leaflet/issues/1980
|
1577
|
+
this._onResize = L.bind(this._onResize, this);
|
1578
|
+
|
1527
1579
|
this._initEvents();
|
1528
1580
|
|
1529
1581
|
if (options.maxBounds) {
|
@@ -1550,11 +1602,16 @@ L.Map = L.Class.extend({
|
|
1550
1602
|
|
1551
1603
|
// replaced by animation-powered implementation in Map.PanAnimation.js
|
1552
1604
|
setView: function (center, zoom) {
|
1605
|
+
zoom = zoom === undefined ? this.getZoom() : zoom;
|
1553
1606
|
this._resetView(L.latLng(center), this._limitZoom(zoom));
|
1554
1607
|
return this;
|
1555
1608
|
},
|
1556
1609
|
|
1557
1610
|
setZoom: function (zoom, options) {
|
1611
|
+
if (!this._loaded) {
|
1612
|
+
this._zoom = this._limitZoom(zoom);
|
1613
|
+
return this;
|
1614
|
+
}
|
1558
1615
|
return this.setView(this.getCenter(), zoom, {zoom: options});
|
1559
1616
|
},
|
1560
1617
|
|
@@ -1592,6 +1649,8 @@ L.Map = L.Class.extend({
|
|
1592
1649
|
nePoint = this.project(bounds.getNorthEast(), zoom),
|
1593
1650
|
center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);
|
1594
1651
|
|
1652
|
+
zoom = options && options.maxZoom ? Math.min(options.maxZoom, zoom) : zoom;
|
1653
|
+
|
1595
1654
|
return this.setView(center, zoom, options);
|
1596
1655
|
},
|
1597
1656
|
|
@@ -1604,7 +1663,7 @@ L.Map = L.Class.extend({
|
|
1604
1663
|
},
|
1605
1664
|
|
1606
1665
|
panBy: function (offset) { // (Point)
|
1607
|
-
// replaced with animated panBy in Map.
|
1666
|
+
// replaced with animated panBy in Map.PanAnimation.js
|
1608
1667
|
this.fire('movestart');
|
1609
1668
|
|
1610
1669
|
this._rawPanBy(L.point(offset));
|
@@ -1613,63 +1672,29 @@ L.Map = L.Class.extend({
|
|
1613
1672
|
return this.fire('moveend');
|
1614
1673
|
},
|
1615
1674
|
|
1616
|
-
setMaxBounds: function (bounds
|
1675
|
+
setMaxBounds: function (bounds) {
|
1617
1676
|
bounds = L.latLngBounds(bounds);
|
1618
1677
|
|
1619
1678
|
this.options.maxBounds = bounds;
|
1620
1679
|
|
1621
1680
|
if (!bounds) {
|
1622
|
-
this.
|
1623
|
-
this.off('moveend', this._panInsideMaxBounds, this);
|
1624
|
-
return this;
|
1681
|
+
return this.off('moveend', this._panInsideMaxBounds, this);
|
1625
1682
|
}
|
1626
1683
|
|
1627
|
-
var minZoom = this.getBoundsZoom(bounds, true);
|
1628
|
-
|
1629
|
-
this._boundsMinZoom = minZoom;
|
1630
|
-
|
1631
1684
|
if (this._loaded) {
|
1632
|
-
|
1633
|
-
this.setView(bounds.getCenter(), minZoom, options);
|
1634
|
-
} else {
|
1635
|
-
this.panInsideBounds(bounds);
|
1636
|
-
}
|
1685
|
+
this._panInsideMaxBounds();
|
1637
1686
|
}
|
1638
1687
|
|
1639
|
-
this.on('moveend', this._panInsideMaxBounds, this);
|
1640
|
-
|
1641
|
-
return this;
|
1688
|
+
return this.on('moveend', this._panInsideMaxBounds, this);
|
1642
1689
|
},
|
1643
1690
|
|
1644
|
-
panInsideBounds: function (bounds) {
|
1645
|
-
|
1691
|
+
panInsideBounds: function (bounds, options) {
|
1692
|
+
var center = this.getCenter(),
|
1693
|
+
newCenter = this._limitCenter(center, this._zoom, bounds);
|
1646
1694
|
|
1647
|
-
|
1648
|
-
viewSw = viewBounds.getBottomLeft(),
|
1649
|
-
viewNe = viewBounds.getTopRight(),
|
1650
|
-
sw = this.project(bounds.getSouthWest()),
|
1651
|
-
ne = this.project(bounds.getNorthEast()),
|
1652
|
-
dx = 0,
|
1653
|
-
dy = 0;
|
1695
|
+
if (center.equals(newCenter)) { return this; }
|
1654
1696
|
|
1655
|
-
|
1656
|
-
dy = Math.ceil(ne.y - viewNe.y);
|
1657
|
-
}
|
1658
|
-
if (viewNe.x > ne.x) { // east
|
1659
|
-
dx = Math.floor(ne.x - viewNe.x);
|
1660
|
-
}
|
1661
|
-
if (viewSw.y > sw.y) { // south
|
1662
|
-
dy = Math.floor(sw.y - viewSw.y);
|
1663
|
-
}
|
1664
|
-
if (viewSw.x < sw.x) { // west
|
1665
|
-
dx = Math.ceil(sw.x - viewSw.x);
|
1666
|
-
}
|
1667
|
-
|
1668
|
-
if (dx || dy) {
|
1669
|
-
return this.panBy([dx, dy]);
|
1670
|
-
}
|
1671
|
-
|
1672
|
-
return this;
|
1697
|
+
return this.panTo(newCenter, options);
|
1673
1698
|
},
|
1674
1699
|
|
1675
1700
|
addLayer: function (layer) {
|
@@ -1704,7 +1729,7 @@ L.Map = L.Class.extend({
|
|
1704
1729
|
removeLayer: function (layer) {
|
1705
1730
|
var id = L.stamp(layer);
|
1706
1731
|
|
1707
|
-
if (!this._layers[id]) { return; }
|
1732
|
+
if (!this._layers[id]) { return this; }
|
1708
1733
|
|
1709
1734
|
if (this._loaded) {
|
1710
1735
|
layer.onRemove(this);
|
@@ -1752,15 +1777,14 @@ L.Map = L.Class.extend({
|
|
1752
1777
|
|
1753
1778
|
var oldSize = this.getSize();
|
1754
1779
|
this._sizeChanged = true;
|
1755
|
-
|
1756
|
-
if (this.options.maxBounds) {
|
1757
|
-
this.setMaxBounds(this.options.maxBounds);
|
1758
|
-
}
|
1780
|
+
this._initialCenter = null;
|
1759
1781
|
|
1760
1782
|
if (!this._loaded) { return this; }
|
1761
1783
|
|
1762
1784
|
var newSize = this.getSize(),
|
1763
|
-
|
1785
|
+
oldCenter = oldSize.divideBy(2).round(),
|
1786
|
+
newCenter = newSize.divideBy(2).round(),
|
1787
|
+
offset = oldCenter.subtract(newCenter);
|
1764
1788
|
|
1765
1789
|
if (!offset.x && !offset.y) { return this; }
|
1766
1790
|
|
@@ -1774,9 +1798,12 @@ L.Map = L.Class.extend({
|
|
1774
1798
|
|
1775
1799
|
this.fire('move');
|
1776
1800
|
|
1777
|
-
|
1778
|
-
|
1779
|
-
|
1801
|
+
if (options.debounceMoveend) {
|
1802
|
+
clearTimeout(this._sizeTimer);
|
1803
|
+
this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);
|
1804
|
+
} else {
|
1805
|
+
this.fire('moveend');
|
1806
|
+
}
|
1780
1807
|
}
|
1781
1808
|
|
1782
1809
|
return this.fire('resize', {
|
@@ -1787,7 +1814,7 @@ L.Map = L.Class.extend({
|
|
1787
1814
|
|
1788
1815
|
// TODO handler.addTo
|
1789
1816
|
addHandler: function (name, HandlerClass) {
|
1790
|
-
if (!HandlerClass) { return; }
|
1817
|
+
if (!HandlerClass) { return this; }
|
1791
1818
|
|
1792
1819
|
var handler = this[name] = new HandlerClass(this);
|
1793
1820
|
|
@@ -1807,7 +1834,12 @@ L.Map = L.Class.extend({
|
|
1807
1834
|
|
1808
1835
|
this._initEvents('off');
|
1809
1836
|
|
1810
|
-
|
1837
|
+
try {
|
1838
|
+
// throws error in IE6-8
|
1839
|
+
delete this._container._leaflet;
|
1840
|
+
} catch (e) {
|
1841
|
+
this._container._leaflet = undefined;
|
1842
|
+
}
|
1811
1843
|
|
1812
1844
|
this._clearPanes();
|
1813
1845
|
if (this._clearControlPos) {
|
@@ -1825,7 +1857,7 @@ L.Map = L.Class.extend({
|
|
1825
1857
|
getCenter: function () { // (Boolean) -> LatLng
|
1826
1858
|
this._checkIfLoaded();
|
1827
1859
|
|
1828
|
-
if (!this._moved()) {
|
1860
|
+
if (this._initialCenter && !this._moved()) {
|
1829
1861
|
return this._initialCenter;
|
1830
1862
|
}
|
1831
1863
|
return this.layerPointToLatLng(this._getCenterLayerPoint());
|
@@ -1844,9 +1876,9 @@ L.Map = L.Class.extend({
|
|
1844
1876
|
},
|
1845
1877
|
|
1846
1878
|
getMinZoom: function () {
|
1847
|
-
|
1848
|
-
|
1849
|
-
|
1879
|
+
return this.options.minZoom === undefined ?
|
1880
|
+
(this._layersMinZoom === undefined ? 0 : this._layersMinZoom) :
|
1881
|
+
this.options.minZoom;
|
1850
1882
|
},
|
1851
1883
|
|
1852
1884
|
getMaxZoom: function () {
|
@@ -1998,6 +2030,7 @@ L.Map = L.Class.extend({
|
|
1998
2030
|
L.DomUtil.addClass(container, 'leaflet-container' +
|
1999
2031
|
(L.Browser.touch ? ' leaflet-touch' : '') +
|
2000
2032
|
(L.Browser.retina ? ' leaflet-retina' : '') +
|
2033
|
+
(L.Browser.ielt9 ? ' leaflet-oldie' : '') +
|
2001
2034
|
(this.options.fadeAnimation ? ' leaflet-fade-anim' : ''));
|
2002
2035
|
|
2003
2036
|
var position = L.DomUtil.getStyle(container, 'position');
|
@@ -2168,12 +2201,14 @@ L.Map = L.Class.extend({
|
|
2168
2201
|
_onResize: function () {
|
2169
2202
|
L.Util.cancelAnimFrame(this._resizeRequest);
|
2170
2203
|
this._resizeRequest = L.Util.requestAnimFrame(
|
2171
|
-
this.invalidateSize, this, false, this._container);
|
2204
|
+
function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container);
|
2172
2205
|
},
|
2173
2206
|
|
2174
2207
|
_onMouseClick: function (e) {
|
2175
|
-
if (!this._loaded || (!e._simulated &&
|
2176
|
-
|
2208
|
+
if (!this._loaded || (!e._simulated &&
|
2209
|
+
((this.dragging && this.dragging.moved()) ||
|
2210
|
+
(this.boxZoom && this.boxZoom.moved()))) ||
|
2211
|
+
L.DomEvent._skipped(e)) { return; }
|
2177
2212
|
|
2178
2213
|
this.fire('preclick');
|
2179
2214
|
this._fireMouseEvent(e);
|
@@ -2268,6 +2303,46 @@ L.Map = L.Class.extend({
|
|
2268
2303
|
return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());
|
2269
2304
|
},
|
2270
2305
|
|
2306
|
+
// adjust center for view to get inside bounds
|
2307
|
+
_limitCenter: function (center, zoom, bounds) {
|
2308
|
+
|
2309
|
+
if (!bounds) { return center; }
|
2310
|
+
|
2311
|
+
var centerPoint = this.project(center, zoom),
|
2312
|
+
viewHalf = this.getSize().divideBy(2),
|
2313
|
+
viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),
|
2314
|
+
offset = this._getBoundsOffset(viewBounds, bounds, zoom);
|
2315
|
+
|
2316
|
+
return this.unproject(centerPoint.add(offset), zoom);
|
2317
|
+
},
|
2318
|
+
|
2319
|
+
// adjust offset for view to get inside bounds
|
2320
|
+
_limitOffset: function (offset, bounds) {
|
2321
|
+
if (!bounds) { return offset; }
|
2322
|
+
|
2323
|
+
var viewBounds = this.getPixelBounds(),
|
2324
|
+
newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));
|
2325
|
+
|
2326
|
+
return offset.add(this._getBoundsOffset(newBounds, bounds));
|
2327
|
+
},
|
2328
|
+
|
2329
|
+
// returns offset needed for pxBounds to get inside maxBounds at a specified zoom
|
2330
|
+
_getBoundsOffset: function (pxBounds, maxBounds, zoom) {
|
2331
|
+
var nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min),
|
2332
|
+
seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max),
|
2333
|
+
|
2334
|
+
dx = this._rebound(nwOffset.x, -seOffset.x),
|
2335
|
+
dy = this._rebound(nwOffset.y, -seOffset.y);
|
2336
|
+
|
2337
|
+
return new L.Point(dx, dy);
|
2338
|
+
},
|
2339
|
+
|
2340
|
+
_rebound: function (left, right) {
|
2341
|
+
return left + right > 0 ?
|
2342
|
+
Math.round(left - right) / 2 :
|
2343
|
+
Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));
|
2344
|
+
},
|
2345
|
+
|
2271
2346
|
_limitZoom: function (zoom) {
|
2272
2347
|
var min = this.getMinZoom(),
|
2273
2348
|
max = this.getMaxZoom();
|
@@ -2348,9 +2423,9 @@ L.CRS.EPSG3395 = L.extend({}, L.CRS, {
|
|
2348
2423
|
transformation: (function () {
|
2349
2424
|
var m = L.Projection.Mercator,
|
2350
2425
|
r = m.R_MAJOR,
|
2351
|
-
|
2426
|
+
scale = 0.5 / (Math.PI * r);
|
2352
2427
|
|
2353
|
-
return new L.Transformation(
|
2428
|
+
return new L.Transformation(scale, 0.5, -scale, 0.5);
|
2354
2429
|
}())
|
2355
2430
|
});
|
2356
2431
|
|
@@ -2371,7 +2446,8 @@ L.TileLayer = L.Class.extend({
|
|
2371
2446
|
attribution: '',
|
2372
2447
|
zoomOffset: 0,
|
2373
2448
|
opacity: 1,
|
2374
|
-
/*
|
2449
|
+
/*
|
2450
|
+
maxNativeZoom: null,
|
2375
2451
|
zIndex: null,
|
2376
2452
|
tms: false,
|
2377
2453
|
continuousWorld: false,
|
@@ -2420,9 +2496,6 @@ L.TileLayer = L.Class.extend({
|
|
2420
2496
|
// create a container div for tiles
|
2421
2497
|
this._initContainer();
|
2422
2498
|
|
2423
|
-
// create an image to clone for tiles
|
2424
|
-
this._createTileProto();
|
2425
|
-
|
2426
2499
|
// set up events
|
2427
2500
|
map.on({
|
2428
2501
|
'viewreset': this._reset,
|
@@ -2587,7 +2660,7 @@ L.TileLayer = L.Class.extend({
|
|
2587
2660
|
this._updateZIndex();
|
2588
2661
|
|
2589
2662
|
if (this._animated) {
|
2590
|
-
var className = 'leaflet-tile-container
|
2663
|
+
var className = 'leaflet-tile-container';
|
2591
2664
|
|
2592
2665
|
this._bgBuffer = L.DomUtil.create('div', className, this._container);
|
2593
2666
|
this._tileContainer = L.DomUtil.create('div', className, this._container);
|
@@ -2625,13 +2698,27 @@ L.TileLayer = L.Class.extend({
|
|
2625
2698
|
this._initContainer();
|
2626
2699
|
},
|
2627
2700
|
|
2701
|
+
_getTileSize: function () {
|
2702
|
+
var map = this._map,
|
2703
|
+
zoom = map.getZoom() + this.options.zoomOffset,
|
2704
|
+
zoomN = this.options.maxNativeZoom,
|
2705
|
+
tileSize = this.options.tileSize;
|
2706
|
+
|
2707
|
+
if (zoomN && zoom > zoomN) {
|
2708
|
+
tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize);
|
2709
|
+
}
|
2710
|
+
|
2711
|
+
return tileSize;
|
2712
|
+
},
|
2713
|
+
|
2628
2714
|
_update: function () {
|
2629
2715
|
|
2630
2716
|
if (!this._map) { return; }
|
2631
2717
|
|
2632
|
-
var
|
2633
|
-
|
2634
|
-
|
2718
|
+
var map = this._map,
|
2719
|
+
bounds = map.getPixelBounds(),
|
2720
|
+
zoom = map.getZoom(),
|
2721
|
+
tileSize = this._getTileSize();
|
2635
2722
|
|
2636
2723
|
if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
|
2637
2724
|
return;
|
@@ -2700,8 +2787,8 @@ L.TileLayer = L.Class.extend({
|
|
2700
2787
|
var limit = this._getWrapTileNum();
|
2701
2788
|
|
2702
2789
|
// don't load if exceeds world bounds
|
2703
|
-
if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit)) ||
|
2704
|
-
tilePoint.y < 0 || tilePoint.y >= limit) { return false; }
|
2790
|
+
if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) ||
|
2791
|
+
tilePoint.y < 0 || tilePoint.y >= limit.y) { return false; }
|
2705
2792
|
}
|
2706
2793
|
|
2707
2794
|
if (options.bounds) {
|
@@ -2794,12 +2881,14 @@ L.TileLayer = L.Class.extend({
|
|
2794
2881
|
zoom = options.maxZoom - zoom;
|
2795
2882
|
}
|
2796
2883
|
|
2797
|
-
|
2884
|
+
zoom += options.zoomOffset;
|
2885
|
+
|
2886
|
+
return options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom;
|
2798
2887
|
},
|
2799
2888
|
|
2800
2889
|
_getTilePos: function (tilePoint) {
|
2801
2890
|
var origin = this._map.getPixelOrigin(),
|
2802
|
-
tileSize = this.
|
2891
|
+
tileSize = this._getTileSize();
|
2803
2892
|
|
2804
2893
|
return tilePoint.multiplyBy(tileSize).subtract(origin);
|
2805
2894
|
},
|
@@ -2816,8 +2905,9 @@ L.TileLayer = L.Class.extend({
|
|
2816
2905
|
},
|
2817
2906
|
|
2818
2907
|
_getWrapTileNum: function () {
|
2819
|
-
|
2820
|
-
|
2908
|
+
var crs = this._map.options.crs,
|
2909
|
+
size = crs.getSize(this._map.getZoom());
|
2910
|
+
return size.divideBy(this.options.tileSize);
|
2821
2911
|
},
|
2822
2912
|
|
2823
2913
|
_adjustTilePoint: function (tilePoint) {
|
@@ -2826,11 +2916,11 @@ L.TileLayer = L.Class.extend({
|
|
2826
2916
|
|
2827
2917
|
// wrap tile coordinates
|
2828
2918
|
if (!this.options.continuousWorld && !this.options.noWrap) {
|
2829
|
-
tilePoint.x = ((tilePoint.x % limit) + limit) % limit;
|
2919
|
+
tilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x;
|
2830
2920
|
}
|
2831
2921
|
|
2832
2922
|
if (this.options.tms) {
|
2833
|
-
tilePoint.y = limit - tilePoint.y - 1;
|
2923
|
+
tilePoint.y = limit.y - tilePoint.y - 1;
|
2834
2924
|
}
|
2835
2925
|
|
2836
2926
|
tilePoint.z = this._getZoomForUrl();
|
@@ -2841,12 +2931,6 @@ L.TileLayer = L.Class.extend({
|
|
2841
2931
|
return this.options.subdomains[index];
|
2842
2932
|
},
|
2843
2933
|
|
2844
|
-
_createTileProto: function () {
|
2845
|
-
var img = this._tileImg = L.DomUtil.create('img', 'leaflet-tile');
|
2846
|
-
img.style.width = img.style.height = this.options.tileSize + 'px';
|
2847
|
-
img.galleryimg = 'no';
|
2848
|
-
},
|
2849
|
-
|
2850
2934
|
_getTile: function () {
|
2851
2935
|
if (this.options.reuseTiles && this._unusedTiles.length > 0) {
|
2852
2936
|
var tile = this._unusedTiles.pop();
|
@@ -2860,12 +2944,20 @@ L.TileLayer = L.Class.extend({
|
|
2860
2944
|
_resetTile: function (/*tile*/) {},
|
2861
2945
|
|
2862
2946
|
_createTile: function () {
|
2863
|
-
var tile =
|
2947
|
+
var tile = L.DomUtil.create('img', 'leaflet-tile');
|
2948
|
+
tile.style.width = tile.style.height = this._getTileSize() + 'px';
|
2949
|
+
tile.galleryimg = 'no';
|
2950
|
+
|
2864
2951
|
tile.onselectstart = tile.onmousemove = L.Util.falseFn;
|
2865
2952
|
|
2866
2953
|
if (L.Browser.ielt9 && this.options.opacity !== undefined) {
|
2867
2954
|
L.DomUtil.setOpacity(tile, this.options.opacity);
|
2868
2955
|
}
|
2956
|
+
// without this hack, tiles disappear after zoom on Chrome for Android
|
2957
|
+
// https://github.com/Leaflet/Leaflet/issues/2078
|
2958
|
+
if (L.Browser.mobileWebkit3d) {
|
2959
|
+
tile.style.WebkitBackfaceVisibility = 'hidden';
|
2960
|
+
}
|
2869
2961
|
return tile;
|
2870
2962
|
},
|
2871
2963
|
|
@@ -2876,10 +2968,20 @@ L.TileLayer = L.Class.extend({
|
|
2876
2968
|
|
2877
2969
|
this._adjustTilePoint(tilePoint);
|
2878
2970
|
tile.src = this.getTileUrl(tilePoint);
|
2971
|
+
|
2972
|
+
this.fire('tileloadstart', {
|
2973
|
+
tile: tile,
|
2974
|
+
url: tile.src
|
2975
|
+
});
|
2879
2976
|
},
|
2880
2977
|
|
2881
2978
|
_tileLoaded: function () {
|
2882
2979
|
this._tilesToLoad--;
|
2980
|
+
|
2981
|
+
if (this._animated) {
|
2982
|
+
L.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated');
|
2983
|
+
}
|
2984
|
+
|
2883
2985
|
if (!this._tilesToLoad) {
|
2884
2986
|
this.fire('load');
|
2885
2987
|
|
@@ -2974,13 +3076,15 @@ L.TileLayer.WMS = L.TileLayer.extend({
|
|
2974
3076
|
|
2975
3077
|
this._crs = this.options.crs || map.options.crs;
|
2976
3078
|
|
2977
|
-
|
3079
|
+
this._wmsVersion = parseFloat(this.wmsParams.version);
|
3080
|
+
|
3081
|
+
var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';
|
2978
3082
|
this.wmsParams[projectionKey] = this._crs.code;
|
2979
3083
|
|
2980
3084
|
L.TileLayer.prototype.onAdd.call(this, map);
|
2981
3085
|
},
|
2982
3086
|
|
2983
|
-
getTileUrl: function (tilePoint
|
3087
|
+
getTileUrl: function (tilePoint) { // (Point, Number) -> String
|
2984
3088
|
|
2985
3089
|
var map = this._map,
|
2986
3090
|
tileSize = this.options.tileSize,
|
@@ -2988,10 +3092,11 @@ L.TileLayer.WMS = L.TileLayer.extend({
|
|
2988
3092
|
nwPoint = tilePoint.multiplyBy(tileSize),
|
2989
3093
|
sePoint = nwPoint.add([tileSize, tileSize]),
|
2990
3094
|
|
2991
|
-
nw = this._crs.project(map.unproject(nwPoint,
|
2992
|
-
se = this._crs.project(map.unproject(sePoint,
|
2993
|
-
|
2994
|
-
|
3095
|
+
nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)),
|
3096
|
+
se = this._crs.project(map.unproject(sePoint, tilePoint.z)),
|
3097
|
+
bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?
|
3098
|
+
[se.y, nw.x, nw.y, se.x].join(',') :
|
3099
|
+
[nw.x, se.y, se.x, nw.y].join(','),
|
2995
3100
|
|
2996
3101
|
url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)});
|
2997
3102
|
|
@@ -3045,13 +3150,9 @@ L.TileLayer.Canvas = L.TileLayer.extend({
|
|
3045
3150
|
this.drawTile(tile, tile._tilePoint, this._map._zoom);
|
3046
3151
|
},
|
3047
3152
|
|
3048
|
-
_createTileProto: function () {
|
3049
|
-
var proto = this._canvasProto = L.DomUtil.create('canvas', 'leaflet-tile');
|
3050
|
-
proto.width = proto.height = this.options.tileSize;
|
3051
|
-
},
|
3052
|
-
|
3053
3153
|
_createTile: function () {
|
3054
|
-
var tile =
|
3154
|
+
var tile = L.DomUtil.create('canvas', 'leaflet-tile');
|
3155
|
+
tile.width = tile.height = this.options.tileSize;
|
3055
3156
|
tile.onselectstart = tile.onmousemove = L.Util.falseFn;
|
3056
3157
|
return tile;
|
3057
3158
|
},
|
@@ -3155,6 +3256,15 @@ L.ImageOverlay = L.Class.extend({
|
|
3155
3256
|
return this;
|
3156
3257
|
},
|
3157
3258
|
|
3259
|
+
setUrl: function (url) {
|
3260
|
+
this._url = url;
|
3261
|
+
this._image.src = this._url;
|
3262
|
+
},
|
3263
|
+
|
3264
|
+
getAttribution: function () {
|
3265
|
+
return this.options.attribution;
|
3266
|
+
},
|
3267
|
+
|
3158
3268
|
_initImage: function () {
|
3159
3269
|
this._image = L.DomUtil.create('img', 'leaflet-image-layer');
|
3160
3270
|
|
@@ -3298,19 +3408,8 @@ L.Icon = L.Class.extend({
|
|
3298
3408
|
},
|
3299
3409
|
|
3300
3410
|
_createImg: function (src, el) {
|
3301
|
-
|
3302
|
-
|
3303
|
-
if (!el) {
|
3304
|
-
el = document.createElement('img');
|
3305
|
-
}
|
3306
|
-
el.src = src;
|
3307
|
-
} else {
|
3308
|
-
if (!el) {
|
3309
|
-
el = document.createElement('div');
|
3310
|
-
}
|
3311
|
-
el.style.filter =
|
3312
|
-
'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")';
|
3313
|
-
}
|
3411
|
+
el = el || document.createElement('img');
|
3412
|
+
el.src = src;
|
3314
3413
|
return el;
|
3315
3414
|
},
|
3316
3415
|
|
@@ -3389,6 +3488,7 @@ L.Marker = L.Class.extend({
|
|
3389
3488
|
options: {
|
3390
3489
|
icon: new L.Icon.Default(),
|
3391
3490
|
title: '',
|
3491
|
+
alt: '',
|
3392
3492
|
clickable: true,
|
3393
3493
|
draggable: false,
|
3394
3494
|
keyboard: true,
|
@@ -3410,6 +3510,7 @@ L.Marker = L.Class.extend({
|
|
3410
3510
|
|
3411
3511
|
this._initIcon();
|
3412
3512
|
this.update();
|
3513
|
+
this.fire('add');
|
3413
3514
|
|
3414
3515
|
if (map.options.zoomAnimation && map.options.markerZoomAnimation) {
|
3415
3516
|
map.on('zoomanim', this._animateZoom, this);
|
@@ -3467,6 +3568,10 @@ L.Marker = L.Class.extend({
|
|
3467
3568
|
this.update();
|
3468
3569
|
}
|
3469
3570
|
|
3571
|
+
if (this._popup) {
|
3572
|
+
this.bindPopup(this._popup);
|
3573
|
+
}
|
3574
|
+
|
3470
3575
|
return this;
|
3471
3576
|
},
|
3472
3577
|
|
@@ -3498,6 +3603,10 @@ L.Marker = L.Class.extend({
|
|
3498
3603
|
if (options.title) {
|
3499
3604
|
icon.title = options.title;
|
3500
3605
|
}
|
3606
|
+
|
3607
|
+
if (options.alt) {
|
3608
|
+
icon.alt = options.alt;
|
3609
|
+
}
|
3501
3610
|
}
|
3502
3611
|
|
3503
3612
|
L.DomUtil.addClass(icon, classToAdd);
|
@@ -3582,7 +3691,7 @@ L.Marker = L.Class.extend({
|
|
3582
3691
|
},
|
3583
3692
|
|
3584
3693
|
_animateZoom: function (opt) {
|
3585
|
-
var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);
|
3694
|
+
var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();
|
3586
3695
|
|
3587
3696
|
this._setPos(pos);
|
3588
3697
|
},
|
@@ -3749,11 +3858,13 @@ L.Popup = L.Class.extend({
|
|
3749
3858
|
options: {
|
3750
3859
|
minWidth: 50,
|
3751
3860
|
maxWidth: 300,
|
3752
|
-
maxHeight: null,
|
3861
|
+
// maxHeight: null,
|
3753
3862
|
autoPan: true,
|
3754
3863
|
closeButton: true,
|
3755
3864
|
offset: [0, 7],
|
3756
3865
|
autoPanPadding: [5, 5],
|
3866
|
+
// autoPanPaddingTopLeft: null,
|
3867
|
+
// autoPanPaddingBottomRight: null,
|
3757
3868
|
keepInView: false,
|
3758
3869
|
className: '',
|
3759
3870
|
zoomAnimation: true
|
@@ -3773,7 +3884,6 @@ L.Popup = L.Class.extend({
|
|
3773
3884
|
if (!this._container) {
|
3774
3885
|
this._initLayout();
|
3775
3886
|
}
|
3776
|
-
this._updateContent();
|
3777
3887
|
|
3778
3888
|
var animFade = map.options.fadeAnimation;
|
3779
3889
|
|
@@ -3784,7 +3894,7 @@ L.Popup = L.Class.extend({
|
|
3784
3894
|
|
3785
3895
|
map.on(this._getEvents(), this);
|
3786
3896
|
|
3787
|
-
this.
|
3897
|
+
this.update();
|
3788
3898
|
|
3789
3899
|
if (animFade) {
|
3790
3900
|
L.DomUtil.setOpacity(this._container, 1);
|
@@ -3831,18 +3941,43 @@ L.Popup = L.Class.extend({
|
|
3831
3941
|
}
|
3832
3942
|
},
|
3833
3943
|
|
3944
|
+
getLatLng: function () {
|
3945
|
+
return this._latlng;
|
3946
|
+
},
|
3947
|
+
|
3834
3948
|
setLatLng: function (latlng) {
|
3835
3949
|
this._latlng = L.latLng(latlng);
|
3836
|
-
this.
|
3950
|
+
if (this._map) {
|
3951
|
+
this._updatePosition();
|
3952
|
+
this._adjustPan();
|
3953
|
+
}
|
3837
3954
|
return this;
|
3838
3955
|
},
|
3839
3956
|
|
3957
|
+
getContent: function () {
|
3958
|
+
return this._content;
|
3959
|
+
},
|
3960
|
+
|
3840
3961
|
setContent: function (content) {
|
3841
3962
|
this._content = content;
|
3842
|
-
this.
|
3963
|
+
this.update();
|
3843
3964
|
return this;
|
3844
3965
|
},
|
3845
3966
|
|
3967
|
+
update: function () {
|
3968
|
+
if (!this._map) { return; }
|
3969
|
+
|
3970
|
+
this._container.style.visibility = 'hidden';
|
3971
|
+
|
3972
|
+
this._updateContent();
|
3973
|
+
this._updateLayout();
|
3974
|
+
this._updatePosition();
|
3975
|
+
|
3976
|
+
this._container.style.visibility = '';
|
3977
|
+
|
3978
|
+
this._adjustPan();
|
3979
|
+
},
|
3980
|
+
|
3846
3981
|
_getEvents: function () {
|
3847
3982
|
var events = {
|
3848
3983
|
viewreset: this._updatePosition
|
@@ -3889,27 +4024,14 @@ L.Popup = L.Class.extend({
|
|
3889
4024
|
L.DomEvent.disableClickPropagation(wrapper);
|
3890
4025
|
|
3891
4026
|
this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);
|
3892
|
-
|
3893
|
-
L.DomEvent.
|
4027
|
+
|
4028
|
+
L.DomEvent.disableScrollPropagation(this._contentNode);
|
3894
4029
|
L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);
|
4030
|
+
|
3895
4031
|
this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);
|
3896
4032
|
this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);
|
3897
4033
|
},
|
3898
4034
|
|
3899
|
-
_update: function () {
|
3900
|
-
if (!this._map) { return; }
|
3901
|
-
|
3902
|
-
this._container.style.visibility = 'hidden';
|
3903
|
-
|
3904
|
-
this._updateContent();
|
3905
|
-
this._updateLayout();
|
3906
|
-
this._updatePosition();
|
3907
|
-
|
3908
|
-
this._container.style.visibility = '';
|
3909
|
-
|
3910
|
-
this._adjustPan();
|
3911
|
-
},
|
3912
|
-
|
3913
4035
|
_updateContent: function () {
|
3914
4036
|
if (!this._content) { return; }
|
3915
4037
|
|
@@ -3994,21 +4116,23 @@ L.Popup = L.Class.extend({
|
|
3994
4116
|
|
3995
4117
|
var containerPos = map.layerPointToContainerPoint(layerPos),
|
3996
4118
|
padding = L.point(this.options.autoPanPadding),
|
4119
|
+
paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),
|
4120
|
+
paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),
|
3997
4121
|
size = map.getSize(),
|
3998
4122
|
dx = 0,
|
3999
4123
|
dy = 0;
|
4000
4124
|
|
4001
|
-
if (containerPos.x + containerWidth > size.x) { // right
|
4002
|
-
dx = containerPos.x + containerWidth - size.x +
|
4125
|
+
if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right
|
4126
|
+
dx = containerPos.x + containerWidth - size.x + paddingBR.x;
|
4003
4127
|
}
|
4004
|
-
if (containerPos.x - dx < 0) { // left
|
4005
|
-
dx = containerPos.x -
|
4128
|
+
if (containerPos.x - dx - paddingTL.x < 0) { // left
|
4129
|
+
dx = containerPos.x - paddingTL.x;
|
4006
4130
|
}
|
4007
|
-
if (containerPos.y + containerHeight > size.y) { // bottom
|
4008
|
-
dy = containerPos.y + containerHeight - size.y +
|
4131
|
+
if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom
|
4132
|
+
dy = containerPos.y + containerHeight - size.y + paddingBR.y;
|
4009
4133
|
}
|
4010
|
-
if (containerPos.y - dy < 0) { // top
|
4011
|
-
dy = containerPos.y -
|
4134
|
+
if (containerPos.y - dy - paddingTL.y < 0) { // top
|
4135
|
+
dy = containerPos.y - paddingTL.y;
|
4012
4136
|
}
|
4013
4137
|
|
4014
4138
|
if (dx || dy) {
|
@@ -4103,11 +4227,12 @@ L.Marker.include({
|
|
4103
4227
|
|
4104
4228
|
options = L.extend({offset: anchor}, options);
|
4105
4229
|
|
4106
|
-
if (!this.
|
4230
|
+
if (!this._popupHandlersAdded) {
|
4107
4231
|
this
|
4108
4232
|
.on('click', this.togglePopup, this)
|
4109
4233
|
.on('remove', this.closePopup, this)
|
4110
4234
|
.on('move', this._movePopup, this);
|
4235
|
+
this._popupHandlersAdded = true;
|
4111
4236
|
}
|
4112
4237
|
|
4113
4238
|
if (content instanceof L.Popup) {
|
@@ -4132,13 +4257,18 @@ L.Marker.include({
|
|
4132
4257
|
if (this._popup) {
|
4133
4258
|
this._popup = null;
|
4134
4259
|
this
|
4135
|
-
.off('click', this.togglePopup)
|
4136
|
-
.off('remove', this.closePopup)
|
4137
|
-
.off('move', this._movePopup);
|
4260
|
+
.off('click', this.togglePopup, this)
|
4261
|
+
.off('remove', this.closePopup, this)
|
4262
|
+
.off('move', this._movePopup, this);
|
4263
|
+
this._popupHandlersAdded = false;
|
4138
4264
|
}
|
4139
4265
|
return this;
|
4140
4266
|
},
|
4141
4267
|
|
4268
|
+
getPopup: function () {
|
4269
|
+
return this._popup;
|
4270
|
+
},
|
4271
|
+
|
4142
4272
|
_movePopup: function (e) {
|
4143
4273
|
this._popup.setLatLng(e.latlng);
|
4144
4274
|
}
|
@@ -4279,7 +4409,9 @@ L.FeatureGroup = L.LayerGroup.extend({
|
|
4279
4409
|
return this;
|
4280
4410
|
}
|
4281
4411
|
|
4282
|
-
|
4412
|
+
if ('on' in layer) {
|
4413
|
+
layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);
|
4414
|
+
}
|
4283
4415
|
|
4284
4416
|
L.LayerGroup.prototype.addLayer.call(this, layer);
|
4285
4417
|
|
@@ -4315,6 +4447,15 @@ L.FeatureGroup = L.LayerGroup.extend({
|
|
4315
4447
|
return this.invoke('bindPopup', content, options);
|
4316
4448
|
},
|
4317
4449
|
|
4450
|
+
openPopup: function (latlng) {
|
4451
|
+
// open popup on the first layer
|
4452
|
+
for (var id in this._layers) {
|
4453
|
+
this._layers[id].openPopup(latlng);
|
4454
|
+
break;
|
4455
|
+
}
|
4456
|
+
return this;
|
4457
|
+
},
|
4458
|
+
|
4318
4459
|
setStyle: function (style) {
|
4319
4460
|
return this.invoke('setStyle', style);
|
4320
4461
|
},
|
@@ -4338,11 +4479,10 @@ L.FeatureGroup = L.LayerGroup.extend({
|
|
4338
4479
|
},
|
4339
4480
|
|
4340
4481
|
_propagateEvent: function (e) {
|
4341
|
-
|
4342
|
-
|
4343
|
-
|
4344
|
-
|
4345
|
-
|
4482
|
+
e = L.extend({}, e, {
|
4483
|
+
layer: e.target,
|
4484
|
+
target: this
|
4485
|
+
});
|
4346
4486
|
this.fire(e.type, e);
|
4347
4487
|
}
|
4348
4488
|
});
|
@@ -4374,6 +4514,8 @@ L.Path = L.Class.extend({
|
|
4374
4514
|
stroke: true,
|
4375
4515
|
color: '#0033ff',
|
4376
4516
|
dashArray: null,
|
4517
|
+
lineCap: null,
|
4518
|
+
lineJoin: null,
|
4377
4519
|
weight: 5,
|
4378
4520
|
opacity: 0.5,
|
4379
4521
|
|
@@ -4523,6 +4665,11 @@ L.Path = L.Path.extend({
|
|
4523
4665
|
this._container = this._createElement('g');
|
4524
4666
|
|
4525
4667
|
this._path = this._createElement('path');
|
4668
|
+
|
4669
|
+
if (this.options.className) {
|
4670
|
+
L.DomUtil.addClass(this._path, this.options.className);
|
4671
|
+
}
|
4672
|
+
|
4526
4673
|
this._container.appendChild(this._path);
|
4527
4674
|
},
|
4528
4675
|
|
@@ -4553,6 +4700,12 @@ L.Path = L.Path.extend({
|
|
4553
4700
|
} else {
|
4554
4701
|
this._path.removeAttribute('stroke-dasharray');
|
4555
4702
|
}
|
4703
|
+
if (this.options.lineCap) {
|
4704
|
+
this._path.setAttribute('stroke-linecap', this.options.lineCap);
|
4705
|
+
}
|
4706
|
+
if (this.options.lineJoin) {
|
4707
|
+
this._path.setAttribute('stroke-linejoin', this.options.lineJoin);
|
4708
|
+
}
|
4556
4709
|
} else {
|
4557
4710
|
this._path.setAttribute('stroke', 'none');
|
4558
4711
|
}
|
@@ -4577,7 +4730,7 @@ L.Path = L.Path.extend({
|
|
4577
4730
|
_initEvents: function () {
|
4578
4731
|
if (this.options.clickable) {
|
4579
4732
|
if (L.Browser.svg || !L.Browser.vml) {
|
4580
|
-
this._path
|
4733
|
+
L.DomUtil.addClass(this._path, 'leaflet-clickable');
|
4581
4734
|
}
|
4582
4735
|
|
4583
4736
|
L.DomEvent.on(this._container, 'click', this._onMouseClick, this);
|
@@ -4627,14 +4780,14 @@ L.Map.include({
|
|
4627
4780
|
this._panes.overlayPane.appendChild(this._pathRoot);
|
4628
4781
|
|
4629
4782
|
if (this.options.zoomAnimation && L.Browser.any3d) {
|
4630
|
-
this._pathRoot
|
4783
|
+
L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated');
|
4631
4784
|
|
4632
4785
|
this.on({
|
4633
4786
|
'zoomanim': this._animatePathZoom,
|
4634
4787
|
'zoomend': this._endPathZoom
|
4635
4788
|
});
|
4636
4789
|
} else {
|
4637
|
-
this._pathRoot
|
4790
|
+
L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide');
|
4638
4791
|
}
|
4639
4792
|
|
4640
4793
|
this.on('moveend', this._updateSvgViewport);
|
@@ -4801,10 +4954,14 @@ L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({
|
|
4801
4954
|
|
4802
4955
|
_initPath: function () {
|
4803
4956
|
var container = this._container = this._createElement('shape');
|
4804
|
-
|
4957
|
+
|
4958
|
+
L.DomUtil.addClass(container, 'leaflet-vml-shape' +
|
4959
|
+
(this.options.className ? ' ' + this.options.className : ''));
|
4960
|
+
|
4805
4961
|
if (this.options.clickable) {
|
4806
4962
|
L.DomUtil.addClass(container, 'leaflet-clickable');
|
4807
4963
|
}
|
4964
|
+
|
4808
4965
|
container.coordsize = '1 1';
|
4809
4966
|
|
4810
4967
|
this._path = this._createElement('path');
|
@@ -4837,12 +4994,18 @@ L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({
|
|
4837
4994
|
stroke.opacity = options.opacity;
|
4838
4995
|
|
4839
4996
|
if (options.dashArray) {
|
4840
|
-
stroke.dashStyle = options.dashArray
|
4997
|
+
stroke.dashStyle = L.Util.isArray(options.dashArray) ?
|
4841
4998
|
options.dashArray.join(' ') :
|
4842
4999
|
options.dashArray.replace(/( *, *)/g, ' ');
|
4843
5000
|
} else {
|
4844
5001
|
stroke.dashStyle = '';
|
4845
5002
|
}
|
5003
|
+
if (options.lineCap) {
|
5004
|
+
stroke.endcap = options.lineCap.replace('butt', 'flat');
|
5005
|
+
}
|
5006
|
+
if (options.lineJoin) {
|
5007
|
+
stroke.joinstyle = options.lineJoin;
|
5008
|
+
}
|
4846
5009
|
|
4847
5010
|
} else if (stroke) {
|
4848
5011
|
container.removeChild(stroke);
|
@@ -5522,10 +5685,12 @@ L.Polygon = L.Polyline.extend({
|
|
5522
5685
|
},
|
5523
5686
|
|
5524
5687
|
initialize: function (latlngs, options) {
|
5525
|
-
var i, len, hole;
|
5526
|
-
|
5527
5688
|
L.Polyline.prototype.initialize.call(this, latlngs, options);
|
5689
|
+
this._initWithHoles(latlngs);
|
5690
|
+
},
|
5528
5691
|
|
5692
|
+
_initWithHoles: function (latlngs) {
|
5693
|
+
var i, len, hole;
|
5529
5694
|
if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {
|
5530
5695
|
this._latlngs = this._convertLatLngs(latlngs[0]);
|
5531
5696
|
this._holes = latlngs.slice(1);
|
@@ -5566,6 +5731,15 @@ L.Polygon = L.Polyline.extend({
|
|
5566
5731
|
}
|
5567
5732
|
},
|
5568
5733
|
|
5734
|
+
setLatLngs: function (latlngs) {
|
5735
|
+
if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {
|
5736
|
+
this._initWithHoles(latlngs);
|
5737
|
+
return this.redraw();
|
5738
|
+
} else {
|
5739
|
+
return L.Polyline.prototype.setLatLngs.call(this, latlngs);
|
5740
|
+
}
|
5741
|
+
},
|
5742
|
+
|
5569
5743
|
_clipPoints: function () {
|
5570
5744
|
var points = this._originalPoints,
|
5571
5745
|
newParts = [];
|
@@ -5807,9 +5981,20 @@ L.CircleMarker = L.Circle.extend({
|
|
5807
5981
|
this.setRadius(this.options.radius);
|
5808
5982
|
},
|
5809
5983
|
|
5984
|
+
setLatLng: function (latlng) {
|
5985
|
+
L.Circle.prototype.setLatLng.call(this, latlng);
|
5986
|
+
if (this._popup && this._popup._isOpen) {
|
5987
|
+
this._popup.setLatLng(latlng);
|
5988
|
+
}
|
5989
|
+
},
|
5990
|
+
|
5810
5991
|
setRadius: function (radius) {
|
5811
5992
|
this.options.radius = this._radius = radius;
|
5812
5993
|
return this.redraw();
|
5994
|
+
},
|
5995
|
+
|
5996
|
+
getRadius: function () {
|
5997
|
+
return this._radius;
|
5813
5998
|
}
|
5814
5999
|
});
|
5815
6000
|
|
@@ -5955,7 +6140,7 @@ L.GeoJSON = L.FeatureGroup.extend({
|
|
5955
6140
|
|
5956
6141
|
if (options.filter && !options.filter(geojson)) { return; }
|
5957
6142
|
|
5958
|
-
var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng);
|
6143
|
+
var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options);
|
5959
6144
|
layer.feature = L.GeoJSON.asFeature(geojson);
|
5960
6145
|
|
5961
6146
|
layer.defaultOptions = layer.options;
|
@@ -5995,11 +6180,11 @@ L.GeoJSON = L.FeatureGroup.extend({
|
|
5995
6180
|
});
|
5996
6181
|
|
5997
6182
|
L.extend(L.GeoJSON, {
|
5998
|
-
geometryToLayer: function (geojson, pointToLayer, coordsToLatLng) {
|
6183
|
+
geometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) {
|
5999
6184
|
var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,
|
6000
6185
|
coords = geometry.coordinates,
|
6001
6186
|
layers = [],
|
6002
|
-
latlng, latlngs, i, len
|
6187
|
+
latlng, latlngs, i, len;
|
6003
6188
|
|
6004
6189
|
coordsToLatLng = coordsToLatLng || this.coordsToLatLng;
|
6005
6190
|
|
@@ -6011,37 +6196,37 @@ L.extend(L.GeoJSON, {
|
|
6011
6196
|
case 'MultiPoint':
|
6012
6197
|
for (i = 0, len = coords.length; i < len; i++) {
|
6013
6198
|
latlng = coordsToLatLng(coords[i]);
|
6014
|
-
|
6015
|
-
layers.push(layer);
|
6199
|
+
layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));
|
6016
6200
|
}
|
6017
6201
|
return new L.FeatureGroup(layers);
|
6018
6202
|
|
6019
6203
|
case 'LineString':
|
6020
6204
|
latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng);
|
6021
|
-
return new L.Polyline(latlngs);
|
6205
|
+
return new L.Polyline(latlngs, vectorOptions);
|
6022
6206
|
|
6023
6207
|
case 'Polygon':
|
6208
|
+
if (coords.length === 2 && !coords[1].length) {
|
6209
|
+
throw new Error('Invalid GeoJSON object.');
|
6210
|
+
}
|
6024
6211
|
latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);
|
6025
|
-
return new L.Polygon(latlngs);
|
6212
|
+
return new L.Polygon(latlngs, vectorOptions);
|
6026
6213
|
|
6027
6214
|
case 'MultiLineString':
|
6028
6215
|
latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);
|
6029
|
-
return new L.MultiPolyline(latlngs);
|
6216
|
+
return new L.MultiPolyline(latlngs, vectorOptions);
|
6030
6217
|
|
6031
6218
|
case 'MultiPolygon':
|
6032
6219
|
latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng);
|
6033
|
-
return new L.MultiPolygon(latlngs);
|
6220
|
+
return new L.MultiPolygon(latlngs, vectorOptions);
|
6034
6221
|
|
6035
6222
|
case 'GeometryCollection':
|
6036
6223
|
for (i = 0, len = geometry.geometries.length; i < len; i++) {
|
6037
6224
|
|
6038
|
-
|
6225
|
+
layers.push(this.geometryToLayer({
|
6039
6226
|
geometry: geometry.geometries[i],
|
6040
6227
|
type: 'Feature',
|
6041
6228
|
properties: geojson.properties
|
6042
|
-
}, pointToLayer, coordsToLatLng);
|
6043
|
-
|
6044
|
-
layers.push(layer);
|
6229
|
+
}, pointToLayer, coordsToLatLng, vectorOptions));
|
6045
6230
|
}
|
6046
6231
|
return new L.FeatureGroup(layers);
|
6047
6232
|
|
@@ -6051,7 +6236,7 @@ L.extend(L.GeoJSON, {
|
|
6051
6236
|
},
|
6052
6237
|
|
6053
6238
|
coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng
|
6054
|
-
return new L.LatLng(coords[1], coords[0]);
|
6239
|
+
return new L.LatLng(coords[1], coords[0], coords[2]);
|
6055
6240
|
},
|
6056
6241
|
|
6057
6242
|
coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array
|
@@ -6069,8 +6254,13 @@ L.extend(L.GeoJSON, {
|
|
6069
6254
|
return latlngs;
|
6070
6255
|
},
|
6071
6256
|
|
6072
|
-
latLngToCoords: function (
|
6073
|
-
|
6257
|
+
latLngToCoords: function (latlng) {
|
6258
|
+
var coords = [latlng.lng, latlng.lat];
|
6259
|
+
|
6260
|
+
if (latlng.alt !== undefined) {
|
6261
|
+
coords.push(latlng.alt);
|
6262
|
+
}
|
6263
|
+
return coords;
|
6074
6264
|
},
|
6075
6265
|
|
6076
6266
|
latLngsToCoords: function (latLngs) {
|
@@ -6145,43 +6335,58 @@ L.Polygon.include({
|
|
6145
6335
|
});
|
6146
6336
|
|
6147
6337
|
(function () {
|
6148
|
-
function
|
6149
|
-
|
6150
|
-
|
6151
|
-
var coords = [];
|
6338
|
+
function multiToGeoJSON(type) {
|
6339
|
+
return function () {
|
6340
|
+
var coords = [];
|
6152
6341
|
|
6153
|
-
|
6154
|
-
|
6155
|
-
|
6342
|
+
this.eachLayer(function (layer) {
|
6343
|
+
coords.push(layer.toGeoJSON().geometry.coordinates);
|
6344
|
+
});
|
6156
6345
|
|
6157
|
-
|
6158
|
-
|
6159
|
-
|
6160
|
-
|
6161
|
-
|
6162
|
-
});
|
6346
|
+
return L.GeoJSON.getFeature(this, {
|
6347
|
+
type: type,
|
6348
|
+
coordinates: coords
|
6349
|
+
});
|
6350
|
+
};
|
6163
6351
|
}
|
6164
6352
|
|
6165
|
-
|
6166
|
-
|
6167
|
-
}());
|
6353
|
+
L.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')});
|
6354
|
+
L.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')});
|
6168
6355
|
|
6169
|
-
L.LayerGroup.include({
|
6170
|
-
|
6171
|
-
var features = [];
|
6356
|
+
L.LayerGroup.include({
|
6357
|
+
toGeoJSON: function () {
|
6172
6358
|
|
6173
|
-
|
6174
|
-
|
6175
|
-
|
6359
|
+
var geometry = this.feature && this.feature.geometry,
|
6360
|
+
jsons = [],
|
6361
|
+
json;
|
6362
|
+
|
6363
|
+
if (geometry && geometry.type === 'MultiPoint') {
|
6364
|
+
return multiToGeoJSON('MultiPoint').call(this);
|
6176
6365
|
}
|
6177
|
-
});
|
6178
6366
|
|
6179
|
-
|
6180
|
-
|
6181
|
-
|
6182
|
-
|
6183
|
-
|
6184
|
-
|
6367
|
+
var isGeometryCollection = geometry && geometry.type === 'GeometryCollection';
|
6368
|
+
|
6369
|
+
this.eachLayer(function (layer) {
|
6370
|
+
if (layer.toGeoJSON) {
|
6371
|
+
json = layer.toGeoJSON();
|
6372
|
+
jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));
|
6373
|
+
}
|
6374
|
+
});
|
6375
|
+
|
6376
|
+
if (isGeometryCollection) {
|
6377
|
+
return L.GeoJSON.getFeature(this, {
|
6378
|
+
geometries: jsons,
|
6379
|
+
type: 'GeometryCollection'
|
6380
|
+
});
|
6381
|
+
}
|
6382
|
+
|
6383
|
+
return {
|
6384
|
+
type: 'FeatureCollection',
|
6385
|
+
features: jsons
|
6386
|
+
};
|
6387
|
+
}
|
6388
|
+
});
|
6389
|
+
}());
|
6185
6390
|
|
6186
6391
|
L.geoJson = function (geojson, options) {
|
6187
6392
|
return new L.GeoJSON(geojson, options);
|
@@ -6206,8 +6411,8 @@ L.DomEvent = {
|
|
6206
6411
|
return fn.call(context || obj, e || L.DomEvent._getEvent());
|
6207
6412
|
};
|
6208
6413
|
|
6209
|
-
if (L.Browser.
|
6210
|
-
return this.
|
6414
|
+
if (L.Browser.pointer && type.indexOf('touch') === 0) {
|
6415
|
+
return this.addPointerListener(obj, type, handler, id);
|
6211
6416
|
}
|
6212
6417
|
if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {
|
6213
6418
|
this.addDoubleTapListener(obj, handler, id);
|
@@ -6259,8 +6464,8 @@ L.DomEvent = {
|
|
6259
6464
|
|
6260
6465
|
if (!handler) { return this; }
|
6261
6466
|
|
6262
|
-
if (L.Browser.
|
6263
|
-
this.
|
6467
|
+
if (L.Browser.pointer && type.indexOf('touch') === 0) {
|
6468
|
+
this.removePointerListener(obj, type, id);
|
6264
6469
|
} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {
|
6265
6470
|
this.removeDoubleTapListener(obj, id);
|
6266
6471
|
|
@@ -6291,19 +6496,29 @@ L.DomEvent = {
|
|
6291
6496
|
} else {
|
6292
6497
|
e.cancelBubble = true;
|
6293
6498
|
}
|
6499
|
+
L.DomEvent._skipped(e);
|
6500
|
+
|
6294
6501
|
return this;
|
6295
6502
|
},
|
6296
6503
|
|
6504
|
+
disableScrollPropagation: function (el) {
|
6505
|
+
var stop = L.DomEvent.stopPropagation;
|
6506
|
+
|
6507
|
+
return L.DomEvent
|
6508
|
+
.on(el, 'mousewheel', stop)
|
6509
|
+
.on(el, 'MozMousePixelScroll', stop);
|
6510
|
+
},
|
6511
|
+
|
6297
6512
|
disableClickPropagation: function (el) {
|
6298
6513
|
var stop = L.DomEvent.stopPropagation;
|
6299
6514
|
|
6300
6515
|
for (var i = L.Draggable.START.length - 1; i >= 0; i--) {
|
6301
|
-
L.DomEvent.
|
6516
|
+
L.DomEvent.on(el, L.Draggable.START[i], stop);
|
6302
6517
|
}
|
6303
6518
|
|
6304
6519
|
return L.DomEvent
|
6305
|
-
.
|
6306
|
-
.
|
6520
|
+
.on(el, 'click', L.DomEvent._fakeStop)
|
6521
|
+
.on(el, 'dblclick', stop);
|
6307
6522
|
},
|
6308
6523
|
|
6309
6524
|
preventDefault: function (e) {
|
@@ -6317,34 +6532,31 @@ L.DomEvent = {
|
|
6317
6532
|
},
|
6318
6533
|
|
6319
6534
|
stop: function (e) {
|
6320
|
-
return L.DomEvent
|
6535
|
+
return L.DomEvent
|
6536
|
+
.preventDefault(e)
|
6537
|
+
.stopPropagation(e);
|
6321
6538
|
},
|
6322
6539
|
|
6323
6540
|
getMousePosition: function (e, container) {
|
6324
|
-
|
6325
|
-
var ie7 = L.Browser.ie7,
|
6326
|
-
body = document.body,
|
6541
|
+
var body = document.body,
|
6327
6542
|
docEl = document.documentElement,
|
6328
|
-
|
6543
|
+
//gecko makes scrollLeft more negative as you scroll in rtl, other browsers don't
|
6544
|
+
//ref: https://code.google.com/p/closure-library/source/browse/closure/goog/style/bidi.js
|
6545
|
+
x = L.DomUtil.documentIsLtr() ?
|
6546
|
+
(e.pageX ? e.pageX - body.scrollLeft - docEl.scrollLeft : e.clientX) :
|
6547
|
+
(L.Browser.gecko ? e.pageX - body.scrollLeft - docEl.scrollLeft :
|
6548
|
+
e.pageX ? e.pageX - body.scrollLeft + docEl.scrollLeft : e.clientX),
|
6329
6549
|
y = e.pageY ? e.pageY - body.scrollTop - docEl.scrollTop: e.clientY,
|
6330
|
-
pos = new L.Point(x, y)
|
6331
|
-
rect = container.getBoundingClientRect(),
|
6332
|
-
left = rect.left - container.clientLeft,
|
6333
|
-
top = rect.top - container.clientTop;
|
6550
|
+
pos = new L.Point(x, y);
|
6334
6551
|
|
6335
|
-
|
6336
|
-
|
6337
|
-
if (!L.DomUtil.documentIsLtr() && (L.Browser.webkit || ie7)) {
|
6338
|
-
left += container.scrollWidth - container.clientWidth;
|
6339
|
-
|
6340
|
-
// ie7 shows the scrollbar by default and provides clientWidth counting it, so we
|
6341
|
-
// need to add it back in if it is visible; scrollbar is on the left as we are RTL
|
6342
|
-
if (ie7 && L.DomUtil.getStyle(container, 'overflow-y') !== 'hidden' &&
|
6343
|
-
L.DomUtil.getStyle(container, 'overflow') !== 'hidden') {
|
6344
|
-
left += 17;
|
6345
|
-
}
|
6552
|
+
if (!container) {
|
6553
|
+
return pos;
|
6346
6554
|
}
|
6347
6555
|
|
6556
|
+
var rect = container.getBoundingClientRect(),
|
6557
|
+
left = rect.left - container.clientLeft,
|
6558
|
+
top = rect.top - container.clientTop;
|
6559
|
+
|
6348
6560
|
return pos._subtract(new L.Point(left, top));
|
6349
6561
|
},
|
6350
6562
|
|
@@ -6444,11 +6656,13 @@ L.Draggable = L.Class.extend({
|
|
6444
6656
|
END: {
|
6445
6657
|
mousedown: 'mouseup',
|
6446
6658
|
touchstart: 'touchend',
|
6659
|
+
pointerdown: 'touchend',
|
6447
6660
|
MSPointerDown: 'touchend'
|
6448
6661
|
},
|
6449
6662
|
MOVE: {
|
6450
6663
|
mousedown: 'mousemove',
|
6451
6664
|
touchstart: 'touchmove',
|
6665
|
+
pointerdown: 'touchmove',
|
6452
6666
|
MSPointerDown: 'touchmove'
|
6453
6667
|
}
|
6454
6668
|
},
|
@@ -6480,28 +6694,21 @@ L.Draggable = L.Class.extend({
|
|
6480
6694
|
},
|
6481
6695
|
|
6482
6696
|
_onDown: function (e) {
|
6697
|
+
this._moved = false;
|
6698
|
+
|
6483
6699
|
if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }
|
6484
6700
|
|
6485
|
-
L.DomEvent
|
6486
|
-
.stopPropagation(e);
|
6701
|
+
L.DomEvent.stopPropagation(e);
|
6487
6702
|
|
6488
6703
|
if (L.Draggable._disabled) { return; }
|
6489
6704
|
|
6490
6705
|
L.DomUtil.disableImageDrag();
|
6491
6706
|
L.DomUtil.disableTextSelection();
|
6492
6707
|
|
6493
|
-
var first = e.touches ? e.touches[0] : e,
|
6494
|
-
el = first.target;
|
6495
|
-
|
6496
|
-
// if touching a link, highlight it
|
6497
|
-
if (L.Browser.touch && el.tagName.toLowerCase() === 'a') {
|
6498
|
-
L.DomUtil.addClass(el, 'leaflet-active');
|
6499
|
-
}
|
6500
|
-
|
6501
|
-
this._moved = false;
|
6502
|
-
|
6503
6708
|
if (this._moving) { return; }
|
6504
6709
|
|
6710
|
+
var first = e.touches ? e.touches[0] : e;
|
6711
|
+
|
6505
6712
|
this._startPoint = new L.Point(first.clientX, first.clientY);
|
6506
6713
|
this._startPos = this._newPos = L.DomUtil.getPosition(this._element);
|
6507
6714
|
|
@@ -6511,7 +6718,10 @@ L.Draggable = L.Class.extend({
|
|
6511
6718
|
},
|
6512
6719
|
|
6513
6720
|
_onMove: function (e) {
|
6514
|
-
if (e.touches && e.touches.length > 1) {
|
6721
|
+
if (e.touches && e.touches.length > 1) {
|
6722
|
+
this._moved = true;
|
6723
|
+
return;
|
6724
|
+
}
|
6515
6725
|
|
6516
6726
|
var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),
|
6517
6727
|
newPoint = new L.Point(first.clientX, first.clientY),
|
@@ -6527,9 +6737,8 @@ L.Draggable = L.Class.extend({
|
|
6527
6737
|
this._moved = true;
|
6528
6738
|
this._startPos = L.DomUtil.getPosition(this._element).subtract(offset);
|
6529
6739
|
|
6530
|
-
|
6531
|
-
|
6532
|
-
}
|
6740
|
+
L.DomUtil.addClass(document.body, 'leaflet-dragging');
|
6741
|
+
L.DomUtil.addClass((e.target || e.srcElement), 'leaflet-drag-target');
|
6533
6742
|
}
|
6534
6743
|
|
6535
6744
|
this._newPos = this._startPos.add(offset);
|
@@ -6545,10 +6754,9 @@ L.Draggable = L.Class.extend({
|
|
6545
6754
|
this.fire('drag');
|
6546
6755
|
},
|
6547
6756
|
|
6548
|
-
_onUp: function () {
|
6549
|
-
|
6550
|
-
|
6551
|
-
}
|
6757
|
+
_onUp: function (e) {
|
6758
|
+
L.DomUtil.removeClass(document.body, 'leaflet-dragging');
|
6759
|
+
L.DomUtil.removeClass((e.target || e.srcElement), 'leaflet-drag-target');
|
6552
6760
|
|
6553
6761
|
for (var i in L.Draggable.MOVE) {
|
6554
6762
|
L.DomEvent
|
@@ -6563,7 +6771,9 @@ L.Draggable = L.Class.extend({
|
|
6563
6771
|
// ensure drag is not fired after dragend
|
6564
6772
|
L.Util.cancelAnimFrame(this._animRequest);
|
6565
6773
|
|
6566
|
-
this.fire('dragend'
|
6774
|
+
this.fire('dragend', {
|
6775
|
+
distance: this._newPos.distanceTo(this._startPos)
|
6776
|
+
});
|
6567
6777
|
}
|
6568
6778
|
|
6569
6779
|
this._moving = false;
|
@@ -6635,7 +6845,7 @@ L.Map.Drag = L.Handler.extend({
|
|
6635
6845
|
this._draggable.on('predrag', this._onPreDrag, this);
|
6636
6846
|
map.on('viewreset', this._onViewReset, this);
|
6637
6847
|
|
6638
|
-
this._onViewReset
|
6848
|
+
map.whenReady(this._onViewReset, this);
|
6639
6849
|
}
|
6640
6850
|
}
|
6641
6851
|
this._draggable.enable();
|
@@ -6707,14 +6917,14 @@ L.Map.Drag = L.Handler.extend({
|
|
6707
6917
|
this._draggable._newPos.x = newX;
|
6708
6918
|
},
|
6709
6919
|
|
6710
|
-
_onDragEnd: function () {
|
6920
|
+
_onDragEnd: function (e) {
|
6711
6921
|
var map = this._map,
|
6712
6922
|
options = map.options,
|
6713
6923
|
delay = +new Date() - this._lastTime,
|
6714
6924
|
|
6715
6925
|
noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0];
|
6716
6926
|
|
6717
|
-
map.fire('dragend');
|
6927
|
+
map.fire('dragend', e);
|
6718
6928
|
|
6719
6929
|
if (noInertia) {
|
6720
6930
|
map.fire('moveend');
|
@@ -6738,6 +6948,8 @@ L.Map.Drag = L.Handler.extend({
|
|
6738
6948
|
map.fire('moveend');
|
6739
6949
|
|
6740
6950
|
} else {
|
6951
|
+
offset = map._limitOffset(offset, map.options.maxBounds);
|
6952
|
+
|
6741
6953
|
L.Util.requestAnimFrame(function () {
|
6742
6954
|
map.panBy(offset, {
|
6743
6955
|
duration: decelerationDuration,
|
@@ -6763,15 +6975,22 @@ L.Map.mergeOptions({
|
|
6763
6975
|
|
6764
6976
|
L.Map.DoubleClickZoom = L.Handler.extend({
|
6765
6977
|
addHooks: function () {
|
6766
|
-
this._map.on('dblclick', this._onDoubleClick);
|
6978
|
+
this._map.on('dblclick', this._onDoubleClick, this);
|
6767
6979
|
},
|
6768
6980
|
|
6769
6981
|
removeHooks: function () {
|
6770
|
-
this._map.off('dblclick', this._onDoubleClick);
|
6982
|
+
this._map.off('dblclick', this._onDoubleClick, this);
|
6771
6983
|
},
|
6772
6984
|
|
6773
6985
|
_onDoubleClick: function (e) {
|
6774
|
-
this.
|
6986
|
+
var map = this._map,
|
6987
|
+
zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1);
|
6988
|
+
|
6989
|
+
if (map.options.doubleClickZoom === 'center') {
|
6990
|
+
map.setZoom(zoom);
|
6991
|
+
} else {
|
6992
|
+
map.setZoomAround(e.containerPoint, zoom);
|
6993
|
+
}
|
6775
6994
|
}
|
6776
6995
|
});
|
6777
6996
|
|
@@ -6831,7 +7050,11 @@ L.Map.ScrollWheelZoom = L.Handler.extend({
|
|
6831
7050
|
|
6832
7051
|
if (!delta) { return; }
|
6833
7052
|
|
6834
|
-
map.
|
7053
|
+
if (map.options.scrollWheelZoom === 'center') {
|
7054
|
+
map.setZoom(zoom + delta);
|
7055
|
+
} else {
|
7056
|
+
map.setZoomAround(this._lastMousePos, zoom + delta);
|
7057
|
+
}
|
6835
7058
|
}
|
6836
7059
|
});
|
6837
7060
|
|
@@ -6844,8 +7067,8 @@ L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);
|
|
6844
7067
|
|
6845
7068
|
L.extend(L.DomEvent, {
|
6846
7069
|
|
6847
|
-
_touchstart: L.Browser.
|
6848
|
-
_touchend: L.Browser.
|
7070
|
+
_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',
|
7071
|
+
_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',
|
6849
7072
|
|
6850
7073
|
// inspired by Zepto touch code by Thomas Fuchs
|
6851
7074
|
addDoubleTapListener: function (obj, handler, id) {
|
@@ -6861,7 +7084,7 @@ L.extend(L.DomEvent, {
|
|
6861
7084
|
function onTouchStart(e) {
|
6862
7085
|
var count;
|
6863
7086
|
|
6864
|
-
if (L.Browser.
|
7087
|
+
if (L.Browser.pointer) {
|
6865
7088
|
trackedTouches.push(e.pointerId);
|
6866
7089
|
count = trackedTouches.length;
|
6867
7090
|
} else {
|
@@ -6880,7 +7103,7 @@ L.extend(L.DomEvent, {
|
|
6880
7103
|
}
|
6881
7104
|
|
6882
7105
|
function onTouchEnd(e) {
|
6883
|
-
if (L.Browser.
|
7106
|
+
if (L.Browser.pointer) {
|
6884
7107
|
var idx = trackedTouches.indexOf(e.pointerId);
|
6885
7108
|
if (idx === -1) {
|
6886
7109
|
return;
|
@@ -6889,7 +7112,7 @@ L.extend(L.DomEvent, {
|
|
6889
7112
|
}
|
6890
7113
|
|
6891
7114
|
if (doubleTap) {
|
6892
|
-
if (L.Browser.
|
7115
|
+
if (L.Browser.pointer) {
|
6893
7116
|
// work around .type being readonly with MSPointer* events
|
6894
7117
|
var newTouch = { },
|
6895
7118
|
prop;
|
@@ -6913,15 +7136,15 @@ L.extend(L.DomEvent, {
|
|
6913
7136
|
obj[pre + touchstart + id] = onTouchStart;
|
6914
7137
|
obj[pre + touchend + id] = onTouchEnd;
|
6915
7138
|
|
6916
|
-
// on
|
7139
|
+
// on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen
|
6917
7140
|
// will not come through to us, so we will lose track of how many touches are ongoing
|
6918
|
-
var endElement = L.Browser.
|
7141
|
+
var endElement = L.Browser.pointer ? document.documentElement : obj;
|
6919
7142
|
|
6920
7143
|
obj.addEventListener(touchstart, onTouchStart, false);
|
6921
7144
|
endElement.addEventListener(touchend, onTouchEnd, false);
|
6922
7145
|
|
6923
|
-
if (L.Browser.
|
6924
|
-
endElement.addEventListener(
|
7146
|
+
if (L.Browser.pointer) {
|
7147
|
+
endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);
|
6925
7148
|
}
|
6926
7149
|
|
6927
7150
|
return this;
|
@@ -6931,11 +7154,12 @@ L.extend(L.DomEvent, {
|
|
6931
7154
|
var pre = '_leaflet_';
|
6932
7155
|
|
6933
7156
|
obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);
|
6934
|
-
(L.Browser.
|
7157
|
+
(L.Browser.pointer ? document.documentElement : obj).removeEventListener(
|
6935
7158
|
this._touchend, obj[pre + this._touchend + id], false);
|
6936
7159
|
|
6937
|
-
if (L.Browser.
|
6938
|
-
document.documentElement.removeEventListener(
|
7160
|
+
if (L.Browser.pointer) {
|
7161
|
+
document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id],
|
7162
|
+
false);
|
6939
7163
|
}
|
6940
7164
|
|
6941
7165
|
return this;
|
@@ -6949,81 +7173,90 @@ L.extend(L.DomEvent, {
|
|
6949
7173
|
|
6950
7174
|
L.extend(L.DomEvent, {
|
6951
7175
|
|
6952
|
-
|
6953
|
-
|
7176
|
+
//static
|
7177
|
+
POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',
|
7178
|
+
POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',
|
7179
|
+
POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',
|
7180
|
+
POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',
|
7181
|
+
|
7182
|
+
_pointers: [],
|
7183
|
+
_pointerDocumentListener: false,
|
6954
7184
|
|
6955
|
-
// Provides a touch events wrapper for
|
7185
|
+
// Provides a touch events wrapper for (ms)pointer events.
|
6956
7186
|
// Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019
|
7187
|
+
//ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890
|
6957
7188
|
|
6958
|
-
|
7189
|
+
addPointerListener: function (obj, type, handler, id) {
|
6959
7190
|
|
6960
7191
|
switch (type) {
|
6961
7192
|
case 'touchstart':
|
6962
|
-
return this.
|
7193
|
+
return this.addPointerListenerStart(obj, type, handler, id);
|
6963
7194
|
case 'touchend':
|
6964
|
-
return this.
|
7195
|
+
return this.addPointerListenerEnd(obj, type, handler, id);
|
6965
7196
|
case 'touchmove':
|
6966
|
-
return this.
|
7197
|
+
return this.addPointerListenerMove(obj, type, handler, id);
|
6967
7198
|
default:
|
6968
7199
|
throw 'Unknown touch event type';
|
6969
7200
|
}
|
6970
7201
|
},
|
6971
7202
|
|
6972
|
-
|
7203
|
+
addPointerListenerStart: function (obj, type, handler, id) {
|
6973
7204
|
var pre = '_leaflet_',
|
6974
|
-
|
7205
|
+
pointers = this._pointers;
|
6975
7206
|
|
6976
7207
|
var cb = function (e) {
|
6977
7208
|
|
7209
|
+
L.DomEvent.preventDefault(e);
|
7210
|
+
|
6978
7211
|
var alreadyInArray = false;
|
6979
|
-
for (var i = 0; i <
|
6980
|
-
if (
|
7212
|
+
for (var i = 0; i < pointers.length; i++) {
|
7213
|
+
if (pointers[i].pointerId === e.pointerId) {
|
6981
7214
|
alreadyInArray = true;
|
6982
7215
|
break;
|
6983
7216
|
}
|
6984
7217
|
}
|
6985
7218
|
if (!alreadyInArray) {
|
6986
|
-
|
7219
|
+
pointers.push(e);
|
6987
7220
|
}
|
6988
7221
|
|
6989
|
-
e.touches =
|
7222
|
+
e.touches = pointers.slice();
|
6990
7223
|
e.changedTouches = [e];
|
6991
7224
|
|
6992
7225
|
handler(e);
|
6993
7226
|
};
|
6994
7227
|
|
6995
7228
|
obj[pre + 'touchstart' + id] = cb;
|
6996
|
-
obj.addEventListener(
|
7229
|
+
obj.addEventListener(this.POINTER_DOWN, cb, false);
|
6997
7230
|
|
6998
|
-
// need to also listen for end events to keep the
|
7231
|
+
// need to also listen for end events to keep the _pointers list accurate
|
6999
7232
|
// this needs to be on the body and never go away
|
7000
|
-
if (!this.
|
7233
|
+
if (!this._pointerDocumentListener) {
|
7001
7234
|
var internalCb = function (e) {
|
7002
|
-
for (var i = 0; i <
|
7003
|
-
if (
|
7004
|
-
|
7235
|
+
for (var i = 0; i < pointers.length; i++) {
|
7236
|
+
if (pointers[i].pointerId === e.pointerId) {
|
7237
|
+
pointers.splice(i, 1);
|
7005
7238
|
break;
|
7006
7239
|
}
|
7007
7240
|
}
|
7008
7241
|
};
|
7009
7242
|
//We listen on the documentElement as any drags that end by moving the touch off the screen get fired there
|
7010
|
-
document.documentElement.addEventListener(
|
7011
|
-
document.documentElement.addEventListener(
|
7243
|
+
document.documentElement.addEventListener(this.POINTER_UP, internalCb, false);
|
7244
|
+
document.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false);
|
7012
7245
|
|
7013
|
-
this.
|
7246
|
+
this._pointerDocumentListener = true;
|
7014
7247
|
}
|
7015
7248
|
|
7016
7249
|
return this;
|
7017
7250
|
},
|
7018
7251
|
|
7019
|
-
|
7252
|
+
addPointerListenerMove: function (obj, type, handler, id) {
|
7020
7253
|
var pre = '_leaflet_',
|
7021
|
-
touches = this.
|
7254
|
+
touches = this._pointers;
|
7022
7255
|
|
7023
7256
|
function cb(e) {
|
7024
7257
|
|
7025
7258
|
// don't fire touch moves when mouse isn't down
|
7026
|
-
if (e.pointerType === e.MSPOINTER_TYPE_MOUSE && e.buttons === 0) { return; }
|
7259
|
+
if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }
|
7027
7260
|
|
7028
7261
|
for (var i = 0; i < touches.length; i++) {
|
7029
7262
|
if (touches[i].pointerId === e.pointerId) {
|
@@ -7039,14 +7272,14 @@ L.extend(L.DomEvent, {
|
|
7039
7272
|
}
|
7040
7273
|
|
7041
7274
|
obj[pre + 'touchmove' + id] = cb;
|
7042
|
-
obj.addEventListener(
|
7275
|
+
obj.addEventListener(this.POINTER_MOVE, cb, false);
|
7043
7276
|
|
7044
7277
|
return this;
|
7045
7278
|
},
|
7046
7279
|
|
7047
|
-
|
7280
|
+
addPointerListenerEnd: function (obj, type, handler, id) {
|
7048
7281
|
var pre = '_leaflet_',
|
7049
|
-
touches = this.
|
7282
|
+
touches = this._pointers;
|
7050
7283
|
|
7051
7284
|
var cb = function (e) {
|
7052
7285
|
for (var i = 0; i < touches.length; i++) {
|
@@ -7063,26 +7296,26 @@ L.extend(L.DomEvent, {
|
|
7063
7296
|
};
|
7064
7297
|
|
7065
7298
|
obj[pre + 'touchend' + id] = cb;
|
7066
|
-
obj.addEventListener(
|
7067
|
-
obj.addEventListener(
|
7299
|
+
obj.addEventListener(this.POINTER_UP, cb, false);
|
7300
|
+
obj.addEventListener(this.POINTER_CANCEL, cb, false);
|
7068
7301
|
|
7069
7302
|
return this;
|
7070
7303
|
},
|
7071
7304
|
|
7072
|
-
|
7305
|
+
removePointerListener: function (obj, type, id) {
|
7073
7306
|
var pre = '_leaflet_',
|
7074
7307
|
cb = obj[pre + type + id];
|
7075
7308
|
|
7076
7309
|
switch (type) {
|
7077
7310
|
case 'touchstart':
|
7078
|
-
obj.removeEventListener(
|
7311
|
+
obj.removeEventListener(this.POINTER_DOWN, cb, false);
|
7079
7312
|
break;
|
7080
7313
|
case 'touchmove':
|
7081
|
-
obj.removeEventListener(
|
7314
|
+
obj.removeEventListener(this.POINTER_MOVE, cb, false);
|
7082
7315
|
break;
|
7083
7316
|
case 'touchend':
|
7084
|
-
obj.removeEventListener(
|
7085
|
-
obj.removeEventListener(
|
7317
|
+
obj.removeEventListener(this.POINTER_UP, cb, false);
|
7318
|
+
obj.removeEventListener(this.POINTER_CANCEL, cb, false);
|
7086
7319
|
break;
|
7087
7320
|
}
|
7088
7321
|
|
@@ -7096,7 +7329,8 @@ L.extend(L.DomEvent, {
|
|
7096
7329
|
*/
|
7097
7330
|
|
7098
7331
|
L.Map.mergeOptions({
|
7099
|
-
touchZoom: L.Browser.touch && !L.Browser.android23
|
7332
|
+
touchZoom: L.Browser.touch && !L.Browser.android23,
|
7333
|
+
bounceAtZoomLimits: true
|
7100
7334
|
});
|
7101
7335
|
|
7102
7336
|
L.Map.TouchZoom = L.Handler.extend({
|
@@ -7149,6 +7383,11 @@ L.Map.TouchZoom = L.Handler.extend({
|
|
7149
7383
|
|
7150
7384
|
if (this._scale === 1) { return; }
|
7151
7385
|
|
7386
|
+
if (!map.options.bounceAtZoomLimits) {
|
7387
|
+
if ((map.getZoom() === map.getMinZoom() && this._scale < 1) ||
|
7388
|
+
(map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; }
|
7389
|
+
}
|
7390
|
+
|
7152
7391
|
if (!this._moved) {
|
7153
7392
|
L.DomUtil.addClass(map._mapPane, 'leaflet-touching');
|
7154
7393
|
|
@@ -7252,7 +7491,7 @@ L.Map.Tap = L.Handler.extend({
|
|
7252
7491
|
this._startPos = this._newPos = new L.Point(first.clientX, first.clientY);
|
7253
7492
|
|
7254
7493
|
// if touching a link, highlight it
|
7255
|
-
if (el.tagName.toLowerCase() === 'a') {
|
7494
|
+
if (el.tagName && el.tagName.toLowerCase() === 'a') {
|
7256
7495
|
L.DomUtil.addClass(el, 'leaflet-active');
|
7257
7496
|
}
|
7258
7497
|
|
@@ -7282,7 +7521,7 @@ L.Map.Tap = L.Handler.extend({
|
|
7282
7521
|
var first = e.changedTouches[0],
|
7283
7522
|
el = first.target;
|
7284
7523
|
|
7285
|
-
if (el.tagName.toLowerCase() === 'a') {
|
7524
|
+
if (el && el.tagName && el.tagName.toLowerCase() === 'a') {
|
7286
7525
|
L.DomUtil.removeClass(el, 'leaflet-active');
|
7287
7526
|
}
|
7288
7527
|
|
@@ -7318,7 +7557,7 @@ L.Map.Tap = L.Handler.extend({
|
|
7318
7557
|
}
|
7319
7558
|
});
|
7320
7559
|
|
7321
|
-
if (L.Browser.touch && !L.Browser.
|
7560
|
+
if (L.Browser.touch && !L.Browser.pointer) {
|
7322
7561
|
L.Map.addInitHook('addHandler', 'tap', L.Map.Tap);
|
7323
7562
|
}
|
7324
7563
|
|
@@ -7337,6 +7576,7 @@ L.Map.BoxZoom = L.Handler.extend({
|
|
7337
7576
|
this._map = map;
|
7338
7577
|
this._container = map._container;
|
7339
7578
|
this._pane = map._panes.overlayPane;
|
7579
|
+
this._moved = false;
|
7340
7580
|
},
|
7341
7581
|
|
7342
7582
|
addHooks: function () {
|
@@ -7345,9 +7585,16 @@ L.Map.BoxZoom = L.Handler.extend({
|
|
7345
7585
|
|
7346
7586
|
removeHooks: function () {
|
7347
7587
|
L.DomEvent.off(this._container, 'mousedown', this._onMouseDown);
|
7588
|
+
this._moved = false;
|
7589
|
+
},
|
7590
|
+
|
7591
|
+
moved: function () {
|
7592
|
+
return this._moved;
|
7348
7593
|
},
|
7349
7594
|
|
7350
7595
|
_onMouseDown: function (e) {
|
7596
|
+
this._moved = false;
|
7597
|
+
|
7351
7598
|
if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }
|
7352
7599
|
|
7353
7600
|
L.DomUtil.disableTextSelection();
|
@@ -7355,21 +7602,22 @@ L.Map.BoxZoom = L.Handler.extend({
|
|
7355
7602
|
|
7356
7603
|
this._startLayerPoint = this._map.mouseEventToLayerPoint(e);
|
7357
7604
|
|
7358
|
-
this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);
|
7359
|
-
L.DomUtil.setPosition(this._box, this._startLayerPoint);
|
7360
|
-
|
7361
|
-
//TODO refactor: move cursor to styles
|
7362
|
-
this._container.style.cursor = 'crosshair';
|
7363
|
-
|
7364
7605
|
L.DomEvent
|
7365
7606
|
.on(document, 'mousemove', this._onMouseMove, this)
|
7366
7607
|
.on(document, 'mouseup', this._onMouseUp, this)
|
7367
7608
|
.on(document, 'keydown', this._onKeyDown, this);
|
7368
|
-
|
7369
|
-
this._map.fire('boxzoomstart');
|
7370
7609
|
},
|
7371
7610
|
|
7372
7611
|
_onMouseMove: function (e) {
|
7612
|
+
if (!this._moved) {
|
7613
|
+
this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);
|
7614
|
+
L.DomUtil.setPosition(this._box, this._startLayerPoint);
|
7615
|
+
|
7616
|
+
//TODO refactor: move cursor to styles
|
7617
|
+
this._container.style.cursor = 'crosshair';
|
7618
|
+
this._map.fire('boxzoomstart');
|
7619
|
+
}
|
7620
|
+
|
7373
7621
|
var startPoint = this._startLayerPoint,
|
7374
7622
|
box = this._box,
|
7375
7623
|
|
@@ -7382,14 +7630,18 @@ L.Map.BoxZoom = L.Handler.extend({
|
|
7382
7630
|
|
7383
7631
|
L.DomUtil.setPosition(box, newPos);
|
7384
7632
|
|
7633
|
+
this._moved = true;
|
7634
|
+
|
7385
7635
|
// TODO refactor: remove hardcoded 4 pixels
|
7386
7636
|
box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';
|
7387
7637
|
box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';
|
7388
7638
|
},
|
7389
7639
|
|
7390
7640
|
_finish: function () {
|
7391
|
-
|
7392
|
-
|
7641
|
+
if (this._moved) {
|
7642
|
+
this._pane.removeChild(this._box);
|
7643
|
+
this._container.style.cursor = '';
|
7644
|
+
}
|
7393
7645
|
|
7394
7646
|
L.DomUtil.enableTextSelection();
|
7395
7647
|
L.DomUtil.enableImageDrag();
|
@@ -7447,7 +7699,7 @@ L.Map.Keyboard = L.Handler.extend({
|
|
7447
7699
|
right: [39],
|
7448
7700
|
down: [40],
|
7449
7701
|
up: [38],
|
7450
|
-
zoomIn: [187, 107, 61],
|
7702
|
+
zoomIn: [187, 107, 61, 171],
|
7451
7703
|
zoomOut: [189, 109, 173]
|
7452
7704
|
},
|
7453
7705
|
|
@@ -7602,6 +7854,7 @@ L.Handler.MarkerDrag = L.Handler.extend({
|
|
7602
7854
|
.on('drag', this._onDrag, this)
|
7603
7855
|
.on('dragend', this._onDragEnd, this);
|
7604
7856
|
this._draggable.enable();
|
7857
|
+
L.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable');
|
7605
7858
|
},
|
7606
7859
|
|
7607
7860
|
removeHooks: function () {
|
@@ -7611,6 +7864,7 @@ L.Handler.MarkerDrag = L.Handler.extend({
|
|
7611
7864
|
.off('dragend', this._onDragEnd, this);
|
7612
7865
|
|
7613
7866
|
this._draggable.disable();
|
7867
|
+
L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');
|
7614
7868
|
},
|
7615
7869
|
|
7616
7870
|
moved: function () {
|
@@ -7642,10 +7896,10 @@ L.Handler.MarkerDrag = L.Handler.extend({
|
|
7642
7896
|
.fire('drag');
|
7643
7897
|
},
|
7644
7898
|
|
7645
|
-
_onDragEnd: function () {
|
7899
|
+
_onDragEnd: function (e) {
|
7646
7900
|
this._marker
|
7647
7901
|
.fire('moveend')
|
7648
|
-
.fire('dragend');
|
7902
|
+
.fire('dragend', e);
|
7649
7903
|
}
|
7650
7904
|
});
|
7651
7905
|
|
@@ -7718,6 +7972,12 @@ L.Control = L.Class.extend({
|
|
7718
7972
|
}
|
7719
7973
|
|
7720
7974
|
return this;
|
7975
|
+
},
|
7976
|
+
|
7977
|
+
_refocusOnMap: function () {
|
7978
|
+
if (this._map) {
|
7979
|
+
this._map.getContainer().focus();
|
7980
|
+
}
|
7721
7981
|
}
|
7722
7982
|
});
|
7723
7983
|
|
@@ -7769,7 +8029,11 @@ L.Map.include({
|
|
7769
8029
|
|
7770
8030
|
L.Control.Zoom = L.Control.extend({
|
7771
8031
|
options: {
|
7772
|
-
position: 'topleft'
|
8032
|
+
position: 'topleft',
|
8033
|
+
zoomInText: '+',
|
8034
|
+
zoomInTitle: 'Zoom in',
|
8035
|
+
zoomOutText: '-',
|
8036
|
+
zoomOutTitle: 'Zoom out'
|
7773
8037
|
},
|
7774
8038
|
|
7775
8039
|
onAdd: function (map) {
|
@@ -7779,10 +8043,13 @@ L.Control.Zoom = L.Control.extend({
|
|
7779
8043
|
this._map = map;
|
7780
8044
|
|
7781
8045
|
this._zoomInButton = this._createButton(
|
7782
|
-
|
8046
|
+
this.options.zoomInText, this.options.zoomInTitle,
|
8047
|
+
zoomName + '-in', container, this._zoomIn, this);
|
7783
8048
|
this._zoomOutButton = this._createButton(
|
7784
|
-
|
8049
|
+
this.options.zoomOutText, this.options.zoomOutTitle,
|
8050
|
+
zoomName + '-out', container, this._zoomOut, this);
|
7785
8051
|
|
8052
|
+
this._updateDisabled();
|
7786
8053
|
map.on('zoomend zoomlevelschange', this._updateDisabled, this);
|
7787
8054
|
|
7788
8055
|
return container;
|
@@ -7813,7 +8080,8 @@ L.Control.Zoom = L.Control.extend({
|
|
7813
8080
|
.on(link, 'mousedown', stop)
|
7814
8081
|
.on(link, 'dblclick', stop)
|
7815
8082
|
.on(link, 'click', L.DomEvent.preventDefault)
|
7816
|
-
.on(link, 'click', fn, context)
|
8083
|
+
.on(link, 'click', fn, context)
|
8084
|
+
.on(link, 'click', this._refocusOnMap, context);
|
7817
8085
|
|
7818
8086
|
return link;
|
7819
8087
|
},
|
@@ -7871,6 +8139,12 @@ L.Control.Attribution = L.Control.extend({
|
|
7871
8139
|
this._container = L.DomUtil.create('div', 'leaflet-control-attribution');
|
7872
8140
|
L.DomEvent.disableClickPropagation(this._container);
|
7873
8141
|
|
8142
|
+
for (var i in map._layers) {
|
8143
|
+
if (map._layers[i].getAttribution) {
|
8144
|
+
this.addAttribution(map._layers[i].getAttribution());
|
8145
|
+
}
|
8146
|
+
}
|
8147
|
+
|
7874
8148
|
map
|
7875
8149
|
.on('layeradd', this._onLayerAdd, this)
|
7876
8150
|
.on('layerremove', this._onLayerRemove, this);
|
@@ -8153,8 +8427,9 @@ L.Control.Layers = L.Control.extend({
|
|
8153
8427
|
container.setAttribute('aria-haspopup', true);
|
8154
8428
|
|
8155
8429
|
if (!L.Browser.touch) {
|
8156
|
-
L.DomEvent
|
8157
|
-
|
8430
|
+
L.DomEvent
|
8431
|
+
.disableClickPropagation(container)
|
8432
|
+
.disableScrollPropagation(container);
|
8158
8433
|
} else {
|
8159
8434
|
L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation);
|
8160
8435
|
}
|
@@ -8179,6 +8454,10 @@ L.Control.Layers = L.Control.extend({
|
|
8179
8454
|
else {
|
8180
8455
|
L.DomEvent.on(link, 'focus', this._expand, this);
|
8181
8456
|
}
|
8457
|
+
//Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033
|
8458
|
+
L.DomEvent.on(form, 'click', function () {
|
8459
|
+
setTimeout(L.bind(this._onInputClick, this), 0);
|
8460
|
+
}, this);
|
8182
8461
|
|
8183
8462
|
this._map.on('click', this._collapse, this);
|
8184
8463
|
// TODO keyboard accessibility
|
@@ -8313,6 +8592,8 @@ L.Control.Layers = L.Control.extend({
|
|
8313
8592
|
}
|
8314
8593
|
|
8315
8594
|
this._handlingClick = false;
|
8595
|
+
|
8596
|
+
this._refocusOnMap();
|
8316
8597
|
},
|
8317
8598
|
|
8318
8599
|
_expand: function () {
|
@@ -8433,8 +8714,8 @@ L.Map.include({
|
|
8433
8714
|
|
8434
8715
|
setView: function (center, zoom, options) {
|
8435
8716
|
|
8436
|
-
zoom = this._limitZoom(zoom);
|
8437
|
-
center = L.latLng(center);
|
8717
|
+
zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);
|
8718
|
+
center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);
|
8438
8719
|
options = options || {};
|
8439
8720
|
|
8440
8721
|
if (this._panAnim) {
|
@@ -8890,7 +9171,8 @@ L.Map.include({
|
|
8890
9171
|
|
8891
9172
|
var data = {
|
8892
9173
|
latlng: latlng,
|
8893
|
-
bounds: bounds
|
9174
|
+
bounds: bounds,
|
9175
|
+
timestamp: pos.timestamp
|
8894
9176
|
};
|
8895
9177
|
|
8896
9178
|
for (var i in pos.coords) {
|