From c5ba5b0456a711d157e317f220e9c739226e7f50 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Tue, 10 Jan 2012 01:54:37 +0100 Subject: Installed leaflet in extlib --- extlib/leaflet/src/geo/LatLng.js | 35 ++++++++++++ extlib/leaflet/src/geo/LatLngBounds.js | 62 ++++++++++++++++++++++ extlib/leaflet/src/geo/crs/CRS.EPSG3395.js | 13 +++++ extlib/leaflet/src/geo/crs/CRS.EPSG3857.js | 17 ++++++ extlib/leaflet/src/geo/crs/CRS.EPSG4326.js | 7 +++ extlib/leaflet/src/geo/crs/CRS.js | 17 ++++++ .../src/geo/projection/Projection.LonLat.js | 10 ++++ .../src/geo/projection/Projection.Mercator.js | 49 +++++++++++++++++ .../geo/projection/Projection.SphericalMercator.js | 23 ++++++++ extlib/leaflet/src/geo/projection/Projection.js | 5 ++ 10 files changed, 238 insertions(+) create mode 100644 extlib/leaflet/src/geo/LatLng.js create mode 100644 extlib/leaflet/src/geo/LatLngBounds.js create mode 100644 extlib/leaflet/src/geo/crs/CRS.EPSG3395.js create mode 100644 extlib/leaflet/src/geo/crs/CRS.EPSG3857.js create mode 100644 extlib/leaflet/src/geo/crs/CRS.EPSG4326.js create mode 100644 extlib/leaflet/src/geo/crs/CRS.js create mode 100644 extlib/leaflet/src/geo/projection/Projection.LonLat.js create mode 100644 extlib/leaflet/src/geo/projection/Projection.Mercator.js create mode 100644 extlib/leaflet/src/geo/projection/Projection.SphericalMercator.js create mode 100644 extlib/leaflet/src/geo/projection/Projection.js (limited to 'extlib/leaflet/src/geo') 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 = {}; -- cgit v1.2.3