diff options
Diffstat (limited to 'extlib/leaflet/src/geo')
-rw-r--r-- | extlib/leaflet/src/geo/LatLng.js | 35 | ||||
-rw-r--r-- | extlib/leaflet/src/geo/LatLngBounds.js | 62 | ||||
-rw-r--r-- | extlib/leaflet/src/geo/crs/CRS.EPSG3395.js | 13 | ||||
-rw-r--r-- | extlib/leaflet/src/geo/crs/CRS.EPSG3857.js | 17 | ||||
-rw-r--r-- | extlib/leaflet/src/geo/crs/CRS.EPSG4326.js | 7 | ||||
-rw-r--r-- | extlib/leaflet/src/geo/crs/CRS.js | 17 | ||||
-rw-r--r-- | extlib/leaflet/src/geo/projection/Projection.LonLat.js | 10 | ||||
-rw-r--r-- | extlib/leaflet/src/geo/projection/Projection.Mercator.js | 49 | ||||
-rw-r--r-- | extlib/leaflet/src/geo/projection/Projection.SphericalMercator.js | 23 | ||||
-rw-r--r-- | extlib/leaflet/src/geo/projection/Projection.js | 5 |
10 files changed, 238 insertions, 0 deletions
diff --git a/extlib/leaflet/src/geo/LatLng.js b/extlib/leaflet/src/geo/LatLng.js new file mode 100644 index 00000000..fb916547 --- /dev/null +++ b/extlib/leaflet/src/geo/LatLng.js @@ -0,0 +1,35 @@ +/*
+ CM.LatLng represents a geographical point with latitude and longtitude coordinates.
+*/
+
+L.LatLng = function(/*Number*/ lat, /*Number*/ lng, /*Boolean*/ noWrap) {
+ if (noWrap !== true) {
+ lat = Math.max(Math.min(lat, 90), -90); // clamp latitude into -90..90
+ lng = (lng + 180) % 360 + (lng < -180 ? 180 : -180); // wrap longtitude into -180..180
+ }
+
+ //TODO change to lat() & lng()
+ this.lat = lat;
+ this.lng = lng;
+};
+
+L.Util.extend(L.LatLng, {
+ DEG_TO_RAD: Math.PI / 180,
+ RAD_TO_DEG: 180 / Math.PI,
+ MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check
+});
+
+L.LatLng.prototype = {
+ equals: function(/*LatLng*/ obj) {
+ if (!(obj instanceof L.LatLng)) { return false; }
+
+ var margin = Math.max(Math.abs(this.lat - obj.lat), Math.abs(this.lng - obj.lng));
+ return margin <= L.LatLng.MAX_MARGIN;
+ },
+
+ toString: function() {
+ return 'LatLng(' +
+ L.Util.formatNum(this.lat) + ', ' +
+ L.Util.formatNum(this.lng) + ')';
+ }
+};
\ No newline at end of file diff --git a/extlib/leaflet/src/geo/LatLngBounds.js b/extlib/leaflet/src/geo/LatLngBounds.js new file mode 100644 index 00000000..c4e70ec3 --- /dev/null +++ b/extlib/leaflet/src/geo/LatLngBounds.js @@ -0,0 +1,62 @@ +/*
+ * L.LatLngBounds represents a rectangular area on the map in geographical coordinates.
+ */
+
+L.LatLngBounds = L.Class.extend({
+ initialize: function(southWest, northEast) { // (LatLng, LatLng) or (LatLng[])
+ if (!southWest) return;
+ var latlngs = (southWest instanceof Array ? southWest : [southWest, northEast]);
+ for (var i = 0, len = latlngs.length; i < len; i++) {
+ this.extend(latlngs[i]);
+ }
+ },
+
+ // extend the bounds to contain the given point
+ extend: function(/*LatLng*/ latlng) {
+ if (!this._southWest && !this._northEast) {
+ this._southWest = new L.LatLng(latlng.lat, latlng.lng);
+ this._northEast = new L.LatLng(latlng.lat, latlng.lng);
+ } else {
+ this._southWest.lat = Math.min(latlng.lat, this._southWest.lat);
+ this._southWest.lng = Math.min(latlng.lng, this._southWest.lng);
+ this._northEast.lat = Math.max(latlng.lat, this._northEast.lat);
+ this._northEast.lng = Math.max(latlng.lng, this._northEast.lng);
+ }
+ },
+
+ getCenter: function() /*-> LatLng*/ {
+ return new L.LatLng(
+ (this._southWest.lat + this._northEast.lat) / 2,
+ (this._southWest.lng + this._northEast.lng) / 2);
+ },
+
+ getSouthWest: function() { return this._southWest; },
+
+ getNorthEast: function() { return this._northEast; },
+
+ getNorthWest: function() {
+ return new L.LatLng(this._northEast.lat, this._southWest.lng);
+ },
+
+ getSouthEast: function() {
+ return new L.LatLng(this._southWest.lat, this._northEast.lng);
+ },
+
+ contains: function(/*LatLngBounds or LatLng*/ obj) /*-> Boolean*/ {
+ var sw = this._southWest,
+ ne = this._northEast,
+ sw2, ne2;
+
+ if (obj instanceof L.LatLngBounds) {
+ sw2 = obj.getSouthWest();
+ ne2 = obj.getNorthEast();
+ } else {
+ sw2 = ne2 = obj;
+ }
+
+ return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&
+ (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);
+ }
+});
+
+//TODO International date line?
\ No newline at end of file diff --git a/extlib/leaflet/src/geo/crs/CRS.EPSG3395.js b/extlib/leaflet/src/geo/crs/CRS.EPSG3395.js new file mode 100644 index 00000000..426dc73c --- /dev/null +++ b/extlib/leaflet/src/geo/crs/CRS.EPSG3395.js @@ -0,0 +1,13 @@ +
+L.CRS.EPSG3395 = L.Util.extend({}, L.CRS, {
+ code: 'EPSG:3395',
+
+ projection: L.Projection.Mercator,
+ transformation: (function() {
+ var m = L.Projection.Mercator,
+ r = m.R_MAJOR,
+ r2 = m.R_MINOR;
+
+ return new L.Transformation(0.5/(Math.PI * r), 0.5, -0.5/(Math.PI * r2), 0.5);
+ })()
+});
\ No newline at end of file diff --git a/extlib/leaflet/src/geo/crs/CRS.EPSG3857.js b/extlib/leaflet/src/geo/crs/CRS.EPSG3857.js new file mode 100644 index 00000000..cbdbd03a --- /dev/null +++ b/extlib/leaflet/src/geo/crs/CRS.EPSG3857.js @@ -0,0 +1,17 @@ +
+L.CRS.EPSG3857 = L.Util.extend({}, L.CRS, {
+ code: 'EPSG:3857',
+
+ projection: L.Projection.SphericalMercator,
+ transformation: new L.Transformation(0.5/Math.PI, 0.5, -0.5/Math.PI, 0.5),
+
+ project: function(/*LatLng*/ latlng)/*-> Point*/ {
+ var projectedPoint = this.projection.project(latlng),
+ earthRadius = 6378137;
+ return projectedPoint.multiplyBy(earthRadius);
+ }
+});
+
+L.CRS.EPSG900913 = L.Util.extend({}, L.CRS.EPSG3857, {
+ code: 'EPSG:900913'
+});
\ No newline at end of file diff --git a/extlib/leaflet/src/geo/crs/CRS.EPSG4326.js b/extlib/leaflet/src/geo/crs/CRS.EPSG4326.js new file mode 100644 index 00000000..1550718d --- /dev/null +++ b/extlib/leaflet/src/geo/crs/CRS.EPSG4326.js @@ -0,0 +1,7 @@ +
+L.CRS.EPSG4326 = L.Util.extend({}, L.CRS, {
+ code: 'EPSG:4326',
+
+ projection: L.Projection.LonLat,
+ transformation: new L.Transformation(1/360, 0.5, -1/360, 0.5)
+});
\ No newline at end of file diff --git a/extlib/leaflet/src/geo/crs/CRS.js b/extlib/leaflet/src/geo/crs/CRS.js new file mode 100644 index 00000000..2dc2aa8d --- /dev/null +++ b/extlib/leaflet/src/geo/crs/CRS.js @@ -0,0 +1,17 @@ +
+L.CRS = {
+ latLngToPoint: function(/*LatLng*/ latlng, /*Number*/ scale)/*-> Point*/ {
+ var projectedPoint = this.projection.project(latlng);
+ return this.transformation._transform(projectedPoint, scale);
+ },
+
+ pointToLatLng: function(/*Point*/ point, /*Number*/ scale, /*(optional) Boolean*/ unbounded)/*-> LatLng*/ {
+ var untransformedPoint = this.transformation.untransform(point, scale);
+ return this.projection.unproject(untransformedPoint, unbounded);
+ //TODO get rid of 'unbounded' everywhere
+ },
+
+ project: function(latlng) {
+ return this.projection.project(latlng);
+ }
+};
\ No newline at end of file diff --git a/extlib/leaflet/src/geo/projection/Projection.LonLat.js b/extlib/leaflet/src/geo/projection/Projection.LonLat.js new file mode 100644 index 00000000..ece29717 --- /dev/null +++ b/extlib/leaflet/src/geo/projection/Projection.LonLat.js @@ -0,0 +1,10 @@ +
+L.Projection.LonLat = {
+ project: function(latlng) {
+ return new L.Point(latlng.lng, latlng.lat);
+ },
+
+ unproject: function(point, unbounded) {
+ return new L.LatLng(point.y, point.x, unbounded);
+ }
+};
diff --git a/extlib/leaflet/src/geo/projection/Projection.Mercator.js b/extlib/leaflet/src/geo/projection/Projection.Mercator.js new file mode 100644 index 00000000..9eafff18 --- /dev/null +++ b/extlib/leaflet/src/geo/projection/Projection.Mercator.js @@ -0,0 +1,49 @@ +
+L.Projection.Mercator = {
+ MAX_LATITUDE: 85.0840591556,
+
+ R_MINOR: 6356752.3142,
+ R_MAJOR: 6378137,
+
+ project: function(/*LatLng*/ latlng) /*-> Point*/ {
+ var d = L.LatLng.DEG_TO_RAD,
+ max = this.MAX_LATITUDE,
+ lat = Math.max(Math.min(max, latlng.lat), -max),
+ r = this.R_MAJOR,
+ x = latlng.lng * d * r,
+ y = lat * d,
+ tmp = this.R_MINOR / r,
+ eccent = Math.sqrt(1.0 - tmp * tmp),
+ con = eccent * Math.sin(y);
+
+ con = Math.pow((1 - con)/(1 + con), eccent * 0.5);
+
+ var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;
+ y = -r * Math.log(ts);
+
+ return new L.Point(x, y);
+ },
+
+ unproject: function(/*Point*/ point, /*Boolean*/ unbounded) /*-> LatLng*/ {
+ var d = L.LatLng.RAD_TO_DEG,
+ r = this.R_MAJOR,
+ lng = point.x * d / r,
+ tmp = this.R_MINOR / r,
+ eccent = Math.sqrt(1 - (tmp * tmp)),
+ ts = Math.exp(- point.y / r),
+ phi = Math.PI/2 - 2 * Math.atan(ts),
+ numIter = 15,
+ tol = 1e-7,
+ i = numIter,
+ dphi = 0.1,
+ con;
+
+ while ((Math.abs(dphi) > tol) && (--i > 0)) {
+ con = eccent * Math.sin(phi);
+ dphi = Math.PI/2 - 2 * Math.atan(ts * Math.pow((1.0 - con)/(1.0 + con), 0.5 * eccent)) - phi;
+ phi += dphi;
+ }
+
+ return new L.LatLng(phi * d, lng, unbounded);
+ }
+};
diff --git a/extlib/leaflet/src/geo/projection/Projection.SphericalMercator.js b/extlib/leaflet/src/geo/projection/Projection.SphericalMercator.js new file mode 100644 index 00000000..be0532ff --- /dev/null +++ b/extlib/leaflet/src/geo/projection/Projection.SphericalMercator.js @@ -0,0 +1,23 @@ +
+L.Projection.SphericalMercator = {
+ MAX_LATITUDE: 85.0511287798,
+
+ project: function(/*LatLng*/ latlng) /*-> Point*/ {
+ var d = L.LatLng.DEG_TO_RAD,
+ max = this.MAX_LATITUDE,
+ lat = Math.max(Math.min(max, latlng.lat), -max),
+ x = latlng.lng * d,
+ y = lat * d;
+ y = Math.log(Math.tan(Math.PI/4 + y/2));
+
+ return new L.Point(x, y);
+ },
+
+ unproject: function(/*Point*/ point, /*Boolean*/ unbounded) /*-> LatLng*/ {
+ var d = L.LatLng.RAD_TO_DEG,
+ lng = point.x * d,
+ lat = (2 * Math.atan(Math.exp(point.y)) - Math.PI/2) * d;
+
+ return new L.LatLng(lat, lng, unbounded);
+ }
+};
diff --git a/extlib/leaflet/src/geo/projection/Projection.js b/extlib/leaflet/src/geo/projection/Projection.js new file mode 100644 index 00000000..84316b30 --- /dev/null +++ b/extlib/leaflet/src/geo/projection/Projection.js @@ -0,0 +1,5 @@ +/*
+ * L.Projection contains various geographical projections used by CRS classes.
+ */
+
+L.Projection = {};
|