PageSourceSearch

https://covid-trials.org/Proj4Leaflet-1.0.1/proj4leaflet.js

js covid-trials.org collected 2026-09-26 00:00:37 UTC 7,738 bytes, 272 lines download raw bytes

1(function (factory) {
2	var L, proj4;
3	if (typeof define === 'function' && define.amd) {
4		// AMD
5		define(['leaflet', 'proj4'], factory);
6	} else if (typeof module === 'object' && typeof module.exports === "object") {
7		// Node/CommonJS
8		L = require('leaflet');
9		proj4 = require('proj4');
10		module.exports = factory(L, proj4);
11	} else {
12		// Browser globals
13		if (typeof window.L === 'undefined' || typeof window.proj4 === 'undefined')
14			throw 'Leaflet and proj4 must be loaded first';
15		factory(window.L, window.proj4);
16	}
17}(function (L, proj4) {
18	if (proj4.__esModule && proj4.default) {
19		// If proj4 was bundled as an ES6 module, unwrap it to get
20		// to the actual main proj4 object.
21		// See discussion in https://github.com/kartena/Proj4Leaflet/pull/147
22		proj4 = proj4.default;
23	}
24 
25	L.Proj = {};
26
27	L.Proj._isProj4Obj = function(a) {
28		return (typeof a.inverse !== 'undefined' &&
29			typeof a.forward !== 'undefined');
30	};
31
32	L.Proj.Projection = L.Class.extend({
33		initialize: function(code, def, bounds) {
34			var isP4 = L.Proj._isProj4Obj(code);
35			this._proj = isP4 ? code : this._projFromCodeDef(code, def);
36			this.bounds = isP4 ? def : bounds;
37		},
38
39		project: function (latlng) {
40			var point = this._proj.forward([latlng.lng, latlng.lat]);
41			return new L.Point(point[0], point[1]);
42		},
43
44		unproject: function (point, unbounded) {
45			var point2 = this._proj.inverse([point.x, point.y]);
46			return new L.LatLng(point2[1], point2[0], unbounded);
47		},
48
49		_projFromCodeDef: function(code, def) {
50			if (def) {
51				proj4.defs(code, def);
52			} else if (proj4.defs[code] === undefined) {
53				var urn = code.split(':');
54				if (urn.length > 3) {
55					code = urn[urn.length - 3] + ':' + urn[urn.length - 1];
56				}
57				if (proj4.defs[code] === undefined) {
58					throw 'No projection definition for code ' + code;
59				}
60			}
61
62			return proj4(code);
63		}
64	});
65
66	L.Proj.CRS = L.Class.extend({
67		includes: L.CRS,
68
69		options: {
70			transformation: new L.Transformation(1, 0, -1, 0)
71		},
72
73		initialize: function(a, b, c) {
74			var code,
75			    proj,
76			    def,
77			    options;
78
79			if (L.Proj._isProj4Obj(a)) {
80				proj = a;
81				code = proj.srsCode;
82				options = b || {};
83
84				this.projection = new L.Proj.Projection(proj, options.bounds);
85			} else {
86				code = a;
87				def = b;
88				options = c || {};
89				this.projection = new L.Proj.Projection(code, def, options.bounds);
90			}
91
92			L.Util.setOptions(this, options);
93			this.code = code;
94			this.transformation = this.options.transformation;
95
96			if (this.options.origin) {
97				this.transformation =
98					new L.Transformation(1, -this.options.origin[0],
99						-1, this.options.origin[1]);
100			}
101
102			if (this.options.scales) {
103				this._scales = this.options.scales;
104			} else if (this.options.resolutions) {
105				this._scales = [];
106				for (var i = this.options.resolutions.length - 1; i >= 0; i--) {
107					if (this.options.resolutions[i]) {
108						this._scales[i] = 1 / this.options.resolutions[i];
109					}
110				}
111			}
112
113			this.infinite = !this.options.bounds;
114
115		},
116
117		scale: function(zoom) {
118			var iZoom = Math.floor(zoom),
119				baseScale,
120				nextScale,
121				scaleDiff,
122				zDiff;
123			if (zoom === iZoom) {
124				return this._scales[zoom];
125			} else {
126				// Non-integer zoom, interpolate
127				baseScale = this._scales[iZoom];
128				nextScale = this._scales[iZoom + 1];
129				scaleDiff = nextScale - baseScale;
130				zDiff = (zoom - iZoom);
131				return baseScale + scaleDiff * zDiff;
132			}
133		},
134
135		zoom: function(scale) {
136			// Find closest number in this._scales, down
137			var downScale = this._closestElement(this._scales, scale),
138				downZoom = this._scales.indexOf(downScale),
139				nextScale,
140				nextZoom,
141				scaleDiff;
142			// Check if scale is downScale => return array index
143			if (scale === downScale) {
144				return downZoom;
145			}
146			if (downScale === undefined) {
147				return -Infinity;
148			}
149			// Interpolate
150			nextZoom = downZoom + 1;
151			nextScale = this._scales[nextZoom];
152			if (nextScale === undefined) {
153				return Infinity;
154			}
155			scaleDiff = nextScale - downScale;
156			return (scale - downScale) / scaleDiff + downZoom;
157		},
158
159		distance: L.CRS.Earth.distance,
160
161		R: L.CRS.Earth.R,
162
163		/* Get the closest lowest element in an array */
164		_closestElement: function(array, element) {
165			var low;
166			for (var i = array.length; i--;) {
167				if (array[i] <= element && (low === undefined || low < array[i])) {
168					low = array[i];
169				}
170			}
171			return low;
172		}
173	});
174
175	L.Proj.GeoJSON = L.GeoJSON.extend({
176		initialize: function(geojson, options) {
177			this._callLevel = 0;
178			L.GeoJSON.prototype.initialize.call(this, geojson, options);
179		},
180
181		addData: function(geojson) {
182			var crs;
183
184			if (geojson) {
185				if (geojson.crs && geojson.crs.type === 'name') {
186					crs = new L.Proj.CRS(geojson.crs.properties.name);
187				} else if (geojson.crs && geojson.crs.type) {
188					crs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code);
189				}
190
191				if (crs !== undefined) {
192					this.options.coordsToLatLng = function(coords) {
193						var point = L.point(coords[0], coords[1]);
194						return crs.projection.unproject(point);
195					};
196				}
197			}
198
199			// Base class' addData might call us recursively, but
200			// CRS shouldn't be cleared in that case, since CRS applies
201			// to the whole GeoJSON, inluding sub-features.
202			this._callLevel++;
203			try {
204				L.GeoJSON.prototype.addData.call(this, geojson);
205			} finally {
206				this._callLevel--;
207				if (this._callLevel === 0) {
208					delete this.options.coordsToLatLng;
209				}
210			}
211		}
212	});
213
214	L.Proj.geoJson = function(geojson, options) {
215		return new L.Proj.GeoJSON(geojson, options);
216	};
217
218	L.Proj.ImageOverlay = L.ImageOverlay.extend({
219		initialize: function (url, bounds, options) {
220			L.ImageOverlay.prototype.initialize.call(this, url, null, options);
221			this._projectedBounds = bounds;
222		},
223
224		// Danger ahead: Overriding internal methods in Leaflet.
225		// Decided to do this rather than making a copy of L.ImageOverlay
226		// and doing very tiny modifications to it.
227		// Future will tell if this was wise or not.
228		_animateZoom: function (event) {
229			var scale = this._map.getZoomScale(event.zoom);
230			var northWest = L.point(this._projectedBounds.min.x, this._projectedBounds.max.y);
231			var offset = this._projectedToNewLayerPoint(northWest, event.zoom, event.center);
232
233			L.DomUtil.setTransform(this._image, offset, scale);
234		},
235
236		_reset: function () {
237			var zoom = this._map.getZoom();
238			var pixelOrigin = this._map.getPixelOrigin();
239			var bounds = L.bounds(
240				this._transform(this._projectedBounds.min, zoom)._subtract(pixelOrigin),
241				this._transform(this._projectedBounds.max, zoom)._subtract(pixelOrigin)
242			);
243			var size = bounds.getSize();
244
245			L.DomUtil.setPosition(this._image, bounds.min);
246			this._image.style.width = size.x + 'px';
247			this._image.style.height = size.y + 'px';
248		},
249
250		_projectedToNewLayerPoint: function (point, zoom, center) {
251			var viewHalf = this._map.getSize()._divideBy(2);
252			var newTopLeft = this._map.project(center, zoom)._subtract(viewHalf)._round();
253			var topLeft = newTopLeft.add(this._map._getMapPanePos());
254
255			return this._transform(point, zoom)._subtract(topLeft);
256		},
257
258		_transform: function (point, zoom) {
259			var crs = this._map.options.crs;
260			var transformation = crs.transformation;
261			var scale = crs.scale(zoom);
262
263			return transformation.transform(point, scale);
264		}
265	});
266
267	L.Proj.imageOverlay = function (url, bounds, options) {
268		return new L.Proj.ImageOverlay(url, bounds, options);
269	};
270
271	return L.Proj;
272}
vendor: 5 bytes, line 272
272));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.