decidim 0.26.9 → 0.26.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/decidim/version.rb +1 -1
- data/package-lock.json +7 -7
- data/packages/browserslist-config/package.json +1 -1
- data/packages/core/node_modules/leaflet/CHANGELOG.md +2191 -0
- data/packages/core/node_modules/leaflet/LICENSE +26 -0
- data/packages/core/node_modules/leaflet/README.md +55 -0
- data/packages/core/node_modules/leaflet/dist/images/layers-2x.png +0 -0
- data/packages/core/node_modules/leaflet/dist/images/layers.png +0 -0
- data/packages/core/node_modules/leaflet/dist/images/marker-icon-2x.png +0 -0
- data/packages/core/node_modules/leaflet/dist/images/marker-icon.png +0 -0
- data/packages/core/node_modules/leaflet/dist/images/marker-shadow.png +0 -0
- data/packages/core/node_modules/leaflet/dist/leaflet-src.esm.js +14419 -0
- data/packages/core/node_modules/leaflet/dist/leaflet-src.esm.js.map +1 -0
- data/packages/core/node_modules/leaflet/dist/leaflet-src.js +14512 -0
- data/packages/core/node_modules/leaflet/dist/leaflet-src.js.map +1 -0
- data/packages/core/node_modules/leaflet/dist/leaflet.css +661 -0
- data/packages/core/node_modules/leaflet/dist/leaflet.js +6 -0
- data/packages/core/node_modules/leaflet/dist/leaflet.js.map +1 -0
- data/packages/core/node_modules/leaflet/package.json +149 -0
- data/packages/core/node_modules/leaflet/src/Leaflet.js +24 -0
- data/packages/core/node_modules/leaflet/src/control/Control.Attribution.js +148 -0
- data/packages/core/node_modules/leaflet/src/control/Control.Layers.js +443 -0
- data/packages/core/node_modules/leaflet/src/control/Control.Scale.js +132 -0
- data/packages/core/node_modules/leaflet/src/control/Control.Zoom.js +146 -0
- data/packages/core/node_modules/leaflet/src/control/Control.js +174 -0
- data/packages/core/node_modules/leaflet/src/control/index.js +17 -0
- data/packages/core/node_modules/leaflet/src/core/Browser.js +220 -0
- data/packages/core/node_modules/leaflet/src/core/Class.js +135 -0
- data/packages/core/node_modules/leaflet/src/core/Class.leafdoc +197 -0
- data/packages/core/node_modules/leaflet/src/core/Events.js +344 -0
- data/packages/core/node_modules/leaflet/src/core/Events.leafdoc +143 -0
- data/packages/core/node_modules/leaflet/src/core/Handler.js +57 -0
- data/packages/core/node_modules/leaflet/src/core/Util.js +241 -0
- data/packages/core/node_modules/leaflet/src/core/index.js +15 -0
- data/packages/core/node_modules/leaflet/src/dom/DomEvent.DoubleTap.js +91 -0
- data/packages/core/node_modules/leaflet/src/dom/DomEvent.Pointer.js +97 -0
- data/packages/core/node_modules/leaflet/src/dom/DomEvent.js +315 -0
- data/packages/core/node_modules/leaflet/src/dom/DomUtil.js +349 -0
- data/packages/core/node_modules/leaflet/src/dom/Draggable.js +220 -0
- data/packages/core/node_modules/leaflet/src/dom/PosAnimation.js +113 -0
- data/packages/core/node_modules/leaflet/src/dom/index.js +9 -0
- data/packages/core/node_modules/leaflet/src/geo/LatLng.js +137 -0
- data/packages/core/node_modules/leaflet/src/geo/LatLngBounds.js +251 -0
- data/packages/core/node_modules/leaflet/src/geo/crs/CRS.EPSG3395.js +20 -0
- data/packages/core/node_modules/leaflet/src/geo/crs/CRS.EPSG3857.js +27 -0
- data/packages/core/node_modules/leaflet/src/geo/crs/CRS.EPSG4326.js +23 -0
- data/packages/core/node_modules/leaflet/src/geo/crs/CRS.Earth.js +33 -0
- data/packages/core/node_modules/leaflet/src/geo/crs/CRS.Simple.js +36 -0
- data/packages/core/node_modules/leaflet/src/geo/crs/CRS.js +139 -0
- data/packages/core/node_modules/leaflet/src/geo/crs/index.js +15 -0
- data/packages/core/node_modules/leaflet/src/geo/index.js +7 -0
- data/packages/core/node_modules/leaflet/src/geo/projection/Projection.LonLat.js +28 -0
- data/packages/core/node_modules/leaflet/src/geo/projection/Projection.Mercator.js +49 -0
- data/packages/core/node_modules/leaflet/src/geo/projection/Projection.SphericalMercator.js +44 -0
- data/packages/core/node_modules/leaflet/src/geo/projection/index.js +26 -0
- data/packages/core/node_modules/leaflet/src/geometry/Bounds.js +219 -0
- data/packages/core/node_modules/leaflet/src/geometry/LineUtil.js +306 -0
- data/packages/core/node_modules/leaflet/src/geometry/Point.js +222 -0
- data/packages/core/node_modules/leaflet/src/geometry/PolyUtil.js +129 -0
- data/packages/core/node_modules/leaflet/src/geometry/Transformation.js +79 -0
- data/packages/core/node_modules/leaflet/src/geometry/index.js +8 -0
- data/packages/core/node_modules/leaflet/src/images/layers.svg +1 -0
- data/packages/core/node_modules/leaflet/src/images/logo.svg +1 -0
- data/packages/core/node_modules/leaflet/src/images/marker.svg +1 -0
- data/packages/core/node_modules/leaflet/src/layer/DivOverlay.js +348 -0
- data/packages/core/node_modules/leaflet/src/layer/FeatureGroup.js +94 -0
- data/packages/core/node_modules/leaflet/src/layer/GeoJSON.js +452 -0
- data/packages/core/node_modules/leaflet/src/layer/ImageOverlay.js +270 -0
- data/packages/core/node_modules/leaflet/src/layer/Layer.Interactive.leafdoc +39 -0
- data/packages/core/node_modules/leaflet/src/layer/Layer.js +275 -0
- data/packages/core/node_modules/leaflet/src/layer/LayerGroup.js +159 -0
- data/packages/core/node_modules/leaflet/src/layer/Popup.js +506 -0
- data/packages/core/node_modules/leaflet/src/layer/SVGOverlay.js +50 -0
- data/packages/core/node_modules/leaflet/src/layer/Tooltip.js +444 -0
- data/packages/core/node_modules/leaflet/src/layer/VideoOverlay.js +106 -0
- data/packages/core/node_modules/leaflet/src/layer/index.js +24 -0
- data/packages/core/node_modules/leaflet/src/layer/marker/DivIcon.js +74 -0
- data/packages/core/node_modules/leaflet/src/layer/marker/Icon.Default.js +66 -0
- data/packages/core/node_modules/leaflet/src/layer/marker/Icon.js +165 -0
- data/packages/core/node_modules/leaflet/src/layer/marker/Marker.Drag.js +161 -0
- data/packages/core/node_modules/leaflet/src/layer/marker/Marker.js +419 -0
- data/packages/core/node_modules/leaflet/src/layer/marker/index.js +8 -0
- data/packages/core/node_modules/leaflet/src/layer/tile/GridLayer.js +923 -0
- data/packages/core/node_modules/leaflet/src/layer/tile/TileLayer.WMS.js +137 -0
- data/packages/core/node_modules/leaflet/src/layer/tile/TileLayer.js +289 -0
- data/packages/core/node_modules/leaflet/src/layer/tile/index.js +6 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/Canvas.js +492 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/Circle.js +113 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/CircleMarker.js +109 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/Path.js +148 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/Polygon.js +159 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/Polyline.js +307 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/Rectangle.js +57 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/Renderer.getRenderer.js +45 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/Renderer.js +133 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/SVG.Util.js +39 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/SVG.VML.js +144 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/SVG.js +207 -0
- data/packages/core/node_modules/leaflet/src/layer/vector/index.js +14 -0
- data/packages/core/node_modules/leaflet/src/map/Map.js +1751 -0
- data/packages/core/node_modules/leaflet/src/map/Map.methodOptions.leafdoc +112 -0
- data/packages/core/node_modules/leaflet/src/map/handler/Map.BoxZoom.js +152 -0
- data/packages/core/node_modules/leaflet/src/map/handler/Map.DoubleClickZoom.js +55 -0
- data/packages/core/node_modules/leaflet/src/map/handler/Map.Drag.js +235 -0
- data/packages/core/node_modules/leaflet/src/map/handler/Map.Keyboard.js +183 -0
- data/packages/core/node_modules/leaflet/src/map/handler/Map.ScrollWheelZoom.js +91 -0
- data/packages/core/node_modules/leaflet/src/map/handler/Map.TapHold.js +102 -0
- data/packages/core/node_modules/leaflet/src/map/handler/Map.TouchZoom.js +130 -0
- data/packages/core/node_modules/leaflet/src/map/index.js +17 -0
- data/packages/core/package.json +1 -1
- data/packages/dev/package.json +1 -1
- data/packages/elections/package.json +1 -1
- data/packages/eslint-config/package.json +1 -1
- data/packages/stylelint-config/package.json +1 -1
- data/packages/webpacker/package.json +1 -1
- metadata +148 -42
@@ -0,0 +1,251 @@
|
|
1
|
+
import {LatLng, toLatLng} from './LatLng';
|
2
|
+
|
3
|
+
/*
|
4
|
+
* @class LatLngBounds
|
5
|
+
* @aka L.LatLngBounds
|
6
|
+
*
|
7
|
+
* Represents a rectangular geographical area on a map.
|
8
|
+
*
|
9
|
+
* @example
|
10
|
+
*
|
11
|
+
* ```js
|
12
|
+
* var corner1 = L.latLng(40.712, -74.227),
|
13
|
+
* corner2 = L.latLng(40.774, -74.125),
|
14
|
+
* bounds = L.latLngBounds(corner1, corner2);
|
15
|
+
* ```
|
16
|
+
*
|
17
|
+
* All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:
|
18
|
+
*
|
19
|
+
* ```js
|
20
|
+
* map.fitBounds([
|
21
|
+
* [40.712, -74.227],
|
22
|
+
* [40.774, -74.125]
|
23
|
+
* ]);
|
24
|
+
* ```
|
25
|
+
*
|
26
|
+
* Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range.
|
27
|
+
*
|
28
|
+
* Note that `LatLngBounds` does not inherit from Leaflet's `Class` object,
|
29
|
+
* which means new classes can't inherit from it, and new methods
|
30
|
+
* can't be added to it with the `include` function.
|
31
|
+
*/
|
32
|
+
|
33
|
+
export function LatLngBounds(corner1, corner2) { // (LatLng, LatLng) or (LatLng[])
|
34
|
+
if (!corner1) { return; }
|
35
|
+
|
36
|
+
var latlngs = corner2 ? [corner1, corner2] : corner1;
|
37
|
+
|
38
|
+
for (var i = 0, len = latlngs.length; i < len; i++) {
|
39
|
+
this.extend(latlngs[i]);
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
LatLngBounds.prototype = {
|
44
|
+
|
45
|
+
// @method extend(latlng: LatLng): this
|
46
|
+
// Extend the bounds to contain the given point
|
47
|
+
|
48
|
+
// @alternative
|
49
|
+
// @method extend(otherBounds: LatLngBounds): this
|
50
|
+
// Extend the bounds to contain the given bounds
|
51
|
+
extend: function (obj) {
|
52
|
+
var sw = this._southWest,
|
53
|
+
ne = this._northEast,
|
54
|
+
sw2, ne2;
|
55
|
+
|
56
|
+
if (obj instanceof LatLng) {
|
57
|
+
sw2 = obj;
|
58
|
+
ne2 = obj;
|
59
|
+
|
60
|
+
} else if (obj instanceof LatLngBounds) {
|
61
|
+
sw2 = obj._southWest;
|
62
|
+
ne2 = obj._northEast;
|
63
|
+
|
64
|
+
if (!sw2 || !ne2) { return this; }
|
65
|
+
|
66
|
+
} else {
|
67
|
+
return obj ? this.extend(toLatLng(obj) || toLatLngBounds(obj)) : this;
|
68
|
+
}
|
69
|
+
|
70
|
+
if (!sw && !ne) {
|
71
|
+
this._southWest = new LatLng(sw2.lat, sw2.lng);
|
72
|
+
this._northEast = new LatLng(ne2.lat, ne2.lng);
|
73
|
+
} else {
|
74
|
+
sw.lat = Math.min(sw2.lat, sw.lat);
|
75
|
+
sw.lng = Math.min(sw2.lng, sw.lng);
|
76
|
+
ne.lat = Math.max(ne2.lat, ne.lat);
|
77
|
+
ne.lng = Math.max(ne2.lng, ne.lng);
|
78
|
+
}
|
79
|
+
|
80
|
+
return this;
|
81
|
+
},
|
82
|
+
|
83
|
+
// @method pad(bufferRatio: Number): LatLngBounds
|
84
|
+
// Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.
|
85
|
+
// For example, a ratio of 0.5 extends the bounds by 50% in each direction.
|
86
|
+
// Negative values will retract the bounds.
|
87
|
+
pad: function (bufferRatio) {
|
88
|
+
var sw = this._southWest,
|
89
|
+
ne = this._northEast,
|
90
|
+
heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,
|
91
|
+
widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;
|
92
|
+
|
93
|
+
return new LatLngBounds(
|
94
|
+
new LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),
|
95
|
+
new LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));
|
96
|
+
},
|
97
|
+
|
98
|
+
// @method getCenter(): LatLng
|
99
|
+
// Returns the center point of the bounds.
|
100
|
+
getCenter: function () {
|
101
|
+
return new LatLng(
|
102
|
+
(this._southWest.lat + this._northEast.lat) / 2,
|
103
|
+
(this._southWest.lng + this._northEast.lng) / 2);
|
104
|
+
},
|
105
|
+
|
106
|
+
// @method getSouthWest(): LatLng
|
107
|
+
// Returns the south-west point of the bounds.
|
108
|
+
getSouthWest: function () {
|
109
|
+
return this._southWest;
|
110
|
+
},
|
111
|
+
|
112
|
+
// @method getNorthEast(): LatLng
|
113
|
+
// Returns the north-east point of the bounds.
|
114
|
+
getNorthEast: function () {
|
115
|
+
return this._northEast;
|
116
|
+
},
|
117
|
+
|
118
|
+
// @method getNorthWest(): LatLng
|
119
|
+
// Returns the north-west point of the bounds.
|
120
|
+
getNorthWest: function () {
|
121
|
+
return new LatLng(this.getNorth(), this.getWest());
|
122
|
+
},
|
123
|
+
|
124
|
+
// @method getSouthEast(): LatLng
|
125
|
+
// Returns the south-east point of the bounds.
|
126
|
+
getSouthEast: function () {
|
127
|
+
return new LatLng(this.getSouth(), this.getEast());
|
128
|
+
},
|
129
|
+
|
130
|
+
// @method getWest(): Number
|
131
|
+
// Returns the west longitude of the bounds
|
132
|
+
getWest: function () {
|
133
|
+
return this._southWest.lng;
|
134
|
+
},
|
135
|
+
|
136
|
+
// @method getSouth(): Number
|
137
|
+
// Returns the south latitude of the bounds
|
138
|
+
getSouth: function () {
|
139
|
+
return this._southWest.lat;
|
140
|
+
},
|
141
|
+
|
142
|
+
// @method getEast(): Number
|
143
|
+
// Returns the east longitude of the bounds
|
144
|
+
getEast: function () {
|
145
|
+
return this._northEast.lng;
|
146
|
+
},
|
147
|
+
|
148
|
+
// @method getNorth(): Number
|
149
|
+
// Returns the north latitude of the bounds
|
150
|
+
getNorth: function () {
|
151
|
+
return this._northEast.lat;
|
152
|
+
},
|
153
|
+
|
154
|
+
// @method contains(otherBounds: LatLngBounds): Boolean
|
155
|
+
// Returns `true` if the rectangle contains the given one.
|
156
|
+
|
157
|
+
// @alternative
|
158
|
+
// @method contains (latlng: LatLng): Boolean
|
159
|
+
// Returns `true` if the rectangle contains the given point.
|
160
|
+
contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
|
161
|
+
if (typeof obj[0] === 'number' || obj instanceof LatLng || 'lat' in obj) {
|
162
|
+
obj = toLatLng(obj);
|
163
|
+
} else {
|
164
|
+
obj = toLatLngBounds(obj);
|
165
|
+
}
|
166
|
+
|
167
|
+
var sw = this._southWest,
|
168
|
+
ne = this._northEast,
|
169
|
+
sw2, ne2;
|
170
|
+
|
171
|
+
if (obj instanceof LatLngBounds) {
|
172
|
+
sw2 = obj.getSouthWest();
|
173
|
+
ne2 = obj.getNorthEast();
|
174
|
+
} else {
|
175
|
+
sw2 = ne2 = obj;
|
176
|
+
}
|
177
|
+
|
178
|
+
return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&
|
179
|
+
(sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);
|
180
|
+
},
|
181
|
+
|
182
|
+
// @method intersects(otherBounds: LatLngBounds): Boolean
|
183
|
+
// Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.
|
184
|
+
intersects: function (bounds) {
|
185
|
+
bounds = toLatLngBounds(bounds);
|
186
|
+
|
187
|
+
var sw = this._southWest,
|
188
|
+
ne = this._northEast,
|
189
|
+
sw2 = bounds.getSouthWest(),
|
190
|
+
ne2 = bounds.getNorthEast(),
|
191
|
+
|
192
|
+
latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),
|
193
|
+
lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);
|
194
|
+
|
195
|
+
return latIntersects && lngIntersects;
|
196
|
+
},
|
197
|
+
|
198
|
+
// @method overlaps(otherBounds: LatLngBounds): Boolean
|
199
|
+
// Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.
|
200
|
+
overlaps: function (bounds) {
|
201
|
+
bounds = toLatLngBounds(bounds);
|
202
|
+
|
203
|
+
var sw = this._southWest,
|
204
|
+
ne = this._northEast,
|
205
|
+
sw2 = bounds.getSouthWest(),
|
206
|
+
ne2 = bounds.getNorthEast(),
|
207
|
+
|
208
|
+
latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat),
|
209
|
+
lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng);
|
210
|
+
|
211
|
+
return latOverlaps && lngOverlaps;
|
212
|
+
},
|
213
|
+
|
214
|
+
// @method toBBoxString(): String
|
215
|
+
// Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.
|
216
|
+
toBBoxString: function () {
|
217
|
+
return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');
|
218
|
+
},
|
219
|
+
|
220
|
+
// @method equals(otherBounds: LatLngBounds, maxMargin?: Number): Boolean
|
221
|
+
// Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting `maxMargin` to a small number.
|
222
|
+
equals: function (bounds, maxMargin) {
|
223
|
+
if (!bounds) { return false; }
|
224
|
+
|
225
|
+
bounds = toLatLngBounds(bounds);
|
226
|
+
|
227
|
+
return this._southWest.equals(bounds.getSouthWest(), maxMargin) &&
|
228
|
+
this._northEast.equals(bounds.getNorthEast(), maxMargin);
|
229
|
+
},
|
230
|
+
|
231
|
+
// @method isValid(): Boolean
|
232
|
+
// Returns `true` if the bounds are properly initialized.
|
233
|
+
isValid: function () {
|
234
|
+
return !!(this._southWest && this._northEast);
|
235
|
+
}
|
236
|
+
};
|
237
|
+
|
238
|
+
// TODO International date line?
|
239
|
+
|
240
|
+
// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng)
|
241
|
+
// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle.
|
242
|
+
|
243
|
+
// @alternative
|
244
|
+
// @factory L.latLngBounds(latlngs: LatLng[])
|
245
|
+
// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds).
|
246
|
+
export function toLatLngBounds(a, b) {
|
247
|
+
if (a instanceof LatLngBounds) {
|
248
|
+
return a;
|
249
|
+
}
|
250
|
+
return new LatLngBounds(a, b);
|
251
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import {Earth} from './CRS.Earth';
|
2
|
+
import {Mercator} from '../projection/Projection.Mercator';
|
3
|
+
import {toTransformation} from '../../geometry/Transformation';
|
4
|
+
import * as Util from '../../core/Util';
|
5
|
+
|
6
|
+
/*
|
7
|
+
* @namespace CRS
|
8
|
+
* @crs L.CRS.EPSG3395
|
9
|
+
*
|
10
|
+
* Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
|
11
|
+
*/
|
12
|
+
export var EPSG3395 = Util.extend({}, Earth, {
|
13
|
+
code: 'EPSG:3395',
|
14
|
+
projection: Mercator,
|
15
|
+
|
16
|
+
transformation: (function () {
|
17
|
+
var scale = 0.5 / (Math.PI * Mercator.R);
|
18
|
+
return toTransformation(scale, 0.5, -scale, 0.5);
|
19
|
+
}())
|
20
|
+
});
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import {Earth} from './CRS.Earth';
|
2
|
+
import {SphericalMercator} from '../projection/Projection.SphericalMercator';
|
3
|
+
import {toTransformation} from '../../geometry/Transformation';
|
4
|
+
import * as Util from '../../core/Util';
|
5
|
+
|
6
|
+
/*
|
7
|
+
* @namespace CRS
|
8
|
+
* @crs L.CRS.EPSG3857
|
9
|
+
*
|
10
|
+
* The most common CRS for online maps, used by almost all free and commercial
|
11
|
+
* tile providers. Uses Spherical Mercator projection. Set in by default in
|
12
|
+
* Map's `crs` option.
|
13
|
+
*/
|
14
|
+
|
15
|
+
export var EPSG3857 = Util.extend({}, Earth, {
|
16
|
+
code: 'EPSG:3857',
|
17
|
+
projection: SphericalMercator,
|
18
|
+
|
19
|
+
transformation: (function () {
|
20
|
+
var scale = 0.5 / (Math.PI * SphericalMercator.R);
|
21
|
+
return toTransformation(scale, 0.5, -scale, 0.5);
|
22
|
+
}())
|
23
|
+
});
|
24
|
+
|
25
|
+
export var EPSG900913 = Util.extend({}, EPSG3857, {
|
26
|
+
code: 'EPSG:900913'
|
27
|
+
});
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import {Earth} from './CRS.Earth';
|
2
|
+
import {LonLat} from '../projection/Projection.LonLat';
|
3
|
+
import {toTransformation} from '../../geometry/Transformation';
|
4
|
+
import * as Util from '../../core/Util';
|
5
|
+
|
6
|
+
/*
|
7
|
+
* @namespace CRS
|
8
|
+
* @crs L.CRS.EPSG4326
|
9
|
+
*
|
10
|
+
* A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.
|
11
|
+
*
|
12
|
+
* Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic),
|
13
|
+
* which is a breaking change from 0.7.x behaviour. If you are using a `TileLayer`
|
14
|
+
* with this CRS, ensure that there are two 256x256 pixel tiles covering the
|
15
|
+
* whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90),
|
16
|
+
* or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set.
|
17
|
+
*/
|
18
|
+
|
19
|
+
export var EPSG4326 = Util.extend({}, Earth, {
|
20
|
+
code: 'EPSG:4326',
|
21
|
+
projection: LonLat,
|
22
|
+
transformation: toTransformation(1 / 180, 1, -1 / 180, 0.5)
|
23
|
+
});
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import {CRS} from './CRS';
|
2
|
+
import * as Util from '../../core/Util';
|
3
|
+
|
4
|
+
/*
|
5
|
+
* @namespace CRS
|
6
|
+
* @crs L.CRS.Earth
|
7
|
+
*
|
8
|
+
* Serves as the base for CRS that are global such that they cover the earth.
|
9
|
+
* Can only be used as the base for other CRS and cannot be used directly,
|
10
|
+
* since it does not have a `code`, `projection` or `transformation`. `distance()` returns
|
11
|
+
* meters.
|
12
|
+
*/
|
13
|
+
|
14
|
+
export var Earth = Util.extend({}, CRS, {
|
15
|
+
wrapLng: [-180, 180],
|
16
|
+
|
17
|
+
// Mean Earth Radius, as recommended for use by
|
18
|
+
// the International Union of Geodesy and Geophysics,
|
19
|
+
// see https://rosettacode.org/wiki/Haversine_formula
|
20
|
+
R: 6371000,
|
21
|
+
|
22
|
+
// distance between two geographical points using spherical law of cosines approximation
|
23
|
+
distance: function (latlng1, latlng2) {
|
24
|
+
var rad = Math.PI / 180,
|
25
|
+
lat1 = latlng1.lat * rad,
|
26
|
+
lat2 = latlng2.lat * rad,
|
27
|
+
sinDLat = Math.sin((latlng2.lat - latlng1.lat) * rad / 2),
|
28
|
+
sinDLon = Math.sin((latlng2.lng - latlng1.lng) * rad / 2),
|
29
|
+
a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon,
|
30
|
+
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
31
|
+
return this.R * c;
|
32
|
+
}
|
33
|
+
});
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import {CRS} from './CRS';
|
2
|
+
import {LonLat} from '../projection/Projection.LonLat';
|
3
|
+
import {toTransformation} from '../../geometry/Transformation';
|
4
|
+
import * as Util from '../../core/Util';
|
5
|
+
|
6
|
+
/*
|
7
|
+
* @namespace CRS
|
8
|
+
* @crs L.CRS.Simple
|
9
|
+
*
|
10
|
+
* A simple CRS that maps longitude and latitude into `x` and `y` directly.
|
11
|
+
* May be used for maps of flat surfaces (e.g. game maps). Note that the `y`
|
12
|
+
* axis should still be inverted (going from bottom to top). `distance()` returns
|
13
|
+
* simple euclidean distance.
|
14
|
+
*/
|
15
|
+
|
16
|
+
export var Simple = Util.extend({}, CRS, {
|
17
|
+
projection: LonLat,
|
18
|
+
transformation: toTransformation(1, 0, -1, 0),
|
19
|
+
|
20
|
+
scale: function (zoom) {
|
21
|
+
return Math.pow(2, zoom);
|
22
|
+
},
|
23
|
+
|
24
|
+
zoom: function (scale) {
|
25
|
+
return Math.log(scale) / Math.LN2;
|
26
|
+
},
|
27
|
+
|
28
|
+
distance: function (latlng1, latlng2) {
|
29
|
+
var dx = latlng2.lng - latlng1.lng,
|
30
|
+
dy = latlng2.lat - latlng1.lat;
|
31
|
+
|
32
|
+
return Math.sqrt(dx * dx + dy * dy);
|
33
|
+
},
|
34
|
+
|
35
|
+
infinite: true
|
36
|
+
});
|
@@ -0,0 +1,139 @@
|
|
1
|
+
|
2
|
+
import {Bounds} from '../../geometry/Bounds';
|
3
|
+
import {LatLng} from '../LatLng';
|
4
|
+
import {LatLngBounds} from '../LatLngBounds';
|
5
|
+
import * as Util from '../../core/Util';
|
6
|
+
|
7
|
+
/*
|
8
|
+
* @namespace CRS
|
9
|
+
* @crs L.CRS.Base
|
10
|
+
* Object that defines coordinate reference systems for projecting
|
11
|
+
* geographical points into pixel (screen) coordinates and back (and to
|
12
|
+
* coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See
|
13
|
+
* [spatial reference system](https://en.wikipedia.org/wiki/Spatial_reference_system).
|
14
|
+
*
|
15
|
+
* Leaflet defines the most usual CRSs by default. If you want to use a
|
16
|
+
* CRS not defined by default, take a look at the
|
17
|
+
* [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.
|
18
|
+
*
|
19
|
+
* Note that the CRS instances do not inherit from Leaflet's `Class` object,
|
20
|
+
* and can't be instantiated. Also, new classes can't inherit from them,
|
21
|
+
* and methods can't be added to them with the `include` function.
|
22
|
+
*/
|
23
|
+
|
24
|
+
export var CRS = {
|
25
|
+
// @method latLngToPoint(latlng: LatLng, zoom: Number): Point
|
26
|
+
// Projects geographical coordinates into pixel coordinates for a given zoom.
|
27
|
+
latLngToPoint: function (latlng, zoom) {
|
28
|
+
var projectedPoint = this.projection.project(latlng),
|
29
|
+
scale = this.scale(zoom);
|
30
|
+
|
31
|
+
return this.transformation._transform(projectedPoint, scale);
|
32
|
+
},
|
33
|
+
|
34
|
+
// @method pointToLatLng(point: Point, zoom: Number): LatLng
|
35
|
+
// The inverse of `latLngToPoint`. Projects pixel coordinates on a given
|
36
|
+
// zoom into geographical coordinates.
|
37
|
+
pointToLatLng: function (point, zoom) {
|
38
|
+
var scale = this.scale(zoom),
|
39
|
+
untransformedPoint = this.transformation.untransform(point, scale);
|
40
|
+
|
41
|
+
return this.projection.unproject(untransformedPoint);
|
42
|
+
},
|
43
|
+
|
44
|
+
// @method project(latlng: LatLng): Point
|
45
|
+
// Projects geographical coordinates into coordinates in units accepted for
|
46
|
+
// this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).
|
47
|
+
project: function (latlng) {
|
48
|
+
return this.projection.project(latlng);
|
49
|
+
},
|
50
|
+
|
51
|
+
// @method unproject(point: Point): LatLng
|
52
|
+
// Given a projected coordinate returns the corresponding LatLng.
|
53
|
+
// The inverse of `project`.
|
54
|
+
unproject: function (point) {
|
55
|
+
return this.projection.unproject(point);
|
56
|
+
},
|
57
|
+
|
58
|
+
// @method scale(zoom: Number): Number
|
59
|
+
// Returns the scale used when transforming projected coordinates into
|
60
|
+
// pixel coordinates for a particular zoom. For example, it returns
|
61
|
+
// `256 * 2^zoom` for Mercator-based CRS.
|
62
|
+
scale: function (zoom) {
|
63
|
+
return 256 * Math.pow(2, zoom);
|
64
|
+
},
|
65
|
+
|
66
|
+
// @method zoom(scale: Number): Number
|
67
|
+
// Inverse of `scale()`, returns the zoom level corresponding to a scale
|
68
|
+
// factor of `scale`.
|
69
|
+
zoom: function (scale) {
|
70
|
+
return Math.log(scale / 256) / Math.LN2;
|
71
|
+
},
|
72
|
+
|
73
|
+
// @method getProjectedBounds(zoom: Number): Bounds
|
74
|
+
// Returns the projection's bounds scaled and transformed for the provided `zoom`.
|
75
|
+
getProjectedBounds: function (zoom) {
|
76
|
+
if (this.infinite) { return null; }
|
77
|
+
|
78
|
+
var b = this.projection.bounds,
|
79
|
+
s = this.scale(zoom),
|
80
|
+
min = this.transformation.transform(b.min, s),
|
81
|
+
max = this.transformation.transform(b.max, s);
|
82
|
+
|
83
|
+
return new Bounds(min, max);
|
84
|
+
},
|
85
|
+
|
86
|
+
// @method distance(latlng1: LatLng, latlng2: LatLng): Number
|
87
|
+
// Returns the distance between two geographical coordinates.
|
88
|
+
|
89
|
+
// @property code: String
|
90
|
+
// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)
|
91
|
+
//
|
92
|
+
// @property wrapLng: Number[]
|
93
|
+
// An array of two numbers defining whether the longitude (horizontal) coordinate
|
94
|
+
// axis wraps around a given range and how. Defaults to `[-180, 180]` in most
|
95
|
+
// geographical CRSs. If `undefined`, the longitude axis does not wrap around.
|
96
|
+
//
|
97
|
+
// @property wrapLat: Number[]
|
98
|
+
// Like `wrapLng`, but for the latitude (vertical) axis.
|
99
|
+
|
100
|
+
// wrapLng: [min, max],
|
101
|
+
// wrapLat: [min, max],
|
102
|
+
|
103
|
+
// @property infinite: Boolean
|
104
|
+
// If true, the coordinate space will be unbounded (infinite in both axes)
|
105
|
+
infinite: false,
|
106
|
+
|
107
|
+
// @method wrapLatLng(latlng: LatLng): LatLng
|
108
|
+
// Returns a `LatLng` where lat and lng has been wrapped according to the
|
109
|
+
// CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds.
|
110
|
+
wrapLatLng: function (latlng) {
|
111
|
+
var lng = this.wrapLng ? Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng,
|
112
|
+
lat = this.wrapLat ? Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat,
|
113
|
+
alt = latlng.alt;
|
114
|
+
|
115
|
+
return new LatLng(lat, lng, alt);
|
116
|
+
},
|
117
|
+
|
118
|
+
// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds
|
119
|
+
// Returns a `LatLngBounds` with the same size as the given one, ensuring
|
120
|
+
// that its center is within the CRS's bounds.
|
121
|
+
// Only accepts actual `L.LatLngBounds` instances, not arrays.
|
122
|
+
wrapLatLngBounds: function (bounds) {
|
123
|
+
var center = bounds.getCenter(),
|
124
|
+
newCenter = this.wrapLatLng(center),
|
125
|
+
latShift = center.lat - newCenter.lat,
|
126
|
+
lngShift = center.lng - newCenter.lng;
|
127
|
+
|
128
|
+
if (latShift === 0 && lngShift === 0) {
|
129
|
+
return bounds;
|
130
|
+
}
|
131
|
+
|
132
|
+
var sw = bounds.getSouthWest(),
|
133
|
+
ne = bounds.getNorthEast(),
|
134
|
+
newSw = new LatLng(sw.lat - latShift, sw.lng - lngShift),
|
135
|
+
newNe = new LatLng(ne.lat - latShift, ne.lng - lngShift);
|
136
|
+
|
137
|
+
return new LatLngBounds(newSw, newNe);
|
138
|
+
}
|
139
|
+
};
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import {CRS} from './CRS';
|
2
|
+
import {Earth} from './CRS.Earth';
|
3
|
+
import {EPSG3395} from './CRS.EPSG3395';
|
4
|
+
import {EPSG3857, EPSG900913} from './CRS.EPSG3857';
|
5
|
+
import {EPSG4326} from './CRS.EPSG4326';
|
6
|
+
import {Simple} from './CRS.Simple';
|
7
|
+
|
8
|
+
CRS.Earth = Earth;
|
9
|
+
CRS.EPSG3395 = EPSG3395;
|
10
|
+
CRS.EPSG3857 = EPSG3857;
|
11
|
+
CRS.EPSG900913 = EPSG900913;
|
12
|
+
CRS.EPSG4326 = EPSG4326;
|
13
|
+
CRS.Simple = Simple;
|
14
|
+
|
15
|
+
export {CRS};
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import {LatLng} from '../LatLng';
|
2
|
+
import {Bounds} from '../../geometry/Bounds';
|
3
|
+
import {Point} from '../../geometry/Point';
|
4
|
+
|
5
|
+
/*
|
6
|
+
* @namespace Projection
|
7
|
+
* @section
|
8
|
+
* Leaflet comes with a set of already defined Projections out of the box:
|
9
|
+
*
|
10
|
+
* @projection L.Projection.LonLat
|
11
|
+
*
|
12
|
+
* Equirectangular, or Plate Carree projection — the most simple projection,
|
13
|
+
* mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as
|
14
|
+
* latitude. Also suitable for flat worlds, e.g. game maps. Used by the
|
15
|
+
* `EPSG:4326` and `Simple` CRS.
|
16
|
+
*/
|
17
|
+
|
18
|
+
export var LonLat = {
|
19
|
+
project: function (latlng) {
|
20
|
+
return new Point(latlng.lng, latlng.lat);
|
21
|
+
},
|
22
|
+
|
23
|
+
unproject: function (point) {
|
24
|
+
return new LatLng(point.y, point.x);
|
25
|
+
},
|
26
|
+
|
27
|
+
bounds: new Bounds([-180, -90], [180, 90])
|
28
|
+
};
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import {LatLng} from '../LatLng';
|
2
|
+
import {Bounds} from '../../geometry/Bounds';
|
3
|
+
import {Point} from '../../geometry/Point';
|
4
|
+
|
5
|
+
/*
|
6
|
+
* @namespace Projection
|
7
|
+
* @projection L.Projection.Mercator
|
8
|
+
*
|
9
|
+
* Elliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS.
|
10
|
+
*/
|
11
|
+
|
12
|
+
export var Mercator = {
|
13
|
+
R: 6378137,
|
14
|
+
R_MINOR: 6356752.314245179,
|
15
|
+
|
16
|
+
bounds: new Bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]),
|
17
|
+
|
18
|
+
project: function (latlng) {
|
19
|
+
var d = Math.PI / 180,
|
20
|
+
r = this.R,
|
21
|
+
y = latlng.lat * d,
|
22
|
+
tmp = this.R_MINOR / r,
|
23
|
+
e = Math.sqrt(1 - tmp * tmp),
|
24
|
+
con = e * Math.sin(y);
|
25
|
+
|
26
|
+
var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);
|
27
|
+
y = -r * Math.log(Math.max(ts, 1E-10));
|
28
|
+
|
29
|
+
return new Point(latlng.lng * d * r, y);
|
30
|
+
},
|
31
|
+
|
32
|
+
unproject: function (point) {
|
33
|
+
var d = 180 / Math.PI,
|
34
|
+
r = this.R,
|
35
|
+
tmp = this.R_MINOR / r,
|
36
|
+
e = Math.sqrt(1 - tmp * tmp),
|
37
|
+
ts = Math.exp(-point.y / r),
|
38
|
+
phi = Math.PI / 2 - 2 * Math.atan(ts);
|
39
|
+
|
40
|
+
for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {
|
41
|
+
con = e * Math.sin(phi);
|
42
|
+
con = Math.pow((1 - con) / (1 + con), e / 2);
|
43
|
+
dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;
|
44
|
+
phi += dphi;
|
45
|
+
}
|
46
|
+
|
47
|
+
return new LatLng(phi * d, point.x * d / r);
|
48
|
+
}
|
49
|
+
};
|
@@ -0,0 +1,44 @@
|
|
1
|
+
import {LatLng} from '../LatLng';
|
2
|
+
import {Bounds} from '../../geometry/Bounds';
|
3
|
+
import {Point} from '../../geometry/Point';
|
4
|
+
|
5
|
+
/*
|
6
|
+
* @namespace Projection
|
7
|
+
* @projection L.Projection.SphericalMercator
|
8
|
+
*
|
9
|
+
* Spherical Mercator projection — the most common projection for online maps,
|
10
|
+
* used by almost all free and commercial tile providers. Assumes that Earth is
|
11
|
+
* a sphere. Used by the `EPSG:3857` CRS.
|
12
|
+
*/
|
13
|
+
|
14
|
+
var earthRadius = 6378137;
|
15
|
+
|
16
|
+
export var SphericalMercator = {
|
17
|
+
|
18
|
+
R: earthRadius,
|
19
|
+
MAX_LATITUDE: 85.0511287798,
|
20
|
+
|
21
|
+
project: function (latlng) {
|
22
|
+
var d = Math.PI / 180,
|
23
|
+
max = this.MAX_LATITUDE,
|
24
|
+
lat = Math.max(Math.min(max, latlng.lat), -max),
|
25
|
+
sin = Math.sin(lat * d);
|
26
|
+
|
27
|
+
return new Point(
|
28
|
+
this.R * latlng.lng * d,
|
29
|
+
this.R * Math.log((1 + sin) / (1 - sin)) / 2);
|
30
|
+
},
|
31
|
+
|
32
|
+
unproject: function (point) {
|
33
|
+
var d = 180 / Math.PI;
|
34
|
+
|
35
|
+
return new LatLng(
|
36
|
+
(2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,
|
37
|
+
point.x * d / this.R);
|
38
|
+
},
|
39
|
+
|
40
|
+
bounds: (function () {
|
41
|
+
var d = earthRadius * Math.PI;
|
42
|
+
return new Bounds([-d, -d], [d, d]);
|
43
|
+
})()
|
44
|
+
};
|