diff --git a/WebContent/js/FigisMap.js b/WebContent/js/FigisMap.js index 1b7325d..4013e20 100644 --- a/WebContent/js/FigisMap.js +++ b/WebContent/js/FigisMap.js @@ -139,10 +139,10 @@ if ( FigisMap.useProxy ) FigisMap.rnd.vars.wfs = FigisMap.currentSiteURI + '/Fig /* @eblondel disabled for testing OL3 scripts specified in html -document.write(''); -document.write(''); -document.write(''); -document.write(''); +document.write(''); +document.write(''); +document.write(''); +document.write(''); document.write(''); document.write(''); @@ -284,8 +284,8 @@ FigisMap.ol.reBound = function( proj0, proj1, bounds ) { bounds = [-180, -90, 180, 90] } var ans = false; - if ( proj0 == 3349 ) proj0 = 900913; - if ( proj1 == 3349 ) proj1 = 900913; + //!OL2 if ( proj0 == 3349 ) proj0 = 900913; + //!OL2 if ( proj1 == 3349 ) proj1 = 900913; if ( proj0 == proj1 ) ans = bounds; if ( proj1 == 3031 ){ //!OL2 return new OpenLayers.Bounds(-12400000,-12400000, 12400000,12400000); @@ -348,12 +348,11 @@ FigisMap.ol.dateline = function( b ) { FigisMap.ol.reCenter = function( proj0, proj1, center ) { proj0 = parseInt( String( proj0.projCode ? proj0.projCode : proj0 ).replace(/^EPSG:/,'') ); proj1 = parseInt( String( proj1.projCode ? proj1.projCode : proj1 ).replace(/^EPSG:/,'') ); - if ( proj0 == 3349 ) proj0 = 900913; - if ( proj1 == 3349 ) proj1 = 900913; + //!OL2 if ( proj0 == 3349 ) proj0 = 900913; + //!OL2 if ( proj1 == 3349 ) proj1 = 900913; if ( center == null ) { //!OL2 if ( proj1 == 900913 ) return new OpenLayers.LonLat(20037508.34, 4226661.92); if( proj1 == 900913 ) return [20037508.34, 4226661.92]; - proj0 = 4326; //!OL2 center = new OpenLayers.LonLat( 0, 0 ); center = [0,0]; @@ -596,13 +595,14 @@ FigisMap.parser.projection = function( p ) { if ( proj ) { proj = parseInt( proj ); } else { - if ( p.rfb && p.rfb == 'ICES' ) proj = 3349; + if ( p.rfb && p.rfb == 'ICES' ) proj = 900913; } switch ( proj ) { - case 3349 : break; - case 900913 : break; - case 3031 : break; - default : proj = 4326; + //!OL2 case 3349 : break; + //!OL2 case 900913 : break; + case 900913 : break; + case 3031 : break; + default : proj = 4326; } return proj; }; @@ -1421,7 +1421,6 @@ FigisMap.rfb.preparse = function( pars ) { if ( ! pars.mapSize ) pars.mapSize = 'L'; if ( pars.landMask == null ) pars.landMask = true; return ( pars.rfbPreparsed = true ); - //if ( pars.projection.toString() == "3349" && ( pars.rfb == 'ICES' )) pars.global = false; }; /** @@ -1566,7 +1565,7 @@ FigisMap.renderer = function(options) { projection = pars.projection; p = pars; - if (projection == 3349) projection = 900913; // use google spherical mercator ... + //!OL2 if (projection == 3349) projection = 900913; // use google spherical mercator ... var mapMaxRes = FigisMap.rnd.maxResolution( projection, p ); //TODO ? OL3 in principle not use, to check @@ -1579,8 +1578,8 @@ FigisMap.renderer = function(options) { boundsOrigin = new Array( myBounds.left, myBounds.bottom ); boundsBox = new Array( myBounds.left, myBounds.bottom, myBounds.right, myBounds.top );*/ switch ( projection ) { - case 3031 : myBounds = [-25000000, -25000000, 25000000, 25000000]; break; - case 900913 : myBounds = [-20037508.34, -20037508.34, 20037508.34, 20037508.34]; break; + case 3031 : myBounds = [-25000000, -25000000, 25000000, 25000000]; break; + case 900913 : myBounds = [-20037508.34, -20037508.34, 20037508.34, 20037508.34]; break; default : projection = 4326; myBounds = [-180, -90, 180, 90]; } boundsOrigin = [myBounds[0], myBounds[1]]; @@ -1643,11 +1642,14 @@ FigisMap.renderer = function(options) { //Map widget //---------- + var viewProj = new ol.proj.Projection({code:'EPSG:'+projection}); + viewProj.setExtent(myBounds); + myMap = new ol.Map({ target : p.target.id, layers: [baselayers, overlays], view : new ol.View({ - projection : 'EPSG:4326', + projection : viewProj, center : ol.extent.getCenter(boundsBox), zoom : 0, maxResolution : mapMaxRes @@ -1944,7 +1946,7 @@ FigisMap.renderer = function(options) { if ( proj == 3031 ) { // center to south pole in polar projection nc = FigisMap.ol.reCenter( 4326, proj ); - } else if ( proj == 900913 || proj == 3349 ) { + } else if ( proj == 900913 ) { // center to Pacific centre in Mercator - only if larger than 35k km (whole world) var nbw = Math.abs( nb.right - nb.left ); if ( nbw > 35000000 ) { diff --git a/WebContent/js/vendor/proj4js/defs/3031.js b/WebContent/js/vendor/proj4js/defs/3031.js new file mode 100644 index 0000000..366fd5a --- /dev/null +++ b/WebContent/js/vendor/proj4js/defs/3031.js @@ -0,0 +1 @@ +proj4.defs("EPSG:3031","+proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs"); \ No newline at end of file diff --git a/WebContent/js/vendor/proj4js/defs/4326.js b/WebContent/js/vendor/proj4js/defs/4326.js new file mode 100644 index 0000000..d16a022 --- /dev/null +++ b/WebContent/js/vendor/proj4js/defs/4326.js @@ -0,0 +1 @@ +proj4.defs("EPSG:4326","+proj=longlat +datum=WGS84 +no_defs"); \ No newline at end of file diff --git a/WebContent/js/vendor/proj4js/defs/900913.js b/WebContent/js/vendor/proj4js/defs/900913.js new file mode 100644 index 0000000..a7b8c58 --- /dev/null +++ b/WebContent/js/vendor/proj4js/defs/900913.js @@ -0,0 +1 @@ +proj4.defs("EPSG:900913","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"); \ No newline at end of file diff --git a/WebContent/js/vendor/proj4js/lib/defs/EPSG3031.js b/WebContent/js/vendor/proj4js/lib/defs/EPSG3031.js deleted file mode 100644 index c558272..0000000 --- a/WebContent/js/vendor/proj4js/lib/defs/EPSG3031.js +++ /dev/null @@ -1 +0,0 @@ -Proj4js.defs["EPSG:3031"]="+title= Polar EPSG:3031 +proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs" \ No newline at end of file diff --git a/WebContent/js/vendor/proj4js/lib/defs/EPSG4326.js b/WebContent/js/vendor/proj4js/lib/defs/EPSG4326.js deleted file mode 100644 index db2de3b..0000000 --- a/WebContent/js/vendor/proj4js/lib/defs/EPSG4326.js +++ /dev/null @@ -1 +0,0 @@ -Proj4js.defs["EPSG:4326"] = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"; \ No newline at end of file diff --git a/WebContent/js/vendor/proj4js/lib/defs/EPSG900913.js b/WebContent/js/vendor/proj4js/lib/defs/EPSG900913.js deleted file mode 100644 index 18c4cd9..0000000 --- a/WebContent/js/vendor/proj4js/lib/defs/EPSG900913.js +++ /dev/null @@ -1,5 +0,0 @@ -// Google Mercator projection -// Used in combination with GoogleMercator layer type in OpenLayers -//+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs - -Proj4js.defs["EPSG:900913"]= "+title= Google Mercator EPSG:900913 +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"; diff --git a/WebContent/js/vendor/proj4js/lib/proj4js-combined.js b/WebContent/js/vendor/proj4js/lib/proj4js-combined.js deleted file mode 100644 index c0c58d7..0000000 --- a/WebContent/js/vendor/proj4js/lib/proj4js-combined.js +++ /dev/null @@ -1,4987 +0,0 @@ -/* - proj4js.js -- Javascript reprojection library. - - Authors: Mike Adair madairATdmsolutions.ca - Richard Greenwood richATgreenwoodmap.com - Didier Richard didier.richardATign.fr - Stephen Irons - License: LGPL as per: http://www.gnu.org/copyleft/lesser.html - Note: This program is an almost direct port of the C library - Proj4. -*/ -/* ====================================================================== - proj4js.js - ====================================================================== */ - -/* -Author: Mike Adair madairATdmsolutions.ca - Richard Greenwood rich@greenwoodmap.com -License: LGPL as per: http://www.gnu.org/copyleft/lesser.html - -$Id: Proj.js 2956 2007-07-09 12:17:52Z steven $ -*/ - -/** - * Namespace: Proj4js - * - * Proj4js is a JavaScript library to transform point coordinates from one - * coordinate system to another, including datum transformations. - * - * This library is a port of both the Proj.4 and GCTCP C libraries to JavaScript. - * Enabling these transformations in the browser allows geographic data stored - * in different projections to be combined in browser-based web mapping - * applications. - * - * Proj4js must have access to coordinate system initialization strings (which - * are the same as for PROJ.4 command line). Thes can be included in your - * application using a - - def is a CS definition in PROJ.4 WKT format, for example: - +proj="tmerc" //longlat, etc. - +a=majorRadius - +b=minorRadius - +lat0=somenumber - +long=somenumber -*/ -Proj4js.defs = { - // These are so widely used, we'll go ahead and throw them in - // without requiring a separate .js file - 'WGS84': "+title=long/lat:WGS84 +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees", - 'EPSG:4326': "+title=long/lat:WGS84 +proj=longlat +a=6378137.0 +b=6356752.31424518 +ellps=WGS84 +datum=WGS84 +units=degrees", - 'EPSG:4269': "+title=long/lat:NAD83 +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees", - 'EPSG:3785': "+title= Google Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs" -}; -Proj4js.defs['GOOGLE'] = Proj4js.defs['EPSG:3785']; -Proj4js.defs['EPSG:900913'] = Proj4js.defs['EPSG:3785']; -Proj4js.defs['EPSG:102113'] = Proj4js.defs['EPSG:3785']; - -Proj4js.common = { - PI : 3.141592653589793238, //Math.PI, - HALF_PI : 1.570796326794896619, //Math.PI*0.5, - TWO_PI : 6.283185307179586477, //Math.PI*2, - FORTPI : 0.78539816339744833, - R2D : 57.29577951308232088, - D2R : 0.01745329251994329577, - SEC_TO_RAD : 4.84813681109535993589914102357e-6, /* SEC_TO_RAD = Pi/180/3600 */ - EPSLN : 1.0e-10, - MAX_ITER : 20, - // following constants from geocent.c - COS_67P5 : 0.38268343236508977, /* cosine of 67.5 degrees */ - AD_C : 1.0026000, /* Toms region 1 constant */ - - /* datum_type values */ - PJD_UNKNOWN : 0, - PJD_3PARAM : 1, - PJD_7PARAM : 2, - PJD_GRIDSHIFT: 3, - PJD_WGS84 : 4, // WGS84 or equivalent - PJD_NODATUM : 5, // WGS84 or equivalent - SRS_WGS84_SEMIMAJOR : 6378137.0, // only used in grid shift transforms - - // ellipoid pj_set_ell.c - SIXTH : .1666666666666666667, /* 1/6 */ - RA4 : .04722222222222222222, /* 17/360 */ - RA6 : .02215608465608465608, /* 67/3024 */ - RV4 : .06944444444444444444, /* 5/72 */ - RV6 : .04243827160493827160, /* 55/1296 */ - -// Function to compute the constant small m which is the radius of -// a parallel of latitude, phi, divided by the semimajor axis. -// ----------------------------------------------------------------- - msfnz : function(eccent, sinphi, cosphi) { - var con = eccent * sinphi; - return cosphi/(Math.sqrt(1.0 - con * con)); - }, - -// Function to compute the constant small t for use in the forward -// computations in the Lambert Conformal Conic and the Polar -// Stereographic projections. -// ----------------------------------------------------------------- - tsfnz : function(eccent, phi, sinphi) { - var con = eccent * sinphi; - var com = .5 * eccent; - con = Math.pow(((1.0 - con) / (1.0 + con)), com); - return (Math.tan(.5 * (this.HALF_PI - phi))/con); - }, - -// Function to compute the latitude angle, phi2, for the inverse of the -// Lambert Conformal Conic and Polar Stereographic projections. -// ---------------------------------------------------------------- - phi2z : function(eccent, ts) { - var eccnth = .5 * eccent; - var con, dphi; - var phi = this.HALF_PI - 2 * Math.atan(ts); - for (i = 0; i <= 15; i++) { - con = eccent * Math.sin(phi); - dphi = this.HALF_PI - 2 * Math.atan(ts *(Math.pow(((1.0 - con)/(1.0 + con)),eccnth))) - phi; - phi += dphi; - if (Math.abs(dphi) <= .0000000001) return phi; - } - alert("phi2z has NoConvergence"); - return (-9999); - }, - -/* Function to compute constant small q which is the radius of a - parallel of latitude, phi, divided by the semimajor axis. -------------------------------------------------------------*/ - qsfnz : function(eccent,sinphi) { - var con; - if (eccent > 1.0e-7) { - con = eccent * sinphi; - return (( 1.0- eccent * eccent) * (sinphi /(1.0 - con * con) - (.5/eccent)*Math.log((1.0 - con)/(1.0 + con)))); - } else { - return(2.0 * sinphi); - } - }, - -/* Function to eliminate roundoff errors in asin -----------------------------------------------*/ - asinz : function(x) { - if (Math.abs(x)>1.0) { - x=(x>1.0)?1.0:-1.0; - } - return Math.asin(x); - }, - -// following functions from gctpc cproj.c for transverse mercator projections - e0fn : function(x) {return(1.0-0.25*x*(1.0+x/16.0*(3.0+1.25*x)));}, - e1fn : function(x) {return(0.375*x*(1.0+0.25*x*(1.0+0.46875*x)));}, - e2fn : function(x) {return(0.05859375*x*x*(1.0+0.75*x));}, - e3fn : function(x) {return(x*x*x*(35.0/3072.0));}, - mlfn : function(e0,e1,e2,e3,phi) {return(e0*phi-e1*Math.sin(2.0*phi)+e2*Math.sin(4.0*phi)-e3*Math.sin(6.0*phi));}, - - srat : function(esinp, exp) { - return(Math.pow((1.0-esinp)/(1.0+esinp), exp)); - }, - -// Function to return the sign of an argument - sign : function(x) { if (x < 0.0) return(-1); else return(1);}, - -// Function to adjust longitude to -180 to 180; input in radians - adjust_lon : function(x) { - x = (Math.abs(x) < this.PI) ? x: (x - (this.sign(x)*this.TWO_PI) ); - return x; - }, - -// IGNF - DGR : algorithms used by IGN France - -// Function to adjust latitude to -90 to 90; input in radians - adjust_lat : function(x) { - x= (Math.abs(x) < this.HALF_PI) ? x: (x - (this.sign(x)*this.PI) ); - return x; - }, - -// Latitude Isometrique - close to tsfnz ... - latiso : function(eccent, phi, sinphi) { - if (Math.abs(phi) > this.HALF_PI) return +Number.NaN; - if (phi==this.HALF_PI) return Number.POSITIVE_INFINITY; - if (phi==-1.0*this.HALF_PI) return -1.0*Number.POSITIVE_INFINITY; - - var con= eccent*sinphi; - return Math.log(Math.tan((this.HALF_PI+phi)/2.0))+eccent*Math.log((1.0-con)/(1.0+con))/2.0; - }, - - fL : function(x,L) { - return 2.0*Math.atan(x*Math.exp(L)) - this.HALF_PI; - }, - -// Inverse Latitude Isometrique - close to ph2z - invlatiso : function(eccent, ts) { - var phi= this.fL(1.0,ts); - var Iphi= 0.0; - var con= 0.0; - do { - Iphi= phi; - con= eccent*Math.sin(Iphi); - phi= this.fL(Math.exp(eccent*Math.log((1.0+con)/(1.0-con))/2.0),ts) - } while (Math.abs(phi-Iphi)>1.0e-12); - return phi; - }, - -// Needed for Gauss Schreiber -// Original: Denis Makarov (info@binarythings.com) -// Web Site: http://www.binarythings.com - sinh : function(x) - { - var r= Math.exp(x); - r= (r-1.0/r)/2.0; - return r; - }, - - cosh : function(x) - { - var r= Math.exp(x); - r= (r+1.0/r)/2.0; - return r; - }, - - tanh : function(x) - { - var r= Math.exp(x); - r= (r-1.0/r)/(r+1.0/r); - return r; - }, - - asinh : function(x) - { - var s= (x>= 0? 1.0:-1.0); - return s*(Math.log( Math.abs(x) + Math.sqrt(x*x+1.0) )); - }, - - acosh : function(x) - { - return 2.0*Math.log(Math.sqrt((x+1.0)/2.0) + Math.sqrt((x-1.0)/2.0)); - }, - - atanh : function(x) - { - return Math.log((x-1.0)/(x+1.0))/2.0; - }, - -// Grande Normale - gN : function(a,e,sinphi) - { - var temp= e*sinphi; - return a/Math.sqrt(1.0 - temp*temp); - } - -}; - -/** datum object -*/ -Proj4js.datum = Proj4js.Class({ - - initialize : function(proj) { - this.datum_type = Proj4js.common.PJD_WGS84; //default setting - if (proj.datumCode && proj.datumCode == 'none') { - this.datum_type = Proj4js.common.PJD_NODATUM; - } - if (proj && proj.datum_params) { - for (var i=0; i 3) { - if (proj.datum_params[3] != 0 || proj.datum_params[4] != 0 || - proj.datum_params[5] != 0 || proj.datum_params[6] != 0 ) { - this.datum_type = Proj4js.common.PJD_7PARAM; - proj.datum_params[3] *= Proj4js.common.SEC_TO_RAD; - proj.datum_params[4] *= Proj4js.common.SEC_TO_RAD; - proj.datum_params[5] *= Proj4js.common.SEC_TO_RAD; - proj.datum_params[6] = (proj.datum_params[6]/1000000.0) + 1.0; - } - } - } - if (proj) { - this.a = proj.a; //datum object also uses these values - this.b = proj.b; - this.es = proj.es; - this.ep2 = proj.ep2; - this.datum_params = proj.datum_params; - } - }, - - /****************************************************************/ - // cs_compare_datums() - // Returns 1 (TRUE) if the two datums match, otherwise 0 (FALSE). - compare_datums : function( dest ) { - if( this.datum_type != dest.datum_type ) { - return false; // false, datums are not equal - } else if( this.a != dest.a || Math.abs(this.es-dest.es) > 0.000000000050 ) { - // the tolerence for es is to ensure that GRS80 and WGS84 - // are considered identical - return false; - } else if( this.datum_type == Proj4js.common.PJD_3PARAM ) { - return (this.datum_params[0] == dest.datum_params[0] - && this.datum_params[1] == dest.datum_params[1] - && this.datum_params[2] == dest.datum_params[2]); - } else if( this.datum_type == Proj4js.common.PJD_7PARAM ) { - return (this.datum_params[0] == dest.datum_params[0] - && this.datum_params[1] == dest.datum_params[1] - && this.datum_params[2] == dest.datum_params[2] - && this.datum_params[3] == dest.datum_params[3] - && this.datum_params[4] == dest.datum_params[4] - && this.datum_params[5] == dest.datum_params[5] - && this.datum_params[6] == dest.datum_params[6]); - } else if( this.datum_type == Proj4js.common.PJD_GRIDSHIFT ) { - return strcmp( pj_param(this.params,"snadgrids").s, - pj_param(dest.params,"snadgrids").s ) == 0; - } else { - return true; // datums are equal - } - }, // cs_compare_datums() - - /* - * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates - * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z), - * according to the current ellipsoid parameters. - * - * Latitude : Geodetic latitude in radians (input) - * Longitude : Geodetic longitude in radians (input) - * Height : Geodetic height, in meters (input) - * X : Calculated Geocentric X coordinate, in meters (output) - * Y : Calculated Geocentric Y coordinate, in meters (output) - * Z : Calculated Geocentric Z coordinate, in meters (output) - * - */ - geodetic_to_geocentric : function(p) { - var Longitude = p.x; - var Latitude = p.y; - var Height = p.z ? p.z : 0; //Z value not always supplied - var X; // output - var Y; - var Z; - - var Error_Code=0; // GEOCENT_NO_ERROR; - var Rn; /* Earth radius at location */ - var Sin_Lat; /* Math.sin(Latitude) */ - var Sin2_Lat; /* Square of Math.sin(Latitude) */ - var Cos_Lat; /* Math.cos(Latitude) */ - - /* - ** Don't blow up if Latitude is just a little out of the value - ** range as it may just be a rounding issue. Also removed longitude - ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001. - */ - if( Latitude < -Proj4js.common.HALF_PI && Latitude > -1.001 * Proj4js.common.HALF_PI ) { - Latitude = -Proj4js.common.HALF_PI; - } else if( Latitude > Proj4js.common.HALF_PI && Latitude < 1.001 * Proj4js.common.HALF_PI ) { - Latitude = Proj4js.common.HALF_PI; - } else if ((Latitude < -Proj4js.common.HALF_PI) || (Latitude > Proj4js.common.HALF_PI)) { - /* Latitude out of range */ - Proj4js.reportError('geocent:lat out of range:'+Latitude); - return null; - } - - if (Longitude > Proj4js.common.PI) Longitude -= (2*Proj4js.common.PI); - Sin_Lat = Math.sin(Latitude); - Cos_Lat = Math.cos(Latitude); - Sin2_Lat = Sin_Lat * Sin_Lat; - Rn = this.a / (Math.sqrt(1.0e0 - this.es * Sin2_Lat)); - X = (Rn + Height) * Cos_Lat * Math.cos(Longitude); - Y = (Rn + Height) * Cos_Lat * Math.sin(Longitude); - Z = ((Rn * (1 - this.es)) + Height) * Sin_Lat; - - p.x = X; - p.y = Y; - p.z = Z; - return Error_Code; - }, // cs_geodetic_to_geocentric() - - - geocentric_to_geodetic : function (p) { -/* local defintions and variables */ -/* end-criterium of loop, accuracy of sin(Latitude) */ -var genau = 1.E-12; -var genau2 = (genau*genau); -var maxiter = 30; - - var P; /* distance between semi-minor axis and location */ - var RR; /* distance between center and location */ - var CT; /* sin of geocentric latitude */ - var ST; /* cos of geocentric latitude */ - var RX; - var RK; - var RN; /* Earth radius at location */ - var CPHI0; /* cos of start or old geodetic latitude in iterations */ - var SPHI0; /* sin of start or old geodetic latitude in iterations */ - var CPHI; /* cos of searched geodetic latitude */ - var SPHI; /* sin of searched geodetic latitude */ - var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */ - var At_Pole; /* indicates location is in polar region */ - var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */ - - var X = p.x; - var Y = p.y; - var Z = p.z ? p.z : 0.0; //Z value not always supplied - var Longitude; - var Latitude; - var Height; - - At_Pole = false; - P = Math.sqrt(X*X+Y*Y); - RR = Math.sqrt(X*X+Y*Y+Z*Z); - -/* special cases for latitude and longitude */ - if (P/this.a < genau) { - -/* special case, if P=0. (X=0., Y=0.) */ - At_Pole = true; - Longitude = 0.0; - -/* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis - * of ellipsoid (=center of mass), Latitude becomes PI/2 */ - if (RR/this.a < genau) { - Latitude = Proj4js.common.HALF_PI; - Height = -this.b; - return; - } - } else { -/* ellipsoidal (geodetic) longitude - * interval: -PI < Longitude <= +PI */ - Longitude=Math.atan2(Y,X); - } - -/* -------------------------------------------------------------- - * Following iterative algorithm was developped by - * "Institut für Erdmessung", University of Hannover, July 1988. - * Internet: www.ife.uni-hannover.de - * Iterative computation of CPHI,SPHI and Height. - * Iteration of CPHI and SPHI to 10**-12 radian resp. - * 2*10**-7 arcsec. - * -------------------------------------------------------------- - */ - CT = Z/RR; - ST = P/RR; - RX = 1.0/Math.sqrt(1.0-this.es*(2.0-this.es)*ST*ST); - CPHI0 = ST*(1.0-this.es)*RX; - SPHI0 = CT*RX; - iter = 0; - -/* loop to find sin(Latitude) resp. Latitude - * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */ - do - { - iter++; - RN = this.a/Math.sqrt(1.0-this.es*SPHI0*SPHI0); - -/* ellipsoidal (geodetic) height */ - Height = P*CPHI0+Z*SPHI0-RN*(1.0-this.es*SPHI0*SPHI0); - - RK = this.es*RN/(RN+Height); - RX = 1.0/Math.sqrt(1.0-RK*(2.0-RK)*ST*ST); - CPHI = ST*(1.0-RK)*RX; - SPHI = CT*RX; - SDPHI = SPHI*CPHI0-CPHI*SPHI0; - CPHI0 = CPHI; - SPHI0 = SPHI; - } - while (SDPHI*SDPHI > genau2 && iter < maxiter); - -/* ellipsoidal (geodetic) latitude */ - Latitude=Math.atan(SPHI/Math.abs(CPHI)); - - p.x = Longitude; - p.y = Latitude; - p.z = Height; - return p; - }, // cs_geocentric_to_geodetic() - - /** Convert_Geocentric_To_Geodetic - * The method used here is derived from 'An Improved Algorithm for - * Geocentric to Geodetic Coordinate Conversion', by Ralph Toms, Feb 1996 - */ - geocentric_to_geodetic_noniter : function (p) { - var X = p.x; - var Y = p.y; - var Z = p.z ? p.z : 0; //Z value not always supplied - var Longitude; - var Latitude; - var Height; - - var W; /* distance from Z axis */ - var W2; /* square of distance from Z axis */ - var T0; /* initial estimate of vertical component */ - var T1; /* corrected estimate of vertical component */ - var S0; /* initial estimate of horizontal component */ - var S1; /* corrected estimate of horizontal component */ - var Sin_B0; /* Math.sin(B0), B0 is estimate of Bowring aux variable */ - var Sin3_B0; /* cube of Math.sin(B0) */ - var Cos_B0; /* Math.cos(B0) */ - var Sin_p1; /* Math.sin(phi1), phi1 is estimated latitude */ - var Cos_p1; /* Math.cos(phi1) */ - var Rn; /* Earth radius at location */ - var Sum; /* numerator of Math.cos(phi1) */ - var At_Pole; /* indicates location is in polar region */ - - X = parseFloat(X); // cast from string to float - Y = parseFloat(Y); - Z = parseFloat(Z); - - At_Pole = false; - if (X != 0.0) - { - Longitude = Math.atan2(Y,X); - } - else - { - if (Y > 0) - { - Longitude = Proj4js.common.HALF_PI; - } - else if (Y < 0) - { - Longitude = -Proj4js.common.HALF_PI; - } - else - { - At_Pole = true; - Longitude = 0.0; - if (Z > 0.0) - { /* north pole */ - Latitude = Proj4js.common.HALF_PI; - } - else if (Z < 0.0) - { /* south pole */ - Latitude = -Proj4js.common.HALF_PI; - } - else - { /* center of earth */ - Latitude = Proj4js.common.HALF_PI; - Height = -this.b; - return; - } - } - } - W2 = X*X + Y*Y; - W = Math.sqrt(W2); - T0 = Z * Proj4js.common.AD_C; - S0 = Math.sqrt(T0 * T0 + W2); - Sin_B0 = T0 / S0; - Cos_B0 = W / S0; - Sin3_B0 = Sin_B0 * Sin_B0 * Sin_B0; - T1 = Z + this.b * this.ep2 * Sin3_B0; - Sum = W - this.a * this.es * Cos_B0 * Cos_B0 * Cos_B0; - S1 = Math.sqrt(T1*T1 + Sum * Sum); - Sin_p1 = T1 / S1; - Cos_p1 = Sum / S1; - Rn = this.a / Math.sqrt(1.0 - this.es * Sin_p1 * Sin_p1); - if (Cos_p1 >= Proj4js.common.COS_67P5) - { - Height = W / Cos_p1 - Rn; - } - else if (Cos_p1 <= -Proj4js.common.COS_67P5) - { - Height = W / -Cos_p1 - Rn; - } - else - { - Height = Z / Sin_p1 + Rn * (this.es - 1.0); - } - if (At_Pole == false) - { - Latitude = Math.atan(Sin_p1 / Cos_p1); - } - - p.x = Longitude; - p.y = Latitude; - p.z = Height; - return p; - }, // geocentric_to_geodetic_noniter() - - /****************************************************************/ - // pj_geocentic_to_wgs84( p ) - // p = point to transform in geocentric coordinates (x,y,z) - geocentric_to_wgs84 : function ( p ) { - - if( this.datum_type == Proj4js.common.PJD_3PARAM ) - { - // if( x[io] == HUGE_VAL ) - // continue; - p.x += this.datum_params[0]; - p.y += this.datum_params[1]; - p.z += this.datum_params[2]; - - } - else if (this.datum_type == Proj4js.common.PJD_7PARAM) - { - var Dx_BF =this.datum_params[0]; - var Dy_BF =this.datum_params[1]; - var Dz_BF =this.datum_params[2]; - var Rx_BF =this.datum_params[3]; - var Ry_BF =this.datum_params[4]; - var Rz_BF =this.datum_params[5]; - var M_BF =this.datum_params[6]; - // if( x[io] == HUGE_VAL ) - // continue; - var x_out = M_BF*( p.x - Rz_BF*p.y + Ry_BF*p.z) + Dx_BF; - var y_out = M_BF*( Rz_BF*p.x + p.y - Rx_BF*p.z) + Dy_BF; - var z_out = M_BF*(-Ry_BF*p.x + Rx_BF*p.y + p.z) + Dz_BF; - p.x = x_out; - p.y = y_out; - p.z = z_out; - } - }, // cs_geocentric_to_wgs84 - - /****************************************************************/ - // pj_geocentic_from_wgs84() - // coordinate system definition, - // point to transform in geocentric coordinates (x,y,z) - geocentric_from_wgs84 : function( p ) { - - if( this.datum_type == Proj4js.common.PJD_3PARAM ) - { - //if( x[io] == HUGE_VAL ) - // continue; - p.x -= this.datum_params[0]; - p.y -= this.datum_params[1]; - p.z -= this.datum_params[2]; - - } - else if (this.datum_type == Proj4js.common.PJD_7PARAM) - { - var Dx_BF =this.datum_params[0]; - var Dy_BF =this.datum_params[1]; - var Dz_BF =this.datum_params[2]; - var Rx_BF =this.datum_params[3]; - var Ry_BF =this.datum_params[4]; - var Rz_BF =this.datum_params[5]; - var M_BF =this.datum_params[6]; - var x_tmp = (p.x - Dx_BF) / M_BF; - var y_tmp = (p.y - Dy_BF) / M_BF; - var z_tmp = (p.z - Dz_BF) / M_BF; - //if( x[io] == HUGE_VAL ) - // continue; - - p.x = x_tmp + Rz_BF*y_tmp - Ry_BF*z_tmp; - p.y = -Rz_BF*x_tmp + y_tmp + Rx_BF*z_tmp; - p.z = Ry_BF*x_tmp - Rx_BF*y_tmp + z_tmp; - } //cs_geocentric_from_wgs84() - } -}); - -/** point object, nothing fancy, just allows values to be - passed back and forth by reference rather than by value. - Other point classes may be used as long as they have - x and y properties, which will get modified in the transform method. -*/ -Proj4js.Point = Proj4js.Class({ - - /** - * Constructor: Proj4js.Point - * - * Parameters: - * - x {float} or {Array} either the first coordinates component or - * the full coordinates - * - y {float} the second component - * - z {float} the third component, optional. - */ - initialize : function(x,y,z) { - if (typeof x == 'object') { - this.x = x[0]; - this.y = x[1]; - this.z = x[2] || 0.0; - } else if (typeof x == 'string') { - var coords = x.split(','); - this.x = parseFloat(coords[0]); - this.y = parseFloat(coords[1]); - this.z = parseFloat(coords[2]) || 0.0; - } else { - this.x = x; - this.y = y; - this.z = z || 0.0; - } - }, - - /** - * APIMethod: clone - * Build a copy of a Proj4js.Point object. - * - * Return: - * {Proj4js}.Point the cloned point. - */ - clone : function() { - return new Proj4js.Point(this.x, this.y, this.z); - }, - - /** - * APIMethod: toString - * Return a readable string version of the point - * - * Return: - * {String} String representation of Proj4js.Point object. - * (ex. "x=5,y=42") - */ - toString : function() { - return ("x=" + this.x + ",y=" + this.y); - }, - - /** - * APIMethod: toShortString - * Return a short string version of the point. - * - * Return: - * {String} Shortened String representation of Proj4js.Point object. - * (ex. "5, 42") - */ - toShortString : function() { - return (this.x + ", " + this.y); - } -}); - -Proj4js.PrimeMeridian = { - "greenwich": 0.0, //"0dE", - "lisbon": -9.131906111111, //"9d07'54.862\"W", - "paris": 2.337229166667, //"2d20'14.025\"E", - "bogota": -74.080916666667, //"74d04'51.3\"W", - "madrid": -3.687938888889, //"3d41'16.58\"W", - "rome": 12.452333333333, //"12d27'8.4\"E", - "bern": 7.439583333333, //"7d26'22.5\"E", - "jakarta": 106.807719444444, //"106d48'27.79\"E", - "ferro": -17.666666666667, //"17d40'W", - "brussels": 4.367975, //"4d22'4.71\"E", - "stockholm": 18.058277777778, //"18d3'29.8\"E", - "athens": 23.7163375, //"23d42'58.815\"E", - "oslo": 10.722916666667 //"10d43'22.5\"E" -}; - -Proj4js.Ellipsoid = { - "MERIT": {a:6378137.0, rf:298.257, ellipseName:"MERIT 1983"}, - "SGS85": {a:6378136.0, rf:298.257, ellipseName:"Soviet Geodetic System 85"}, - "GRS80": {a:6378137.0, rf:298.257222101, ellipseName:"GRS 1980(IUGG, 1980)"}, - "IAU76": {a:6378140.0, rf:298.257, ellipseName:"IAU 1976"}, - "airy": {a:6377563.396, b:6356256.910, ellipseName:"Airy 1830"}, - "APL4.": {a:6378137, rf:298.25, ellipseName:"Appl. Physics. 1965"}, - "NWL9D": {a:6378145.0, rf:298.25, ellipseName:"Naval Weapons Lab., 1965"}, - "mod_airy": {a:6377340.189, b:6356034.446, ellipseName:"Modified Airy"}, - "andrae": {a:6377104.43, rf:300.0, ellipseName:"Andrae 1876 (Den., Iclnd.)"}, - "aust_SA": {a:6378160.0, rf:298.25, ellipseName:"Australian Natl & S. Amer. 1969"}, - "GRS67": {a:6378160.0, rf:298.2471674270, ellipseName:"GRS 67(IUGG 1967)"}, - "bessel": {a:6377397.155, rf:299.1528128, ellipseName:"Bessel 1841"}, - "bess_nam": {a:6377483.865, rf:299.1528128, ellipseName:"Bessel 1841 (Namibia)"}, - "clrk66": {a:6378206.4, b:6356583.8, ellipseName:"Clarke 1866"}, - "clrk80": {a:6378249.145, rf:293.4663, ellipseName:"Clarke 1880 mod."}, - "CPM": {a:6375738.7, rf:334.29, ellipseName:"Comm. des Poids et Mesures 1799"}, - "delmbr": {a:6376428.0, rf:311.5, ellipseName:"Delambre 1810 (Belgium)"}, - "engelis": {a:6378136.05, rf:298.2566, ellipseName:"Engelis 1985"}, - "evrst30": {a:6377276.345, rf:300.8017, ellipseName:"Everest 1830"}, - "evrst48": {a:6377304.063, rf:300.8017, ellipseName:"Everest 1948"}, - "evrst56": {a:6377301.243, rf:300.8017, ellipseName:"Everest 1956"}, - "evrst69": {a:6377295.664, rf:300.8017, ellipseName:"Everest 1969"}, - "evrstSS": {a:6377298.556, rf:300.8017, ellipseName:"Everest (Sabah & Sarawak)"}, - "fschr60": {a:6378166.0, rf:298.3, ellipseName:"Fischer (Mercury Datum) 1960"}, - "fschr60m": {a:6378155.0, rf:298.3, ellipseName:"Fischer 1960"}, - "fschr68": {a:6378150.0, rf:298.3, ellipseName:"Fischer 1968"}, - "helmert": {a:6378200.0, rf:298.3, ellipseName:"Helmert 1906"}, - "hough": {a:6378270.0, rf:297.0, ellipseName:"Hough"}, - "intl": {a:6378388.0, rf:297.0, ellipseName:"International 1909 (Hayford)"}, - "kaula": {a:6378163.0, rf:298.24, ellipseName:"Kaula 1961"}, - "lerch": {a:6378139.0, rf:298.257, ellipseName:"Lerch 1979"}, - "mprts": {a:6397300.0, rf:191.0, ellipseName:"Maupertius 1738"}, - "new_intl": {a:6378157.5, b:6356772.2, ellipseName:"New International 1967"}, - "plessis": {a:6376523.0, rf:6355863.0, ellipseName:"Plessis 1817 (France)"}, - "krass": {a:6378245.0, rf:298.3, ellipseName:"Krassovsky, 1942"}, - "SEasia": {a:6378155.0, b:6356773.3205, ellipseName:"Southeast Asia"}, - "walbeck": {a:6376896.0, b:6355834.8467, ellipseName:"Walbeck"}, - "WGS60": {a:6378165.0, rf:298.3, ellipseName:"WGS 60"}, - "WGS66": {a:6378145.0, rf:298.25, ellipseName:"WGS 66"}, - "WGS72": {a:6378135.0, rf:298.26, ellipseName:"WGS 72"}, - "WGS84": {a:6378137.0, rf:298.257223563, ellipseName:"WGS 84"}, - "sphere": {a:6370997.0, b:6370997.0, ellipseName:"Normal Sphere (r=6370997)"} -}; - -Proj4js.Datum = { - "WGS84": {towgs84: "0,0,0", ellipse: "WGS84", datumName: "WGS84"}, - "GGRS87": {towgs84: "-199.87,74.79,246.62", ellipse: "GRS80", datumName: "Greek_Geodetic_Reference_System_1987"}, - "NAD83": {towgs84: "0,0,0", ellipse: "GRS80", datumName: "North_American_Datum_1983"}, - "NAD27": {nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", ellipse: "clrk66", datumName: "North_American_Datum_1927"}, - "potsdam": {towgs84: "606.0,23.0,413.0", ellipse: "bessel", datumName: "Potsdam Rauenberg 1950 DHDN"}, - "carthage": {towgs84: "-263.0,6.0,431.0", ellipse: "clark80", datumName: "Carthage 1934 Tunisia"}, - "hermannskogel": {towgs84: "653.0,-212.0,449.0", ellipse: "bessel", datumName: "Hermannskogel"}, - "ire65": {towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", ellipse: "mod_airy", datumName: "Ireland 1965"}, - "nzgd49": {towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", ellipse: "intl", datumName: "New Zealand Geodetic Datum 1949"}, - "OSGB36": {towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", ellipse: "airy", datumName: "Airy 1830"} -}; - -Proj4js.WGS84 = new Proj4js.Proj('WGS84'); -Proj4js.Datum['OSB36'] = Proj4js.Datum['OSGB36']; //as returned from spatialreference.org -/* ====================================================================== - projCode/aea.js - ====================================================================== */ - -/******************************************************************************* -NAME ALBERS CONICAL EQUAL AREA - -PURPOSE: Transforms input longitude and latitude to Easting and Northing - for the Albers Conical Equal Area projection. The longitude - and latitude must be in radians. The Easting and Northing - values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -T. Mittan, Feb, 1992 - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government - Printing Office, Washington D.C., 1989. -*******************************************************************************/ - - -Proj4js.Proj.aea = { - init : function() { - - if (Math.abs(this.lat1 + this.lat2) < Proj4js.common.EPSLN) { - Proj4js.reportError("aeaInitEqualLatitudes"); - return; - } - this.temp = this.b / this.a; - this.es = 1.0 - Math.pow(this.temp,2); - this.e3 = Math.sqrt(this.es); - - this.sin_po=Math.sin(this.lat1); - this.cos_po=Math.cos(this.lat1); - this.t1=this.sin_po; - this.con = this.sin_po; - this.ms1 = Proj4js.common.msfnz(this.e3,this.sin_po,this.cos_po); - this.qs1 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po); - - this.sin_po=Math.sin(this.lat2); - this.cos_po=Math.cos(this.lat2); - this.t2=this.sin_po; - this.ms2 = Proj4js.common.msfnz(this.e3,this.sin_po,this.cos_po); - this.qs2 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po); - - this.sin_po=Math.sin(this.lat0); - this.cos_po=Math.cos(this.lat0); - this.t3=this.sin_po; - this.qs0 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po); - - if (Math.abs(this.lat1 - this.lat2) > Proj4js.common.EPSLN) { - this.ns0 = (this.ms1 * this.ms1 - this.ms2 *this.ms2)/ (this.qs2 - this.qs1); - } else { - this.ns0 = this.con; - } - this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1; - this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0)/this.ns0; - }, - -/* Albers Conical Equal Area forward equations--mapping lat,long to x,y - -------------------------------------------------------------------*/ - forward: function(p){ - - var lon=p.x; - var lat=p.y; - - this.sin_phi=Math.sin(lat); - this.cos_phi=Math.cos(lat); - - var qs = Proj4js.common.qsfnz(this.e3,this.sin_phi,this.cos_phi); - var rh1 =this.a * Math.sqrt(this.c - this.ns0 * qs)/this.ns0; - var theta = this.ns0 * Proj4js.common.adjust_lon(lon - this.long0); - var x = rh1 * Math.sin(theta) + this.x0; - var y = this.rh - rh1 * Math.cos(theta) + this.y0; - - p.x = x; - p.y = y; - return p; - }, - - - inverse: function(p) { - var rh1,qs,con,theta,lon,lat; - - p.x -= this.x0; - p.y = this.rh - p.y + this.y0; - if (this.ns0 >= 0) { - rh1 = Math.sqrt(p.x *p.x + p.y * p.y); - con = 1.0; - } else { - rh1 = -Math.sqrt(p.x * p.x + p.y *p.y); - con = -1.0; - } - theta = 0.0; - if (rh1 != 0.0) { - theta = Math.atan2(con * p.x, con * p.y); - } - con = rh1 * this.ns0 / this.a; - qs = (this.c - con * con) / this.ns0; - if (this.e3 >= 1e-10) { - con = 1 - .5 * (1.0 -this.es) * Math.log((1.0 - this.e3) / (1.0 + this.e3))/this.e3; - if (Math.abs(Math.abs(con) - Math.abs(qs)) > .0000000001 ) { - lat = this.phi1z(this.e3,qs); - } else { - if (qs >= 0) { - lat = .5 * PI; - } else { - lat = -.5 * PI; - } - } - } else { - lat = this.phi1z(e3,qs); - } - - lon = Proj4js.common.adjust_lon(theta/this.ns0 + this.long0); - p.x = lon; - p.y = lat; - return p; - }, - -/* Function to compute phi1, the latitude for the inverse of the - Albers Conical Equal-Area projection. --------------------------------------------*/ - phi1z: function (eccent,qs) { - var con, com, dphi; - var phi = Proj4js.common.asinz(.5 * qs); - if (eccent < Proj4js.common.EPSLN) return phi; - - var eccnts = eccent * eccent; - for (var i = 1; i <= 25; i++) { - sinphi = Math.sin(phi); - cosphi = Math.cos(phi); - con = eccent * sinphi; - com = 1.0 - con * con; - dphi = .5 * com * com / cosphi * (qs / (1.0 - eccnts) - sinphi / com + .5 / eccent * Math.log((1.0 - con) / (1.0 + con))); - phi = phi + dphi; - if (Math.abs(dphi) <= 1e-7) return phi; - } - Proj4js.reportError("aea:phi1z:Convergence error"); - return null; - } - -}; - - - -/* ====================================================================== - projCode/sterea.js - ====================================================================== */ - - -Proj4js.Proj.sterea = { - dependsOn : 'gauss', - - init : function() { - Proj4js.Proj['gauss'].init.apply(this); - if (!this.rc) { - Proj4js.reportError("sterea:init:E_ERROR_0"); - return; - } - this.sinc0 = Math.sin(this.phic0); - this.cosc0 = Math.cos(this.phic0); - this.R2 = 2.0 * this.rc; - if (!this.title) this.title = "Oblique Stereographic Alternative"; - }, - - forward : function(p) { - p.x = Proj4js.common.adjust_lon(p.x-this.long0); /* adjust del longitude */ - Proj4js.Proj['gauss'].forward.apply(this, [p]); - sinc = Math.sin(p.y); - cosc = Math.cos(p.y); - cosl = Math.cos(p.x); - k = this.k0 * this.R2 / (1.0 + this.sinc0 * sinc + this.cosc0 * cosc * cosl); - p.x = k * cosc * Math.sin(p.x); - p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl); - p.x = this.a * p.x + this.x0; - p.y = this.a * p.y + this.y0; - return p; - }, - - inverse : function(p) { - var lon,lat; - p.x = (p.x - this.x0) / this.a; /* descale and de-offset */ - p.y = (p.y - this.y0) / this.a; - - p.x /= this.k0; - p.y /= this.k0; - if ( (rho = Math.sqrt(p.x*p.x + p.y*p.y)) ) { - c = 2.0 * Math.atan2(rho, this.R2); - sinc = Math.sin(c); - cosc = Math.cos(c); - lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho); - lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc); - } else { - lat = this.phic0; - lon = 0.; - } - - p.x = lon; - p.y = lat; - Proj4js.Proj['gauss'].inverse.apply(this,[p]); - p.x = Proj4js.common.adjust_lon(p.x + this.long0); /* adjust longitude to CM */ - return p; - } -}; - -/* ====================================================================== - projCode/poly.js - ====================================================================== */ - -/* Function to compute, phi4, the latitude for the inverse of the - Polyconic projection. -------------------------------------------------------------*/ -function phi4z (eccent,e0,e1,e2,e3,a,b,c,phi) { - var sinphi, sin2ph, tanph, ml, mlp, con1, con2, con3, dphi, i; - - phi = a; - for (i = 1; i <= 15; i++) { - sinphi = Math.sin(phi); - tanphi = Math.tan(phi); - c = tanphi * Math.sqrt (1.0 - eccent * sinphi * sinphi); - sin2ph = Math.sin (2.0 * phi); - /* - ml = e0 * *phi - e1 * sin2ph + e2 * sin (4.0 * *phi); - mlp = e0 - 2.0 * e1 * cos (2.0 * *phi) + 4.0 * e2 * cos (4.0 * *phi); - */ - ml = e0 * phi - e1 * sin2ph + e2 * Math.sin (4.0 * phi) - e3 * Math.sin (6.0 * phi); - mlp = e0 - 2.0 * e1 * Math.cos (2.0 * phi) + 4.0 * e2 * Math.cos (4.0 * phi) - 6.0 * e3 * Math.cos (6.0 * phi); - con1 = 2.0 * ml + c * (ml * ml + b) - 2.0 * a * (c * ml + 1.0); - con2 = eccent * sin2ph * (ml * ml + b - 2.0 * a * ml) / (2.0 *c); - con3 = 2.0 * (a - ml) * (c * mlp - 2.0 / sin2ph) - 2.0 * mlp; - dphi = con1 / (con2 + con3); - phi += dphi; - if (Math.abs(dphi) <= .0000000001 ) return(phi); - } - Proj4js.reportError("phi4z: No convergence"); - return null; -} - - -/* Function to compute the constant e4 from the input of the eccentricity - of the spheroid, x. This constant is used in the Polar Stereographic - projection. ---------------------------------------------------------------------*/ -function e4fn(x) { - var con, com; - con = 1.0 + x; - com = 1.0 - x; - return (Math.sqrt((Math.pow(con,con))*(Math.pow(com,com)))); -} - - - - - -/******************************************************************************* -NAME POLYCONIC - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Polyconic projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -T. Mittan Mar, 1993 - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government - Printing Office, Washington D.C., 1989. -*******************************************************************************/ - -Proj4js.Proj.poly = { - - /* Initialize the POLYCONIC projection - ----------------------------------*/ - init: function() { - var temp; /* temporary variable */ - if (this.lat0=0) this.lat0=90;//this.lat0 ca - - /* Place parameters in static storage for common use - -------------------------------------------------*/ - this.temp = this.b / this.a; - this.es = 1.0 - Math.pow(this.temp,2);// devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles - this.e = Math.sqrt(this.es); - this.e0 = Proj4js.common.e0fn(this.es); - this.e1 = Proj4js.common.e1fn(this.es); - this.e2 = Proj4js.common.e2fn(this.es); - this.e3 = Proj4js.common.e3fn(this.es); - this.ml0 = Proj4js.common.mlfn(this.e0, this.e1,this.e2, this.e3, this.lat0);//si que des zeros le calcul ne se fait pas - //if (!this.ml0) {this.ml0=0;} - }, - - - /* Polyconic forward equations--mapping lat,long to x,y - ---------------------------------------------------*/ - forward: function(p) { - var sinphi, cosphi; /* sin and cos value */ - var al; /* temporary values */ - var c; /* temporary values */ - var con, ml; /* cone constant, small m */ - var ms; /* small m */ - var x,y; - - var lon=p.x; - var lat=p.y; - - con = Proj4js.common.adjust_lon(lon - this.long0); - if (Math.abs(lat) <= .0000001) { - x = this.x0 + this.a * con; - y = this.y0 - this.a * this.ml0; - } else { - sinphi = Math.sin(lat); - cosphi = Math.cos(lat); - - ml = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat); - ms = Proj4js.common.msfnz(this.e,sinphi,cosphi); - con = sinphi; - x = this.x0 + this.a * ms * Math.sin(con)/sinphi; - y = this.y0 + this.a * (ml - this.ml0 + ms * (1.0 - Math.cos(con))/sinphi); - } - - p.x=x; - p.y=y; - return p; - }, - - - /* Inverse equations - -----------------*/ - inverse: function(p) { - var sin_phi, cos_phi; /* sin and cos value */ - var al; /* temporary values */ - var b; /* temporary values */ - var c; /* temporary values */ - var con, ml; /* cone constant, small m */ - var iflg; /* error flag */ - var lon,lat; - p.x -= this.x0; - p.y -= this.y0; - al = this.ml0 + p.y/this.a; - iflg = 0; - - if (Math.abs(al) <= .0000001) { - lon = p.x/this.a + this.long0; - lat = 0.0; - } else { - b = al * al + (p.x/this.a) * (p.x/this.a); - iflg = phi4z(this.es,this.e0,this.e1,this.e2,this.e3,this.al,b,c,lat); - if (iflg != 1) return(iflg); - lon = Proj4js.common.adjust_lon((Proj4js.common.asinz(p.x * c / this.a) / Math.sin(lat)) + this.long0); - } - - p.x=lon; - p.y=lat; - return p; - } -}; - - - -/* ====================================================================== - projCode/equi.js - ====================================================================== */ - -/******************************************************************************* -NAME EQUIRECTANGULAR - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Equirectangular projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -T. Mittan Mar, 1993 - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government - Printing Office, Washington D.C., 1989. -*******************************************************************************/ -Proj4js.Proj.equi = { - - init: function() { - if(!this.x0) this.x0=0; - if(!this.y0) this.y0=0; - if(!this.lat0) this.lat0=0; - if(!this.long0) this.long0=0; - ///this.t2; - }, - - - -/* Equirectangular forward equations--mapping lat,long to x,y - ---------------------------------------------------------*/ - forward: function(p) { - - var lon=p.x; - var lat=p.y; - - var dlon = Proj4js.common.adjust_lon(lon - this.long0); - var x = this.x0 +this. a * dlon *Math.cos(this.lat0); - var y = this.y0 + this.a * lat; - - this.t1=x; - this.t2=Math.cos(this.lat0); - p.x=x; - p.y=y; - return p; - }, //equiFwd() - - - -/* Equirectangular inverse equations--mapping x,y to lat/long - ---------------------------------------------------------*/ - inverse: function(p) { - - p.x -= this.x0; - p.y -= this.y0; - var lat = p.y /this. a; - - if ( Math.abs(lat) > Proj4js.common.HALF_PI) { - Proj4js.reportError("equi:Inv:DataError"); - } - var lon = Proj4js.common.adjust_lon(this.long0 + p.x / (this.a * Math.cos(this.lat0))); - p.x=lon; - p.y=lat; - }//equiInv() -}; - - -/* ====================================================================== - projCode/merc.js - ====================================================================== */ - -/******************************************************************************* -NAME MERCATOR - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Mercator projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -D. Steinwand, EROS Nov, 1991 -T. Mittan Mar, 1993 - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government - Printing Office, Washington D.C., 1989. -*******************************************************************************/ - -//static double r_major = a; /* major axis */ -//static double r_minor = b; /* minor axis */ -//static double lon_center = long0; /* Center longitude (projection center) */ -//static double lat_origin = lat0; /* center latitude */ -//static double e,es; /* eccentricity constants */ -//static double m1; /* small value m */ -//static double false_northing = y0; /* y offset in meters */ -//static double false_easting = x0; /* x offset in meters */ -//scale_fact = k0 - -Proj4js.Proj.merc = { - init : function() { - //?this.temp = this.r_minor / this.r_major; - //this.temp = this.b / this.a; - //this.es = 1.0 - Math.sqrt(this.temp); - //this.e = Math.sqrt( this.es ); - //?this.m1 = Math.cos(this.lat_origin) / (Math.sqrt( 1.0 - this.es * Math.sin(this.lat_origin) * Math.sin(this.lat_origin))); - //this.m1 = Math.cos(0.0) / (Math.sqrt( 1.0 - this.es * Math.sin(0.0) * Math.sin(0.0))); - if (this.lat_ts) { - if (this.sphere) { - this.k0 = Math.cos(this.lat_ts); - } else { - this.k0 = Proj4js.common.msfnz(this.es, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); - } - } - }, - -/* Mercator forward equations--mapping lat,long to x,y - --------------------------------------------------*/ - - forward : function(p) { - //alert("ll2m coords : "+coords); - var lon = p.x; - var lat = p.y; - // convert to radians - if ( lat*Proj4js.common.R2D > 90.0 && - lat*Proj4js.common.R2D < -90.0 && - lon*Proj4js.common.R2D > 180.0 && - lon*Proj4js.common.R2D < -180.0) { - Proj4js.reportError("merc:forward: llInputOutOfRange: "+ lon +" : " + lat); - return null; - } - - var x,y; - if(Math.abs( Math.abs(lat) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN) { - Proj4js.reportError("merc:forward: ll2mAtPoles"); - return null; - } else { - if (this.sphere) { - x = this.x0 + this.a * this.k0 * Proj4js.common.adjust_lon(lon - this.long0); - y = this.y0 + this.a * this.k0 * Math.log(Math.tan(Proj4js.common.FORTPI + 0.5*lat)); - } else { - var sinphi = Math.sin(lat); - var ts = Proj4js.common.tsfnz(this.e,lat,sinphi); - x = this.x0 + this.a * this.k0 * Proj4js.common.adjust_lon(lon - this.long0); - y = this.y0 - this.a * this.k0 * Math.log(ts); - } - p.x = x; - p.y = y; - return p; - } - }, - - - /* Mercator inverse equations--mapping x,y to lat/long - --------------------------------------------------*/ - inverse : function(p) { - - var x = p.x - this.x0; - var y = p.y - this.y0; - var lon,lat; - - if (this.sphere) { - lat = Proj4js.common.HALF_PI - 2.0 * Math.atan(Math.exp(-y / this.a * this.k0)); - } else { - var ts = Math.exp(-y / (this.a * this.k0)); - lat = Proj4js.common.phi2z(this.e,ts); - if(lat == -9999) { - Proj4js.reportError("merc:inverse: lat = -9999"); - return null; - } - } - lon = Proj4js.common.adjust_lon(this.long0+ x / (this.a * this.k0)); - - p.x = lon; - p.y = lat; - return p; - } -}; - - -/* ====================================================================== - projCode/utm.js - ====================================================================== */ - -/******************************************************************************* -NAME TRANSVERSE MERCATOR - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Transverse Mercator projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government - Printing Office, Washington D.C., 1989. -*******************************************************************************/ - - -/** - Initialize Transverse Mercator projection -*/ - -Proj4js.Proj.utm = { - dependsOn : 'tmerc', - - init : function() { - if (!this.zone) { - Proj4js.reportError("utm:init: zone must be specified for UTM"); - return; - } - this.lat0 = 0.0; - this.long0 = ((6 * Math.abs(this.zone)) - 183) * Proj4js.common.D2R; - this.x0 = 500000.0; - this.y0 = this.utmSouth ? 10000000.0 : 0.0; - this.k0 = 0.9996; - - Proj4js.Proj['tmerc'].init.apply(this); - this.forward = Proj4js.Proj['tmerc'].forward; - this.inverse = Proj4js.Proj['tmerc'].inverse; - } -}; -/* ====================================================================== - projCode/eqdc.js - ====================================================================== */ - -/******************************************************************************* -NAME EQUIDISTANT CONIC - -PURPOSE: Transforms input longitude and latitude to Easting and Northing - for the Equidistant Conic projection. The longitude and - latitude must be in radians. The Easting and Northing values - will be returned in meters. - -PROGRAMMER DATE ----------- ---- -T. Mittan Mar, 1993 - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government - Printing Office, Washington D.C., 1989. -*******************************************************************************/ - -/* Variables common to all subroutines in this code file - -----------------------------------------------------*/ - -Proj4js.Proj.eqdc = { - -/* Initialize the Equidistant Conic projection - ------------------------------------------*/ - init: function() { - - /* Place parameters in static storage for common use - -------------------------------------------------*/ - - if(!this.mode) this.mode=0;//chosen default mode - this.temp = this.b / this.a; - this.es = 1.0 - Math.pow(this.temp,2); - this.e = Math.sqrt(this.es); - this.e0 = Proj4js.common.e0fn(this.es); - this.e1 = Proj4js.common.e1fn(this.es); - this.e2 = Proj4js.common.e2fn(this.es); - this.e3 = Proj4js.common.e3fn(this.es); - - this.sinphi=Math.sin(this.lat1); - this.cosphi=Math.cos(this.lat1); - - this.ms1 = Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi); - this.ml1 = Proj4js.common.mlfn(this.e0, this.e1, this.e2,this.e3, this.lat1); - - /* format B - ---------*/ - if (this.mode != 0) { - if (Math.abs(this.lat1 + this.lat2) < Proj4js.common.EPSLN) { - Proj4js.reportError("eqdc:Init:EqualLatitudes"); - //return(81); - } - this.sinphi=Math.sin(this.lat2); - this.cosphi=Math.cos(this.lat2); - - this.ms2 = Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi); - this.ml2 = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2); - if (Math.abs(this.lat1 - this.lat2) >= Proj4js.common.EPSLN) { - this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1); - } else { - this.ns = this.sinphi; - } - } else { - this.ns = this.sinphi; - } - this.g = this.ml1 + this.ms1/this.ns; - this.ml0 = Proj4js.common.mlfn(this.e0, this.e1,this. e2, this.e3, this.lat0); - this.rh = this.a * (this.g - this.ml0); - }, - - -/* Equidistant Conic forward equations--mapping lat,long to x,y - -----------------------------------------------------------*/ - forward: function(p) { - var lon=p.x; - var lat=p.y; - - /* Forward equations - -----------------*/ - var ml = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat); - var rh1 = this.a * (this.g - ml); - var theta = this.ns * Proj4js.common.adjust_lon(lon - this.long0); - - var x = this.x0 + rh1 * Math.sin(theta); - var y = this.y0 + this.rh - rh1 * Math.cos(theta); - p.x=x; - p.y=y; - return p; - }, - -/* Inverse equations - -----------------*/ - inverse: function(p) { - p.x -= this.x0; - p.y = this.rh - p.y + this.y0; - var con, rh1; - if (this.ns >= 0) { - var rh1 = Math.sqrt(p.x *p.x + p.y * p.y); - var con = 1.0; - } else { - rh1 = -Math.sqrt(p.x *p. x +p. y * p.y); - con = -1.0; - } - var theta = 0.0; - if (rh1 != 0.0) theta = Math.atan2(con *p.x, con *p.y); - var ml = this.g - rh1 /this.a; - var lat = this.phi3z(this.ml,this.e0,this.e1,this.e2,this.e3); - var lon = Proj4js.common.adjust_lon(this.long0 + theta / this.ns); - - p.x=lon; - p.y=lat; - return p; - }, - -/* Function to compute latitude, phi3, for the inverse of the Equidistant - Conic projection. ------------------------------------------------------------------*/ - phi3z: function(ml,e0,e1,e2,e3) { - var phi; - var dphi; - - phi = ml; - for (var i = 0; i < 15; i++) { - dphi = (ml + e1 * Math.sin(2.0 * phi) - e2 * Math.sin(4.0 * phi) + e3 * Math.sin(6.0 * phi))/ e0 - phi; - phi += dphi; - if (Math.abs(dphi) <= .0000000001) { - return phi; - } - } - Proj4js.reportError("PHI3Z-CONV:Latitude failed to converge after 15 iterations"); - return null; - } - - -}; -/* ====================================================================== - projCode/tmerc.js - ====================================================================== */ - -/******************************************************************************* -NAME TRANSVERSE MERCATOR - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Transverse Mercator projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government - Printing Office, Washington D.C., 1989. -*******************************************************************************/ - - -/** - Initialize Transverse Mercator projection -*/ - -Proj4js.Proj.tmerc = { - init : function() { - this.e0 = Proj4js.common.e0fn(this.es); - this.e1 = Proj4js.common.e1fn(this.es); - this.e2 = Proj4js.common.e2fn(this.es); - this.e3 = Proj4js.common.e3fn(this.es); - this.ml0 = this.a * Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); - }, - - /** - Transverse Mercator Forward - long/lat to x/y - long/lat in radians - */ - forward : function(p) { - var lon = p.x; - var lat = p.y; - - var delta_lon = Proj4js.common.adjust_lon(lon - this.long0); // Delta longitude - var con; // cone constant - var x, y; - var sin_phi=Math.sin(lat); - var cos_phi=Math.cos(lat); - - if (this.sphere) { /* spherical form */ - var b = cos_phi * Math.sin(delta_lon); - if ((Math.abs(Math.abs(b) - 1.0)) < .0000000001) { - Proj4js.reportError("tmerc:forward: Point projects into infinity"); - return(93); - } else { - x = .5 * this.a * this.k0 * Math.log((1.0 + b)/(1.0 - b)); - con = Math.acos(cos_phi * Math.cos(delta_lon)/Math.sqrt(1.0 - b*b)); - if (lat < 0) con = - con; - y = this.a * this.k0 * (con - this.lat0); - } - } else { - var al = cos_phi * delta_lon; - var als = Math.pow(al,2); - var c = this.ep2 * Math.pow(cos_phi,2); - var tq = Math.tan(lat); - var t = Math.pow(tq,2); - con = 1.0 - this.es * Math.pow(sin_phi,2); - var n = this.a / Math.sqrt(con); - var ml = this.a * Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat); - - x = this.k0 * n * al * (1.0 + als / 6.0 * (1.0 - t + c + als / 20.0 * (5.0 - 18.0 * t + Math.pow(t,2) + 72.0 * c - 58.0 * this.ep2))) + this.x0; - y = this.k0 * (ml - this.ml0 + n * tq * (als * (0.5 + als / 24.0 * (5.0 - t + 9.0 * c + 4.0 * Math.pow(c,2) + als / 30.0 * (61.0 - 58.0 * t + Math.pow(t,2) + 600.0 * c - 330.0 * this.ep2))))) + this.y0; - - } - p.x = x; p.y = y; - return p; - }, // tmercFwd() - - /** - Transverse Mercator Inverse - x/y to long/lat - */ - inverse : function(p) { - var con, phi; /* temporary angles */ - var delta_phi; /* difference between longitudes */ - var i; - var max_iter = 6; /* maximun number of iterations */ - var lat, lon; - - if (this.sphere) { /* spherical form */ - var f = Math.exp(p.x/(this.a * this.k0)); - var g = .5 * (f - 1/f); - var temp = this.lat0 + p.y/(this.a * this.k0); - var h = Math.cos(temp); - con = Math.sqrt((1.0 - h * h)/(1.0 + g * g)); - lat = Proj4js.common.asinz(con); - if (temp < 0) - lat = -lat; - if ((g == 0) && (h == 0)) { - lon = this.long0; - } else { - lon = Proj4js.common.adjust_lon(Math.atan2(g,h) + this.long0); - } - } else { // ellipsoidal form - var x = p.x - this.x0; - var y = p.y - this.y0; - - con = (this.ml0 + y / this.k0) / this.a; - phi = con; - for (i=0;true;i++) { - delta_phi=((con + this.e1 * Math.sin(2.0*phi) - this.e2 * Math.sin(4.0*phi) + this.e3 * Math.sin(6.0*phi)) / this.e0) - phi; - phi += delta_phi; - if (Math.abs(delta_phi) <= Proj4js.common.EPSLN) break; - if (i >= max_iter) { - Proj4js.reportError("tmerc:inverse: Latitude failed to converge"); - return(95); - } - } // for() - if (Math.abs(phi) < Proj4js.common.HALF_PI) { - // sincos(phi, &sin_phi, &cos_phi); - var sin_phi=Math.sin(phi); - var cos_phi=Math.cos(phi); - var tan_phi = Math.tan(phi); - var c = this.ep2 * Math.pow(cos_phi,2); - var cs = Math.pow(c,2); - var t = Math.pow(tan_phi,2); - var ts = Math.pow(t,2); - con = 1.0 - this.es * Math.pow(sin_phi,2); - var n = this.a / Math.sqrt(con); - var r = n * (1.0 - this.es) / con; - var d = x / (n * this.k0); - var ds = Math.pow(d,2); - lat = phi - (n * tan_phi * ds / r) * (0.5 - ds / 24.0 * (5.0 + 3.0 * t + 10.0 * c - 4.0 * cs - 9.0 * this.ep2 - ds / 30.0 * (61.0 + 90.0 * t + 298.0 * c + 45.0 * ts - 252.0 * this.ep2 - 3.0 * cs))); - lon = Proj4js.common.adjust_lon(this.long0 + (d * (1.0 - ds / 6.0 * (1.0 + 2.0 * t + c - ds / 20.0 * (5.0 - 2.0 * c + 28.0 * t - 3.0 * cs + 8.0 * this.ep2 + 24.0 * ts))) / cos_phi)); - } else { - lat = Proj4js.common.HALF_PI * Proj4js.common.sign(y); - lon = this.long0; - } - } - p.x = lon; - p.y = lat; - return p; - } // tmercInv() -}; -/* ====================================================================== - defs/GOOGLE.js - ====================================================================== */ - -Proj4js.defs["GOOGLE"]="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"; -Proj4js.defs["EPSG:900913"]=Proj4js.defs["GOOGLE"]; -/* ====================================================================== - projCode/gstmerc.js - ====================================================================== */ - -Proj4js.Proj.gstmerc = { - init : function() { - - // array of: a, b, lon0, lat0, k0, x0, y0 - var temp= this.b / this.a; - this.e= Math.sqrt(1.0 - temp*temp); - this.lc= this.long0; - this.rs= Math.sqrt(1.0+this.e*this.e*Math.pow(Math.cos(this.lat0),4.0)/(1.0-this.e*this.e)); - var sinz= Math.sin(this.lat0); - var pc= Math.asin(sinz/this.rs); - var sinzpc= Math.sin(pc); - this.cp= Proj4js.common.latiso(0.0,pc,sinzpc)-this.rs*Proj4js.common.latiso(this.e,this.lat0,sinz); - this.n2= this.k0*this.a*Math.sqrt(1.0-this.e*this.e)/(1.0-this.e*this.e*sinz*sinz); - this.xs= this.x0; - this.ys= this.y0-this.n2*pc; - - if (!this.title) this.title = "Gauss Schreiber transverse mercator"; - }, - - - // forward equations--mapping lat,long to x,y - // ----------------------------------------------------------------- - forward : function(p) { - - var lon= p.x; - var lat= p.y; - - var L= this.rs*(lon-this.lc); - var Ls= this.cp+(this.rs*Proj4js.common.latiso(this.e,lat,Math.sin(lat))); - var lat1= Math.asin(Math.sin(L)/Proj4js.common.cosh(Ls)); - var Ls1= Proj4js.common.latiso(0.0,lat1,Math.sin(lat1)); - p.x= this.xs+(this.n2*Ls1); - p.y= this.ys+(this.n2*Math.atan(Proj4js.common.sinh(Ls)/Math.cos(L))); - return p; - }, - - // inverse equations--mapping x,y to lat/long - // ----------------------------------------------------------------- - inverse : function(p) { - - var x= p.x; - var y= p.y; - - var L= Math.atan(Proj4js.common.sinh((x-this.xs)/this.n2)/Math.cos((y-this.ys)/this.n2)); - var lat1= Math.asin(Math.sin((y-this.ys)/this.n2)/Proj4js.common.cosh((x-this.xs)/this.n2)); - var LC= Proj4js.common.latiso(0.0,lat1,Math.sin(lat1)); - p.x= this.lc+L/this.rs; - p.y= Proj4js.common.invlatiso(this.e,(LC-this.cp)/this.rs); - return p; - } - -}; -/* ====================================================================== - projCode/ortho.js - ====================================================================== */ - -/******************************************************************************* -NAME ORTHOGRAPHIC - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Orthographic projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -T. Mittan Mar, 1993 - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government - Printing Office, Washington D.C., 1989. -*******************************************************************************/ - -Proj4js.Proj.ortho = { - - /* Initialize the Orthographic projection - -------------------------------------*/ - init: function(def) { - //double temp; /* temporary variable */ - - /* Place parameters in static storage for common use - -------------------------------------------------*/; - this.sin_p14=Math.sin(this.lat0); - this.cos_p14=Math.cos(this.lat0); - }, - - - /* Orthographic forward equations--mapping lat,long to x,y - ---------------------------------------------------*/ - forward: function(p) { - var sinphi, cosphi; /* sin and cos value */ - var dlon; /* delta longitude value */ - var coslon; /* cos of longitude */ - var ksp; /* scale factor */ - var g; - var lon=p.x; - var lat=p.y; - /* Forward equations - -----------------*/ - dlon = Proj4js.common.adjust_lon(lon - this.long0); - - sinphi=Math.sin(lat); - cosphi=Math.cos(lat); - - coslon = Math.cos(dlon); - g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; - ksp = 1.0; - if ((g > 0) || (Math.abs(g) <= Proj4js.common.EPSLN)) { - var x = this.a * ksp * cosphi * Math.sin(dlon); - var y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); - } else { - Proj4js.reportError("orthoFwdPointError"); - } - p.x=x; - p.y=y; - return p; - }, - - - inverse: function(p) { - var rh; /* height above ellipsoid */ - var z; /* angle */ - var sinz,cosz; /* sin of z and cos of z */ - var temp; - var con; - var lon , lat; - /* Inverse equations - -----------------*/ - p.x -= this.x0; - p.y -= this.y0; - rh = Math.sqrt(p.x * p.x + p.y * p.y); - if (rh > this.a + .0000001) { - Proj4js.reportError("orthoInvDataError"); - } - z = Proj4js.common.asinz(rh / this.a); - - sinz=Math.sin(z); - cosz=Math.cos(z); - - lon = this.long0; - if (Math.abs(rh) <= Proj4js.common.EPSLN) { - lat = this.lat0; - } - lat = Proj4js.common.asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14)/rh); - con = Math.abs(lat0) - Proj4js.common.HALF_PI; - if (Math.abs(con) <= Proj4js.common.EPSLN) { - if (this.lat0 >= 0) { - lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x, -p.y)); - } else { - lon = Proj4js.common.adjust_lon(this.long0 -Math.atan2(-p.x, p.y)); - } - } - con = cosz - this.sin_p14 * Math.sin(lat); - if ((Math.abs(con) >= Proj4js.common.EPSLN) || (Math.abs(x) >= Proj4js.common.EPSLN)) { - lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p14), (con * rh))); - } - p.x=lon; - p.y=lat; - return p; - } -}; - - -/* ====================================================================== - projCode/somerc.js - ====================================================================== */ - -/******************************************************************************* -NAME SWISS OBLIQUE MERCATOR - -PURPOSE: Swiss projection. -WARNING: X and Y are inverted (weird) in the swiss coordinate system. Not - here, since we want X to be horizontal and Y vertical. - -ALGORITHM REFERENCES -1. "Formules et constantes pour le Calcul pour la - projection cylindrique conforme à axe oblique et pour la transformation entre - des systèmes de référence". - http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf - -*******************************************************************************/ - -Proj4js.Proj.somerc = { - - init: function() { - var phy0 = this.lat0; - this.lambda0 = this.long0; - var sinPhy0 = Math.sin(phy0); - var semiMajorAxis = this.a; - var invF = this.rf; - var flattening = 1 / invF; - var e2 = 2 * flattening - Math.pow(flattening, 2); - var e = this.e = Math.sqrt(e2); - this.R = semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2.0)); - this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4.0)); - this.b0 = Math.asin(sinPhy0 / this.alpha); - this.K = Math.log(Math.tan(Math.PI / 4.0 + this.b0 / 2.0)) - - this.alpha - * Math.log(Math.tan(Math.PI / 4.0 + phy0 / 2.0)) - + this.alpha - * e / 2 - * Math.log((1 + e * sinPhy0) - / (1 - e * sinPhy0)); - }, - - - forward: function(p) { - var Sa1 = Math.log(Math.tan(Math.PI / 4.0 - p.y / 2.0)); - var Sa2 = this.e / 2.0 - * Math.log((1 + this.e * Math.sin(p.y)) - / (1 - this.e * Math.sin(p.y))); - var S = -this.alpha * (Sa1 + Sa2) + this.K; - - // spheric latitude - var b = 2.0 * (Math.atan(Math.exp(S)) - Math.PI / 4.0); - - // spheric longitude - var I = this.alpha * (p.x - this.lambda0); - - // psoeudo equatorial rotation - var rotI = Math.atan(Math.sin(I) - / (Math.sin(this.b0) * Math.tan(b) + - Math.cos(this.b0) * Math.cos(I))); - - var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - - Math.sin(this.b0) * Math.cos(b) * Math.cos(I)); - - p.y = this.R / 2.0 - * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) - + this.y0; - p.x = this.R * rotI + this.x0; - return p; - }, - - inverse: function(p) { - var Y = p.x - this.x0; - var X = p.y - this.y0; - - var rotI = Y / this.R; - var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4.0); - - var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) - + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI)); - var I = Math.atan(Math.sin(rotI) - / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) - * Math.tan(rotB))); - - var lambda = this.lambda0 + I / this.alpha; - - var S = 0.0; - var phy = b; - var prevPhy = -1000.0; - var iteration = 0; - while (Math.abs(phy - prevPhy) > 0.0000001) - { - if (++iteration > 20) - { - Proj4js.reportError("omercFwdInfinity"); - return; - } - //S = Math.log(Math.tan(Math.PI / 4.0 + phy / 2.0)); - S = 1.0 - / this.alpha - * (Math.log(Math.tan(Math.PI / 4.0 + b / 2.0)) - this.K) - + this.e - * Math.log(Math.tan(Math.PI / 4.0 - + Math.asin(this.e * Math.sin(phy)) - / 2.0)); - prevPhy = phy; - phy = 2.0 * Math.atan(Math.exp(S)) - Math.PI / 2.0; - } - - p.x = lambda; - p.y = phy; - return p; - } -}; -/* ====================================================================== - projCode/stere.js - ====================================================================== */ - - -// Initialize the Stereographic projection - -Proj4js.Proj.stere = { - ssfn_: function(phit, sinphi, eccen) { - sinphi *= eccen; - return (Math.tan (.5 * (Proj4js.common.HALF_PI + phit)) * Math.pow((1. - sinphi) / (1. + sinphi), .5 * eccen)); - }, - TOL: 1.e-8, - NITER: 8, - CONV: 1.e-10, - S_POLE: 0, - N_POLE: 1, - OBLIQ: 2, - EQUIT: 3, - - init : function() { - this.phits = this.lat_ts ? this.lat_ts : Proj4js.common.HALF_PI; - var t = Math.abs(this.lat0); - if ((Math.abs(t) - Proj4js.common.HALF_PI) < Proj4js.common.EPSLN) { - this.mode = this.lat0 < 0. ? this.S_POLE : this.N_POLE; - } else { - this.mode = t > Proj4js.common.EPSLN ? this.OBLIQ : this.EQUIT; - } - this.phits = Math.abs(this.phits); - if (this.es) { - var X; - - switch (this.mode) { - case this.N_POLE: - case this.S_POLE: - if (Math.abs(this.phits - Proj4js.common.HALF_PI) < Proj4js.common.EPSLN) { - this.akm1 = 2. * this.k0 / Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)); - } else { - t = Math.sin(this.phits); - this.akm1 = Math.cos(this.phits) / Proj4js.common.tsfnz(this.e, this.phits, t); - t *= this.e; - this.akm1 /= Math.sqrt(1. - t * t); - } - break; - case this.EQUIT: - this.akm1 = 2. * this.k0; - break; - case this.OBLIQ: - t = Math.sin(this.lat0); - X = 2. * Math.atan(this.ssfn_(this.lat0, t, this.e)) - Proj4js.common.HALF_PI; - t *= this.e; - this.akm1 = 2. * this.k0 * Math.cos(this.lat0) / Math.sqrt(1. - t * t); - this.sinX1 = Math.sin(X); - this.cosX1 = Math.cos(X); - break; - } - } else { - switch (this.mode) { - case this.OBLIQ: - this.sinph0 = Math.sin(this.lat0); - this.cosph0 = Math.cos(this.lat0); - case this.EQUIT: - this.akm1 = 2. * this.k0; - break; - case this.S_POLE: - case this.N_POLE: - this.akm1 = Math.abs(this.phits - Proj4js.common.HALF_PI) >= Proj4js.common.EPSLN ? - Math.cos(this.phits) / Math.tan(Proj4js.common.FORTPI - .5 * this.phits) : - 2. * this.k0 ; - break; - } - } - }, - -// Stereographic forward equations--mapping lat,long to x,y - forward: function(p) { - var lon = p.x; - lon = Proj4js.common.adjust_lon(lon - this.long0); - var lat = p.y; - var x, y; - - if (this.sphere) { - var sinphi, cosphi, coslam, sinlam; - - sinphi = Math.sin(lat); - cosphi = Math.cos(lat); - coslam = Math.cos(lon); - sinlam = Math.sin(lon); - switch (this.mode) { - case this.EQUIT: - y = 1. + cosphi * coslam; - if (y <= Proj4js.common.EPSLN) { - F_ERROR; - } - y = this.akm1 / y; - x = y * cosphi * sinlam; - y *= sinphi; - break; - case this.OBLIQ: - y = 1. + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; - if (y <= Proj4js.common.EPSLN) { - F_ERROR; - } - y = this.akm1 / y; - x = y * cosphi * sinlam; - y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; - break; - case this.N_POLE: - coslam = -coslam; - lat = -lat; - //Note no break here so it conitnues through S_POLE - case this.S_POLE: - if (Math.abs(lat - Proj4js.common.HALF_PI) < this.TOL) { - F_ERROR; - } - y = this.akm1 * Math.tan(Proj4js.common.FORTPI + .5 * lat); - x = sinlam * y; - y *= coslam; - break; - } - } else { - coslam = Math.cos(lon); - sinlam = Math.sin(lon); - sinphi = Math.sin(lat); - if (this.mode == this.OBLIQ || this.mode == this.EQUIT) { - X = 2. * Math.atan(this.ssfn_(lat, sinphi, this.e)); - sinX = Math.sin(X - Proj4js.common.HALF_PI); - cosX = Math.cos(X); - } - switch (this.mode) { - case this.OBLIQ: - A = this.akm1 / (this.cosX1 * (1. + this.sinX1 * sinX + this.cosX1 * cosX * coslam)); - y = A * (this.cosX1 * sinX - this.sinX1 * cosX * coslam); - x = A * cosX; - break; - case this.EQUIT: - A = 2. * this.akm1 / (1. + cosX * coslam); - y = A * sinX; - x = A * cosX; - break; - case this.S_POLE: - lat = -lat; - coslam = - coslam; - sinphi = -sinphi; - case this.N_POLE: - x = this.akm1 * Proj4js.common.tsfnz(this.e, lat, sinphi); - y = - x * coslam; - break; - } - x = x * sinlam; - } - p.x = x*this.a + this.x0; - p.y = y*this.a + this.y0; - return p; - }, - - -//* Stereographic inverse equations--mapping x,y to lat/long - inverse: function(p) { - var x = (p.x - this.x0)/this.a; /* descale and de-offset */ - var y = (p.y - this.y0)/this.a; - var lon, lat; - - var cosphi, sinphi, tp=0.0, phi_l=0.0, rho, halfe=0.0, pi2=0.0; - var i; - - if (this.sphere) { - var c, rh, sinc, cosc; - - rh = Math.sqrt(x*x + y*y); - c = 2. * Math.atan(rh / this.akm1); - sinc = Math.sin(c); - cosc = Math.cos(c); - lon = 0.; - switch (this.mode) { - case this.EQUIT: - if (Math.abs(rh) <= Proj4js.common.EPSLN) { - lat = 0.; - } else { - lat = Math.asin(y * sinc / rh); - } - if (cosc != 0. || x != 0.) lon = Math.atan2(x * sinc, cosc * rh); - break; - case this.OBLIQ: - if (Math.abs(rh) <= Proj4js.common.EPSLN) { - lat = this.phi0; - } else { - lat = Math.asin(cosc * sinph0 + y * sinc * cosph0 / rh); - } - c = cosc - sinph0 * Math.sin(lat); - if (c != 0. || x != 0.) { - lon = Math.atan2(x * sinc * cosph0, c * rh); - } - break; - case this.N_POLE: - y = -y; - case this.S_POLE: - if (Math.abs(rh) <= Proj4js.common.EPSLN) { - lat = this.phi0; - } else { - lat = Math.asin(this.mode == this.S_POLE ? -cosc : cosc); - } - lon = (x == 0. && y == 0.) ? 0. : Math.atan2(x, y); - break; - } - } else { - rho = Math.sqrt(x*x + y*y); - switch (this.mode) { - case this.OBLIQ: - case this.EQUIT: - tp = 2. * Math.atan2(rho * this.cosX1 , this.akm1); - cosphi = Math.cos(tp); - sinphi = Math.sin(tp); - if( rho == 0.0 ) { - phi_l = Math.asin(cosphi * this.sinX1); - } else { - phi_l = Math.asin(cosphi * this.sinX1 + (y * sinphi * this.cosX1 / rho)); - } - - tp = Math.tan(.5 * (Proj4js.common.HALF_PI + phi_l)); - x *= sinphi; - y = rho * this.cosX1 * cosphi - y * this.sinX1* sinphi; - pi2 = Proj4js.common.HALF_PI; - halfe = .5 * this.e; - break; - case this.N_POLE: - y = -y; - case this.S_POLE: - tp = - rho / this.akm1; - phi_l = Proj4js.common.HALF_PI - 2. * Math.atan(tp); - pi2 = -Proj4js.common.HALF_PI; - halfe = -.5 * this.e; - break; - } - for (i = this.NITER; i--; phi_l = lat) { //check this - sinphi = this.e * Math.sin(phi_l); - lat = 2. * Math.atan(tp * Math.pow((1.+sinphi)/(1.-sinphi), halfe)) - pi2; - if (Math.abs(phi_l - lat) < this.CONV) { - if (this.mode == this.S_POLE) lat = -lat; - lon = (x == 0. && y == 0.) ? 0. : Math.atan2(x, y); - p.x = Proj4js.common.adjust_lon(lon + this.long0); - p.y = lat; - return p; - } - } - } - } -}; -/* ====================================================================== - projCode/nzmg.js - ====================================================================== */ - -/******************************************************************************* -NAME NEW ZEALAND MAP GRID - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the New Zealand Map Grid projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - - -ALGORITHM REFERENCES - -1. Department of Land and Survey Technical Circular 1973/32 - http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf - -2. OSG Technical Report 4.1 - http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf - - -IMPLEMENTATION NOTES - -The two references use different symbols for the calculated values. This -implementation uses the variable names similar to the symbols in reference [1]. - -The alogrithm uses different units for delta latitude and delta longitude. -The delta latitude is assumed to be in units of seconds of arc x 10^-5. -The delta longitude is the usual radians. Look out for these conversions. - -The algorithm is described using complex arithmetic. There were three -options: - * find and use a Javascript library for complex arithmetic - * write my own complex library - * expand the complex arithmetic by hand to simple arithmetic - -This implementation has expanded the complex multiplication operations -into parallel simple arithmetic operations for the real and imaginary parts. -The imaginary part is way over to the right of the display; this probably -violates every coding standard in the world, but, to me, it makes it much -more obvious what is going on. - -The following complex operations are used: - - addition - - multiplication - - division - - complex number raised to integer power - - summation - -A summary of complex arithmetic operations: - (from http://en.wikipedia.org/wiki/Complex_arithmetic) - addition: (a + bi) + (c + di) = (a + c) + (b + d)i - subtraction: (a + bi) - (c + di) = (a - c) + (b - d)i - multiplication: (a + bi) x (c + di) = (ac - bd) + (bc + ad)i - division: (a + bi) / (c + di) = [(ac + bd)/(cc + dd)] + [(bc - ad)/(cc + dd)]i - -The algorithm needs to calculate summations of simple and complex numbers. This is -implemented using a for-loop, pre-loading the summed value to zero. - -The algorithm needs to calculate theta^2, theta^3, etc while doing a summation. -There are three possible implementations: - - use Math.pow in the summation loop - except for complex numbers - - precalculate the values before running the loop - - calculate theta^n = theta^(n-1) * theta during the loop -This implementation uses the third option for both real and complex arithmetic. - -For example - psi_n = 1; - sum = 0; - for (n = 1; n <=6; n++) { - psi_n1 = psi_n * psi; // calculate psi^(n+1) - psi_n = psi_n1; - sum = sum + A[n] * psi_n; - } - - -TEST VECTORS - -NZMG E, N: 2487100.638 6751049.719 metres -NZGD49 long, lat: 172.739194 -34.444066 degrees - -NZMG E, N: 2486533.395 6077263.661 metres -NZGD49 long, lat: 172.723106 -40.512409 degrees - -NZMG E, N: 2216746.425 5388508.765 metres -NZGD49 long, lat: 169.172062 -46.651295 degrees - -Note that these test vectors convert from NZMG metres to lat/long referenced -to NZGD49, not the more usual WGS84. The difference is about 70m N/S and about -10m E/W. - -These test vectors are provided in reference [1]. Many more test -vectors are available in - http://www.linz.govt.nz/docs/topography/topographicdata/placenamesdatabase/nznamesmar08.zip -which is a catalog of names on the 260-series maps. - - -EPSG CODES - -NZMG EPSG:27200 -NZGD49 EPSG:4272 - -http://spatialreference.org/ defines these as - Proj4js.defs["EPSG:4272"] = "+proj=longlat +ellps=intl +datum=nzgd49 +no_defs "; - Proj4js.defs["EPSG:27200"] = "+proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=intl +datum=nzgd49 +units=m +no_defs "; - - -LICENSE - Copyright: Stephen Irons 2008 - Released under terms of the LGPL as per: http://www.gnu.org/copyleft/lesser.html - -*******************************************************************************/ - - -/** - Initialize New Zealand Map Grip projection -*/ - -Proj4js.Proj.nzmg = { - - /** - * iterations: Number of iterations to refine inverse transform. - * 0 -> km accuracy - * 1 -> m accuracy -- suitable for most mapping applications - * 2 -> mm accuracy - */ - iterations: 1, - - init : function() { - this.A = new Array(); - this.A[1] = +0.6399175073; - this.A[2] = -0.1358797613; - this.A[3] = +0.063294409; - this.A[4] = -0.02526853; - this.A[5] = +0.0117879; - this.A[6] = -0.0055161; - this.A[7] = +0.0026906; - this.A[8] = -0.001333; - this.A[9] = +0.00067; - this.A[10] = -0.00034; - - this.B_re = new Array(); this.B_im = new Array(); - this.B_re[1] = +0.7557853228; this.B_im[1] = 0.0; - this.B_re[2] = +0.249204646; this.B_im[2] = +0.003371507; - this.B_re[3] = -0.001541739; this.B_im[3] = +0.041058560; - this.B_re[4] = -0.10162907; this.B_im[4] = +0.01727609; - this.B_re[5] = -0.26623489; this.B_im[5] = -0.36249218; - this.B_re[6] = -0.6870983; this.B_im[6] = -1.1651967; - - this.C_re = new Array(); this.C_im = new Array(); - this.C_re[1] = +1.3231270439; this.C_im[1] = 0.0; - this.C_re[2] = -0.577245789; this.C_im[2] = -0.007809598; - this.C_re[3] = +0.508307513; this.C_im[3] = -0.112208952; - this.C_re[4] = -0.15094762; this.C_im[4] = +0.18200602; - this.C_re[5] = +1.01418179; this.C_im[5] = +1.64497696; - this.C_re[6] = +1.9660549; this.C_im[6] = +2.5127645; - - this.D = new Array(); - this.D[1] = +1.5627014243; - this.D[2] = +0.5185406398; - this.D[3] = -0.03333098; - this.D[4] = -0.1052906; - this.D[5] = -0.0368594; - this.D[6] = +0.007317; - this.D[7] = +0.01220; - this.D[8] = +0.00394; - this.D[9] = -0.0013; - }, - - /** - New Zealand Map Grid Forward - long/lat to x/y - long/lat in radians - */ - forward : function(p) { - var lon = p.x; - var lat = p.y; - - var delta_lat = lat - this.lat0; - var delta_lon = lon - this.long0; - - // 1. Calculate d_phi and d_psi ... // and d_lambda - // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians. - var d_phi = delta_lat / Proj4js.common.SEC_TO_RAD * 1E-5; var d_lambda = delta_lon; - var d_phi_n = 1; // d_phi^0 - - var d_psi = 0; - for (n = 1; n <= 10; n++) { - d_phi_n = d_phi_n * d_phi; - d_psi = d_psi + this.A[n] * d_phi_n; - } - - // 2. Calculate theta - var th_re = d_psi; var th_im = d_lambda; - - // 3. Calculate z - var th_n_re = 1; var th_n_im = 0; // theta^0 - var th_n_re1; var th_n_im1; - - var z_re = 0; var z_im = 0; - for (n = 1; n <= 6; n++) { - th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im; - th_n_re = th_n_re1; th_n_im = th_n_im1; - z_re = z_re + this.B_re[n]*th_n_re - this.B_im[n]*th_n_im; z_im = z_im + this.B_im[n]*th_n_re + this.B_re[n]*th_n_im; - } - - // 4. Calculate easting and northing - x = (z_im * this.a) + this.x0; - y = (z_re * this.a) + this.y0; - - p.x = x; p.y = y; - - return p; - }, - - - /** - New Zealand Map Grid Inverse - x/y to long/lat - */ - inverse : function(p) { - - var x = p.x; - var y = p.y; - - var delta_x = x - this.x0; - var delta_y = y - this.y0; - - // 1. Calculate z - var z_re = delta_y / this.a; var z_im = delta_x / this.a; - - // 2a. Calculate theta - first approximation gives km accuracy - var z_n_re = 1; var z_n_im = 0; // z^0 - var z_n_re1; var z_n_im1; - - var th_re = 0; var th_im = 0; - for (n = 1; n <= 6; n++) { - z_n_re1 = z_n_re*z_re - z_n_im*z_im; z_n_im1 = z_n_im*z_re + z_n_re*z_im; - z_n_re = z_n_re1; z_n_im = z_n_im1; - th_re = th_re + this.C_re[n]*z_n_re - this.C_im[n]*z_n_im; th_im = th_im + this.C_im[n]*z_n_re + this.C_re[n]*z_n_im; - } - - // 2b. Iterate to refine the accuracy of the calculation - // 0 iterations gives km accuracy - // 1 iteration gives m accuracy -- good enough for most mapping applications - // 2 iterations bives mm accuracy - for (i = 0; i < this.iterations; i++) { - var th_n_re = th_re; var th_n_im = th_im; - var th_n_re1; var th_n_im1; - - var num_re = z_re; var num_im = z_im; - for (n = 2; n <= 6; n++) { - th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im; - th_n_re = th_n_re1; th_n_im = th_n_im1; - num_re = num_re + (n-1)*(this.B_re[n]*th_n_re - this.B_im[n]*th_n_im); num_im = num_im + (n-1)*(this.B_im[n]*th_n_re + this.B_re[n]*th_n_im); - } - - th_n_re = 1; th_n_im = 0; - var den_re = this.B_re[1]; var den_im = this.B_im[1]; - for (n = 2; n <= 6; n++) { - th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im; - th_n_re = th_n_re1; th_n_im = th_n_im1; - den_re = den_re + n * (this.B_re[n]*th_n_re - this.B_im[n]*th_n_im); den_im = den_im + n * (this.B_im[n]*th_n_re + this.B_re[n]*th_n_im); - } - - // Complex division - var den2 = den_re*den_re + den_im*den_im; - th_re = (num_re*den_re + num_im*den_im) / den2; th_im = (num_im*den_re - num_re*den_im) / den2; - } - - // 3. Calculate d_phi ... // and d_lambda - var d_psi = th_re; var d_lambda = th_im; - var d_psi_n = 1; // d_psi^0 - - var d_phi = 0; - for (n = 1; n <= 9; n++) { - d_psi_n = d_psi_n * d_psi; - d_phi = d_phi + this.D[n] * d_psi_n; - } - - // 4. Calculate latitude and longitude - // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians. - var lat = this.lat0 + (d_phi * Proj4js.common.SEC_TO_RAD * 1E5); - var lon = this.long0 + d_lambda; - - p.x = lon; - p.y = lat; - - return p; - } -}; -/* ====================================================================== - projCode/mill.js - ====================================================================== */ - -/******************************************************************************* -NAME MILLER CYLINDRICAL - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Miller Cylindrical projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -T. Mittan March, 1993 - -This function was adapted from the Lambert Azimuthal Equal Area projection -code (FORTRAN) in the General Cartographic Transformation Package software -which is available from the U.S. Geological Survey National Mapping Division. - -ALGORITHM REFERENCES - -1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, - The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. - -2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -3. "Software Documentation for GCTP General Cartographic Transformation - Package", U.S. Geological Survey National Mapping Division, May 1982. -*******************************************************************************/ - -Proj4js.Proj.mill = { - -/* Initialize the Miller Cylindrical projection - -------------------------------------------*/ - init: function() { - //no-op - }, - - - /* Miller Cylindrical forward equations--mapping lat,long to x,y - ------------------------------------------------------------*/ - forward: function(p) { - var lon=p.x; - var lat=p.y; - /* Forward equations - -----------------*/ - var dlon = Proj4js.common.adjust_lon(lon -this.long0); - var x = this.x0 + this.a * dlon; - var y = this.y0 + this.a * Math.log(Math.tan((Proj4js.common.PI / 4.0) + (lat / 2.5))) * 1.25; - - p.x=x; - p.y=y; - return p; - },//millFwd() - - /* Miller Cylindrical inverse equations--mapping x,y to lat/long - ------------------------------------------------------------*/ - inverse: function(p) { - p.x -= this.x0; - p.y -= this.y0; - - var lon = Proj4js.common.adjust_lon(this.long0 + p.x /this.a); - var lat = 2.5 * (Math.atan(Math.exp(0.8*p.y/this.a)) - Proj4js.common.PI / 4.0); - - p.x=lon; - p.y=lat; - return p; - }//millInv() -}; -/* ====================================================================== - projCode/gnom.js - ====================================================================== */ - -/***************************************************************************** -NAME GNOMONIC - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Gnomonic Projection. - Implementation based on the existing sterea and ortho - implementations. - -PROGRAMMER DATE ----------- ---- -Richard Marsden November 2009 - -ALGORITHM REFERENCES - -1. Snyder, John P., "Flattening the Earth - Two Thousand Years of Map - Projections", University of Chicago Press 1993 - -2. Wolfram Mathworld "Gnomonic Projection" - http://mathworld.wolfram.com/GnomonicProjection.html - Accessed: 12th November 2009 -******************************************************************************/ - -Proj4js.Proj.gnom = { - - /* Initialize the Gnomonic projection - -------------------------------------*/ - init: function(def) { - - /* Place parameters in static storage for common use - -------------------------------------------------*/ - this.sin_p14=Math.sin(this.lat0); - this.cos_p14=Math.cos(this.lat0); - // Approximation for projecting points to the horizon (infinity) - this.infinity_dist = 1000 * this.a; - }, - - - /* Gnomonic forward equations--mapping lat,long to x,y - ---------------------------------------------------*/ - forward: function(p) { - var sinphi, cosphi; /* sin and cos value */ - var dlon; /* delta longitude value */ - var coslon; /* cos of longitude */ - var ksp; /* scale factor */ - var g; - var lon=p.x; - var lat=p.y; - /* Forward equations - -----------------*/ - dlon = Proj4js.common.adjust_lon(lon - this.long0); - - sinphi=Math.sin(lat); - cosphi=Math.cos(lat); - - coslon = Math.cos(dlon); - g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; - ksp = 1.0; - if ((g > 0) || (Math.abs(g) <= Proj4js.common.EPSLN)) { - x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g; - y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g; - } else { - Proj4js.reportError("orthoFwdPointError"); - - // Point is in the opposing hemisphere and is unprojectable - // We still need to return a reasonable point, so we project - // to infinity, on a bearing - // equivalent to the northern hemisphere equivalent - // This is a reasonable approximation for short shapes and lines that - // straddle the horizon. - - x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon); - y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); - - } - p.x=x; - p.y=y; - return p; - }, - - - inverse: function(p) { - var rh; /* Rho */ - var z; /* angle */ - var sinc, cosc; - var c; - var lon , lat; - - /* Inverse equations - -----------------*/ - p.x = (p.x - this.x0) / this.a; - p.y = (p.y - this.y0) / this.a; - - p.x /= this.k0; - p.y /= this.k0; - - if ( (rh = Math.sqrt(p.x * p.x + p.y * p.y)) ) { - c = Math.atan2(rh, this.rc); - sinc = Math.sin(c); - cosc = Math.cos(c); - - lat = Proj4js.common.asinz(cosc*this.sin_p14 + (p.y*sinc*this.cos_p14) / rh); - lon = Math.atan2(p.x*sinc, rh*this.cos_p14*cosc - p.y*this.sin_p14*sinc); - lon = Proj4js.common.adjust_lon(this.long0+lon); - } else { - lat = this.phic0; - lon = 0.0; - } - - p.x=lon; - p.y=lat; - return p; - } -}; - - -/* ====================================================================== - projCode/sinu.js - ====================================================================== */ - -/******************************************************************************* -NAME SINUSOIDAL - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Sinusoidal projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -D. Steinwand, EROS May, 1991 - -This function was adapted from the Sinusoidal projection code (FORTRAN) in the -General Cartographic Transformation Package software which is available from -the U.S. Geological Survey National Mapping Division. - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. "Software Documentation for GCTP General Cartographic Transformation - Package", U.S. Geological Survey National Mapping Division, May 1982. -*******************************************************************************/ - -Proj4js.Proj.sinu = { - - /* Initialize the Sinusoidal projection - ------------------------------------*/ - init: function() { - /* Place parameters in static storage for common use - -------------------------------------------------*/ - this.R = 6370997.0; //Radius of earth - }, - - /* Sinusoidal forward equations--mapping lat,long to x,y - -----------------------------------------------------*/ - forward: function(p) { - var x,y,delta_lon; - var lon=p.x; - var lat=p.y; - /* Forward equations - -----------------*/ - delta_lon = Proj4js.common.adjust_lon(lon - this.long0); - x = this.R * delta_lon * Math.cos(lat) + this.x0; - y = this.R * lat + this.y0; - - p.x=x; - p.y=y; - return p; - }, - - inverse: function(p) { - var lat,temp,lon; - - /* Inverse equations - -----------------*/ - p.x -= this.x0; - p.y -= this.y0; - lat = p.y / this.R; - if (Math.abs(lat) > Proj4js.common.HALF_PI) { - Proj4js.reportError("sinu:Inv:DataError"); - } - temp = Math.abs(lat) - Proj4js.common.HALF_PI; - if (Math.abs(temp) > Proj4js.common.EPSLN) { - temp = this.long0+ p.x / (this.R *Math.cos(lat)); - lon = Proj4js.common.adjust_lon(temp); - } else { - lon = this.long0; - } - - p.x=lon; - p.y=lat; - return p; - } -}; - - -/* ====================================================================== - projCode/vandg.js - ====================================================================== */ - -/******************************************************************************* -NAME VAN DER GRINTEN - -PURPOSE: Transforms input Easting and Northing to longitude and - latitude for the Van der Grinten projection. The - Easting and Northing must be in meters. The longitude - and latitude values will be returned in radians. - -PROGRAMMER DATE ----------- ---- -T. Mittan March, 1993 - -This function was adapted from the Van Der Grinten projection code -(FORTRAN) in the General Cartographic Transformation Package software -which is available from the U.S. Geological Survey National Mapping Division. - -ALGORITHM REFERENCES - -1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, - The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. - -2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -3. "Software Documentation for GCTP General Cartographic Transformation - Package", U.S. Geological Survey National Mapping Division, May 1982. -*******************************************************************************/ - -Proj4js.Proj.vandg = { - -/* Initialize the Van Der Grinten projection - ----------------------------------------*/ - init: function() { - this.R = 6370997.0; //Radius of earth - }, - - forward: function(p) { - - var lon=p.x; - var lat=p.y; - - /* Forward equations - -----------------*/ - var dlon = Proj4js.common.adjust_lon(lon - this.long0); - var x,y; - - if (Math.abs(lat) <= Proj4js.common.EPSLN) { - x = this.x0 + this.R * dlon; - y = this.y0; - } - var theta = Proj4js.common.asinz(2.0 * Math.abs(lat / Proj4js.common.PI)); - if ((Math.abs(dlon) <= Proj4js.common.EPSLN) || (Math.abs(Math.abs(lat) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN)) { - x = this.x0; - if (lat >= 0) { - y = this.y0 + Proj4js.common.PI * this.R * Math.tan(.5 * theta); - } else { - y = this.y0 + Proj4js.common.PI * this.R * - Math.tan(.5 * theta); - } - // return(OK); - } - var al = .5 * Math.abs((Proj4js.common.PI / dlon) - (dlon / Proj4js.common.PI)); - var asq = al * al; - var sinth = Math.sin(theta); - var costh = Math.cos(theta); - - var g = costh / (sinth + costh - 1.0); - var gsq = g * g; - var m = g * (2.0 / sinth - 1.0); - var msq = m * m; - var con = Proj4js.common.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq); - if (dlon < 0) { - con = -con; - } - x = this.x0 + con; - con = Math.abs(con / (Proj4js.common.PI * this.R)); - if (lat >= 0) { - y = this.y0 + Proj4js.common.PI * this.R * Math.sqrt(1.0 - con * con - 2.0 * al * con); - } else { - y = this.y0 - Proj4js.common.PI * this.R * Math.sqrt(1.0 - con * con - 2.0 * al * con); - } - p.x = x; - p.y = y; - return p; - }, - -/* Van Der Grinten inverse equations--mapping x,y to lat/long - ---------------------------------------------------------*/ - inverse: function(p) { - var dlon; - var xx,yy,xys,c1,c2,c3; - var al,asq; - var a1; - var m1; - var con; - var th1; - var d; - - /* inverse equations - -----------------*/ - p.x -= this.x0; - p.y -= this.y0; - con = Proj4js.common.PI * this.R; - xx = p.x / con; - yy =p.y / con; - xys = xx * xx + yy * yy; - c1 = -Math.abs(yy) * (1.0 + xys); - c2 = c1 - 2.0 * yy * yy + xx * xx; - c3 = -2.0 * c1 + 1.0 + 2.0 * yy * yy + xys * xys; - d = yy * yy / c3 + (2.0 * c2 * c2 * c2 / c3 / c3 / c3 - 9.0 * c1 * c2 / c3 /c3) / 27.0; - a1 = (c1 - c2 * c2 / 3.0 / c3) / c3; - m1 = 2.0 * Math.sqrt( -a1 / 3.0); - con = ((3.0 * d) / a1) / m1; - if (Math.abs(con) > 1.0) { - if (con >= 0.0) { - con = 1.0; - } else { - con = -1.0; - } - } - th1 = Math.acos(con) / 3.0; - if (p.y >= 0) { - lat = (-m1 *Math.cos(th1 + Proj4js.common.PI / 3.0) - c2 / 3.0 / c3) * Proj4js.common.PI; - } else { - lat = -(-m1 * Math.cos(th1 + PI / 3.0) - c2 / 3.0 / c3) * Proj4js.common.PI; - } - - if (Math.abs(xx) < Proj4js.common.EPSLN) { - lon = this.long0; - } - lon = Proj4js.common.adjust_lon(this.long0 + Proj4js.common.PI * (xys - 1.0 + Math.sqrt(1.0 + 2.0 * (xx * xx - yy * yy) + xys * xys)) / 2.0 / xx); - - p.x=lon; - p.y=lat; - return p; - } -}; -/* ====================================================================== - projCode/cea.js - ====================================================================== */ - -/******************************************************************************* -NAME LAMBERT CYLINDRICAL EQUAL AREA - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Lambert Cylindrical Equal Area projection. - This class of projection includes the Behrmann and - Gall-Peters Projections. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -R. Marsden August 2009 -Winwaed Software Tech LLC, http://www.winwaed.com - -This function was adapted from the Miller Cylindrical Projection in the Proj4JS -library. - -Note: This implementation assumes a Spherical Earth. The (commented) code -has been included for the ellipsoidal forward transform, but derivation of -the ellispoidal inverse transform is beyond me. Note that most of the -Proj4JS implementations do NOT currently support ellipsoidal figures. -Therefore this is not seen as a problem - especially this lack of support -is explicitly stated here. - -ALGORITHM REFERENCES - -1. "Cartographic Projection Procedures for the UNIX Environment - - A User's Manual" by Gerald I. Evenden, USGS Open File Report 90-284 - and Release 4 Interim Reports (2003) - -2. Snyder, John P., "Flattening the Earth - Two Thousand Years of Map - Projections", Univ. Chicago Press, 1993 -*******************************************************************************/ - -Proj4js.Proj.cea = { - -/* Initialize the Cylindrical Equal Area projection - -------------------------------------------*/ - init: function() { - //no-op - }, - - - /* Cylindrical Equal Area forward equations--mapping lat,long to x,y - ------------------------------------------------------------*/ - forward: function(p) { - var lon=p.x; - var lat=p.y; - /* Forward equations - -----------------*/ - dlon = Proj4js.common.adjust_lon(lon -this.long0); - var x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); - var y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts); - /* Elliptical Forward Transform - Not implemented due to a lack of a matchign inverse function - { - var Sin_Lat = Math.sin(lat); - var Rn = this.a * (Math.sqrt(1.0e0 - this.es * Sin_Lat * Sin_Lat )); - x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); - y = this.y0 + Rn * Math.sin(lat) / Math.cos(this.lat_ts); - } - */ - - - p.x=x; - p.y=y; - return p; - },//ceaFwd() - - /* Cylindrical Equal Area inverse equations--mapping x,y to lat/long - ------------------------------------------------------------*/ - inverse: function(p) { - p.x -= this.x0; - p.y -= this.y0; - - var lon = Proj4js.common.adjust_lon( this.long0 + (p.x / this.a) / Math.cos(this.lat_ts) ); - - var lat = Math.asin( (p.y/this.a) * Math.cos(this.lat_ts) ); - - p.x=lon; - p.y=lat; - return p; - }//ceaInv() -}; -/* ====================================================================== - projCode/eqc.js - ====================================================================== */ - -/* similar to equi.js FIXME proj4 uses eqc */ -Proj4js.Proj.eqc = { - init : function() { - - if(!this.x0) this.x0=0; - if(!this.y0) this.y0=0; - if(!this.lat0) this.lat0=0; - if(!this.long0) this.long0=0; - if(!this.lat_ts) this.lat_ts=0; - if (!this.title) this.title = "Equidistant Cylindrical (Plate Carre)"; - - this.rc= Math.cos(this.lat_ts); - }, - - - // forward equations--mapping lat,long to x,y - // ----------------------------------------------------------------- - forward : function(p) { - - var lon= p.x; - var lat= p.y; - - var dlon = Proj4js.common.adjust_lon(lon - this.long0); - var dlat = Proj4js.common.adjust_lat(lat - this.lat0 ); - p.x= this.x0 + (this.a*dlon*this.rc); - p.y= this.y0 + (this.a*dlat ); - return p; - }, - - // inverse equations--mapping x,y to lat/long - // ----------------------------------------------------------------- - inverse : function(p) { - - var x= p.x; - var y= p.y; - - p.x= Proj4js.common.adjust_lon(this.long0 + ((x - this.x0)/(this.a*this.rc))); - p.y= Proj4js.common.adjust_lat(this.lat0 + ((y - this.y0)/(this.a ))); - return p; - } - -}; -/* ====================================================================== - projCode/cass.js - ====================================================================== */ - -/******************************************************************************* -NAME CASSINI - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Cassini projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - Ported from PROJ.4. - - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government -*******************************************************************************/ - - -//Proj4js.defs["EPSG:28191"] = "+proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m +no_defs"; - -// Initialize the Cassini projection -// ----------------------------------------------------------------- - -Proj4js.Proj.cass = { - init : function() { - if (!this.sphere) { - this.en = this.pj_enfn(this.es) - this.m0 = this.pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en); - } - }, - - C1: .16666666666666666666, - C2: .00833333333333333333, - C3: .04166666666666666666, - C4: .33333333333333333333, - C5: .06666666666666666666, - - -/* Cassini forward equations--mapping lat,long to x,y - -----------------------------------------------------------------------*/ - forward: function(p) { - - /* Forward equations - -----------------*/ - var x,y; - var lam=p.x; - var phi=p.y; - lam = Proj4js.common.adjust_lon(lam - this.long0); - - if (this.sphere) { - x = Math.asin(Math.cos(phi) * Math.sin(lam)); - y = Math.atan2(Math.tan(phi) , Math.cos(lam)) - this.phi0; - } else { - //ellipsoid - this.n = Math.sin(phi); - this.c = Math.cos(phi); - y = this.pj_mlfn(phi, this.n, this.c, this.en); - this.n = 1./Math.sqrt(1. - this.es * this.n * this.n); - this.tn = Math.tan(phi); - this.t = this.tn * this.tn; - this.a1 = lam * this.c; - this.c *= this.es * this.c / (1 - this.es); - this.a2 = this.a1 * this.a1; - x = this.n * this.a1 * (1. - this.a2 * this.t * (this.C1 - (8. - this.t + 8. * this.c) * this.a2 * this.C2)); - y -= this.m0 - this.n * this.tn * this.a2 * (.5 + (5. - this.t + 6. * this.c) * this.a2 * this.C3); - } - - p.x = this.a*x + this.x0; - p.y = this.a*y + this.y0; - return p; - },//cassFwd() - -/* Inverse equations - -----------------*/ - inverse: function(p) { - p.x -= this.x0; - p.y -= this.y0; - var x = p.x/this.a; - var y = p.y/this.a; - - if (this.sphere) { - this.dd = y + this.lat0; - phi = Math.asin(Math.sin(this.dd) * Math.cos(x)); - lam = Math.atan2(Math.tan(x), Math.cos(this.dd)); - } else { - /* ellipsoid */ - ph1 = this.pj_inv_mlfn(this.m0 + y, this.es, this.en); - this.tn = Math.tan(ph1); - this.t = this.tn * this.tn; - this.n = Math.sin(ph1); - this.r = 1. / (1. - this.es * this.n * this.n); - this.n = Math.sqrt(this.r); - this.r *= (1. - this.es) * this.n; - this.dd = x / this.n; - this.d2 = this.dd * this.dd; - phi = ph1 - (this.n * this.tn / this.r) * this.d2 * (.5 - (1. + 3. * this.t) * this.d2 * this.C3); - lam = this.dd * (1. + this.t * this.d2 * (-this.C4 + (1. + 3. * this.t) * this.d2 * this.C5)) / Math.cos(ph1); - } - p.x = Proj4js.common.adjust_lon(this.long0+lam); - p.y = phi; - return p; - },//lamazInv() - - - //code from the PROJ.4 pj_mlfn.c file; this may be useful for other projections - pj_enfn: function(es) { - en = new Array(); - en[0] = this.C00 - es * (this.C02 + es * (this.C04 + es * (this.C06 + es * this.C08))); - en[1] = es * (this.C22 - es * (this.C04 + es * (this.C06 + es * this.C08))); - var t = es * es; - en[2] = t * (this.C44 - es * (this.C46 + es * this.C48)); - t *= es; - en[3] = t * (this.C66 - es * this.C68); - en[4] = t * es * this.C88; - return en; - }, - - pj_mlfn: function(phi, sphi, cphi, en) { - cphi *= sphi; - sphi *= sphi; - return(en[0] * phi - cphi * (en[1] + sphi*(en[2]+ sphi*(en[3] + sphi*en[4])))); - }, - - pj_inv_mlfn: function(arg, es, en) { - k = 1./(1.-es); - phi = arg; - for (i = Proj4js.common.MAX_ITER; i ; --i) { /* rarely goes over 2 iterations */ - s = Math.sin(phi); - t = 1. - es * s * s; - //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg; - //phi -= t * (t * Math.sqrt(t)) * k; - t = (this.pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k; - phi -= t; - if (Math.abs(t) < Proj4js.common.EPSLN) - return phi; - } - Proj4js.reportError("cass:pj_inv_mlfn: Convergence error"); - return phi; - }, - -/* meridinal distance for ellipsoid and inverse -** 8th degree - accurate to < 1e-5 meters when used in conjuction -** with typical major axis values. -** Inverse determines phi to EPS (1e-11) radians, about 1e-6 seconds. -*/ - C00: 1.0, - C02: .25, - C04: .046875, - C06: .01953125, - C08: .01068115234375, - C22: .75, - C44: .46875, - C46: .01302083333333333333, - C48: .00712076822916666666, - C66: .36458333333333333333, - C68: .00569661458333333333, - C88: .3076171875 - -} -/* ====================================================================== - projCode/gauss.js - ====================================================================== */ - - -Proj4js.Proj.gauss = { - - init : function() { - sphi = Math.sin(this.lat0); - cphi = Math.cos(this.lat0); - cphi *= cphi; - this.rc = Math.sqrt(1.0 - this.es) / (1.0 - this.es * sphi * sphi); - this.C = Math.sqrt(1.0 + this.es * cphi * cphi / (1.0 - this.es)); - this.phic0 = Math.asin(sphi / this.C); - this.ratexp = 0.5 * this.C * this.e; - this.K = Math.tan(0.5 * this.phic0 + Proj4js.common.FORTPI) / (Math.pow(Math.tan(0.5*this.lat0 + Proj4js.common.FORTPI), this.C) * Proj4js.common.srat(this.e*sphi, this.ratexp)); - }, - - forward : function(p) { - var lon = p.x; - var lat = p.y; - - p.y = 2.0 * Math.atan( this.K * Math.pow(Math.tan(0.5 * lat + Proj4js.common.FORTPI), this.C) * Proj4js.common.srat(this.e * Math.sin(lat), this.ratexp) ) - Proj4js.common.HALF_PI; - p.x = this.C * lon; - return p; - }, - - inverse : function(p) { - var DEL_TOL = 1e-14; - var lon = p.x / this.C; - var lat = p.y; - num = Math.pow(Math.tan(0.5 * lat + Proj4js.common.FORTPI)/this.K, 1./this.C); - for (var i = Proj4js.common.MAX_ITER; i>0; --i) { - lat = 2.0 * Math.atan(num * Proj4js.common.srat(this.e * Math.sin(p.y), -0.5 * this.e)) - Proj4js.common.HALF_PI; - if (Math.abs(lat - p.y) < DEL_TOL) break; - p.y = lat; - } - /* convergence failed */ - if (!i) { - Proj4js.reportError("gauss:inverse:convergence failed"); - return null; - } - p.x = lon; - p.y = lat; - return p; - } -}; - -/* ====================================================================== - projCode/omerc.js - ====================================================================== */ - -/******************************************************************************* -NAME OBLIQUE MERCATOR (HOTINE) - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Oblique Mercator projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -T. Mittan Mar, 1993 - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government - Printing Office, Washington D.C., 1989. -*******************************************************************************/ - -Proj4js.Proj.omerc = { - - /* Initialize the Oblique Mercator projection - ------------------------------------------*/ - init: function() { - if (!this.mode) this.mode=0; - if (!this.lon1) {this.lon1=0;this.mode=1;} - if (!this.lon2) this.lon2=0; - if (!this.lat2) this.lat2=0; - - /* Place parameters in static storage for common use - -------------------------------------------------*/ - var temp = this.b/ this.a; - var es = 1.0 - Math.pow(temp,2); - var e = Math.sqrt(es); - - this.sin_p20=Math.sin(this.lat0); - this.cos_p20=Math.cos(this.lat0); - - this.con = 1.0 - this.es * this.sin_p20 * this.sin_p20; - this.com = Math.sqrt(1.0 - es); - this.bl = Math.sqrt(1.0 + this.es * Math.pow(this.cos_p20,4.0)/(1.0 - es)); - this.al = this.a * this.bl * this.k0 * this.com / this.con; - if (Math.abs(this.lat0) < Proj4js.common.EPSLN) { - this.ts = 1.0; - this.d = 1.0; - this.el = 1.0; - } else { - this.ts = Proj4js.common.tsfnz(this.e,this.lat0,this.sin_p20); - this.con = Math.sqrt(this.con); - this.d = this.bl * this.com / (this.cos_p20 * this.con); - if ((this.d * this.d - 1.0) > 0.0) { - if (this.lat0 >= 0.0) { - this.f = this.d + Math.sqrt(this.d * this.d - 1.0); - } else { - this.f = this.d - Math.sqrt(this.d * this.d - 1.0); - } - } else { - this.f = this.d; - } - this.el = this.f * Math.pow(this.ts,this.bl); - } - - //this.longc=52.60353916666667; - - if (this.mode != 0) { - this.g = .5 * (this.f - 1.0/this.f); - this.gama = Proj4js.common.asinz(Math.sin(this.alpha) / this.d); - this.longc= this.longc - Proj4js.common.asinz(this.g * Math.tan(this.gama))/this.bl; - - /* Report parameters common to format B - -------------------------------------*/ - //genrpt(azimuth * R2D,"Azimuth of Central Line: "); - //cenlon(lon_origin); - // cenlat(lat_origin); - - this.con = Math.abs(this.lat0); - if ((this.con > Proj4js.common.EPSLN) && (Math.abs(this.con - Proj4js.common.HALF_PI) > Proj4js.common.EPSLN)) { - this.singam=Math.sin(this.gama); - this.cosgam=Math.cos(this.gama); - - this.sinaz=Math.sin(this.alpha); - this.cosaz=Math.cos(this.alpha); - - if (this.lat0>= 0) { - this.u = (this.al / this.bl) * Math.atan(Math.sqrt(this.d*this.d - 1.0)/this.cosaz); - } else { - this.u = -(this.al / this.bl) *Math.atan(Math.sqrt(this.d*this.d - 1.0)/this.cosaz); - } - } else { - Proj4js.reportError("omerc:Init:DataError"); - } - } else { - this.sinphi =Math. sin(this.at1); - this.ts1 = Proj4js.common.tsfnz(this.e,this.lat1,this.sinphi); - this.sinphi = Math.sin(this.lat2); - this.ts2 = Proj4js.common.tsfnz(this.e,this.lat2,this.sinphi); - this.h = Math.pow(this.ts1,this.bl); - this.l = Math.pow(this.ts2,this.bl); - this.f = this.el/this.h; - this.g = .5 * (this.f - 1.0/this.f); - this.j = (this.el * this.el - this.l * this.h)/(this.el * this.el + this.l * this.h); - this.p = (this.l - this.h) / (this.l + this.h); - this.dlon = this.lon1 - this.lon2; - if (this.dlon < -Proj4js.common.PI) this.lon2 = this.lon2 - 2.0 * Proj4js.common.PI; - if (this.dlon > Proj4js.common.PI) this.lon2 = this.lon2 + 2.0 * Proj4js.common.PI; - this.dlon = this.lon1 - this.lon2; - this.longc = .5 * (this.lon1 + this.lon2) -Math.atan(this.j * Math.tan(.5 * this.bl * this.dlon)/this.p)/this.bl; - this.dlon = Proj4js.common.adjust_lon(this.lon1 - this.longc); - this.gama = Math.atan(Math.sin(this.bl * this.dlon)/this.g); - this.alpha = Proj4js.common.asinz(this.d * Math.sin(this.gama)); - - /* Report parameters common to format A - -------------------------------------*/ - - if (Math.abs(this.lat1 - this.lat2) <= Proj4js.common.EPSLN) { - Proj4js.reportError("omercInitDataError"); - //return(202); - } else { - this.con = Math.abs(this.lat1); - } - if ((this.con <= Proj4js.common.EPSLN) || (Math.abs(this.con - HALF_PI) <= Proj4js.common.EPSLN)) { - Proj4js.reportError("omercInitDataError"); - //return(202); - } else { - if (Math.abs(Math.abs(this.lat0) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN) { - Proj4js.reportError("omercInitDataError"); - //return(202); - } - } - - this.singam=Math.sin(this.gam); - this.cosgam=Math.cos(this.gam); - - this.sinaz=Math.sin(this.alpha); - this.cosaz=Math.cos(this.alpha); - - - if (this.lat0 >= 0) { - this.u = (this.al/this.bl) * Math.atan(Math.sqrt(this.d * this.d - 1.0)/this.cosaz); - } else { - this.u = -(this.al/this.bl) * Math.atan(Math.sqrt(this.d * this.d - 1.0)/this.cosaz); - } - } - }, - - - /* Oblique Mercator forward equations--mapping lat,long to x,y - ----------------------------------------------------------*/ - forward: function(p) { - var theta; /* angle */ - var sin_phi, cos_phi;/* sin and cos value */ - var b; /* temporary values */ - var c, t, tq; /* temporary values */ - var con, n, ml; /* cone constant, small m */ - var q,us,vl; - var ul,vs; - var s; - var dlon; - var ts1; - - var lon=p.x; - var lat=p.y; - /* Forward equations - -----------------*/ - sin_phi = Math.sin(lat); - dlon = Proj4js.common.adjust_lon(lon - this.longc); - vl = Math.sin(this.bl * dlon); - if (Math.abs(Math.abs(lat) - Proj4js.common.HALF_PI) > Proj4js.common.EPSLN) { - ts1 = Proj4js.common.tsfnz(this.e,lat,sin_phi); - q = this.el / (Math.pow(ts1,this.bl)); - s = .5 * (q - 1.0 / q); - t = .5 * (q + 1.0/ q); - ul = (s * this.singam - vl * this.cosgam) / t; - con = Math.cos(this.bl * dlon); - if (Math.abs(con) < .0000001) { - us = this.al * this.bl * dlon; - } else { - us = this.al * Math.atan((s * this.cosgam + vl * this.singam) / con)/this.bl; - if (con < 0) us = us + Proj4js.common.PI * this.al / this.bl; - } - } else { - if (lat >= 0) { - ul = this.singam; - } else { - ul = -this.singam; - } - us = this.al * lat / this.bl; - } - if (Math.abs(Math.abs(ul) - 1.0) <= Proj4js.common.EPSLN) { - //alert("Point projects into infinity","omer-for"); - Proj4js.reportError("omercFwdInfinity"); - //return(205); - } - vs = .5 * this.al * Math.log((1.0 - ul)/(1.0 + ul)) / this.bl; - us = us - this.u; - var x = this.x0 + vs * this.cosaz + us * this.sinaz; - var y = this.y0 + us * this.cosaz - vs * this.sinaz; - - p.x=x; - p.y=y; - return p; - }, - - inverse: function(p) { - var delta_lon; /* Delta longitude (Given longitude - center */ - var theta; /* angle */ - var delta_theta; /* adjusted longitude */ - var sin_phi, cos_phi;/* sin and cos value */ - var b; /* temporary values */ - var c, t, tq; /* temporary values */ - var con, n, ml; /* cone constant, small m */ - var vs,us,q,s,ts1; - var vl,ul,bs; - var dlon; - var flag; - - /* Inverse equations - -----------------*/ - p.x -= this.x0; - p.y -= this.y0; - flag = 0; - vs = p.x * this.cosaz - p.y * this.sinaz; - us = p.y * this.cosaz + p.x * this.sinaz; - us = us + this.u; - q = Math.exp(-this.bl * vs / this.al); - s = .5 * (q - 1.0/q); - t = .5 * (q + 1.0/q); - vl = Math.sin(this.bl * us / this.al); - ul = (vl * this.cosgam + s * this.singam)/t; - if (Math.abs(Math.abs(ul) - 1.0) <= Proj4js.common.EPSLN) - { - lon = this.longc; - if (ul >= 0.0) { - lat = Proj4js.common.HALF_PI; - } else { - lat = -Proj4js.common.HALF_PI; - } - } else { - con = 1.0 / this.bl; - ts1 =Math.pow((this.el / Math.sqrt((1.0 + ul) / (1.0 - ul))),con); - lat = Proj4js.common.phi2z(this.e,ts1); - //if (flag != 0) - //return(flag); - //~ con = Math.cos(this.bl * us /al); - theta = this.longc - Math.atan2((s * this.cosgam - vl * this.singam) , con)/this.bl; - lon = Proj4js.common.adjust_lon(theta); - } - p.x=lon; - p.y=lat; - return p; - } -}; -/* ====================================================================== - projCode/lcc.js - ====================================================================== */ - -/******************************************************************************* -NAME LAMBERT CONFORMAL CONIC - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Lambert Conformal Conic projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - - -ALGORITHM REFERENCES - -1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government -*******************************************************************************/ - - -//<2104> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x0=-17044 +x0=-23139.97 +ellps=intl +units=m +no_defs no_defs - -// Initialize the Lambert Conformal conic projection -// ----------------------------------------------------------------- - -//Proj4js.Proj.lcc = Class.create(); -Proj4js.Proj.lcc = { - init : function() { - - // array of: r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north - //double c_lat; /* center latitude */ - //double c_lon; /* center longitude */ - //double lat1; /* first standard parallel */ - //double lat2; /* second standard parallel */ - //double r_maj; /* major axis */ - //double r_min; /* minor axis */ - //double false_east; /* x offset in meters */ - //double false_north; /* y offset in meters */ - - if (!this.lat2){this.lat2=this.lat0;}//if lat2 is not defined - if (!this.k0) this.k0 = 1.0; - - // Standard Parallels cannot be equal and on opposite sides of the equator - if (Math.abs(this.lat1+this.lat2) < Proj4js.common.EPSLN) { - Proj4js.reportError("lcc:init: Equal Latitudes"); - return; - } - - var temp = this.b / this.a; - this.e = Math.sqrt(1.0 - temp*temp); - - var sin1 = Math.sin(this.lat1); - var cos1 = Math.cos(this.lat1); - var ms1 = Proj4js.common.msfnz(this.e, sin1, cos1); - var ts1 = Proj4js.common.tsfnz(this.e, this.lat1, sin1); - - var sin2 = Math.sin(this.lat2); - var cos2 = Math.cos(this.lat2); - var ms2 = Proj4js.common.msfnz(this.e, sin2, cos2); - var ts2 = Proj4js.common.tsfnz(this.e, this.lat2, sin2); - - var ts0 = Proj4js.common.tsfnz(this.e, this.lat0, Math.sin(this.lat0)); - - if (Math.abs(this.lat1 - this.lat2) > Proj4js.common.EPSLN) { - this.ns = Math.log(ms1/ms2)/Math.log(ts1/ts2); - } else { - this.ns = sin1; - } - this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns)); - this.rh = this.a * this.f0 * Math.pow(ts0, this.ns); - if (!this.title) this.title = "Lambert Conformal Conic"; - }, - - - // Lambert Conformal conic forward equations--mapping lat,long to x,y - // ----------------------------------------------------------------- - forward : function(p) { - - var lon = p.x; - var lat = p.y; - - // convert to radians - if ( lat <= 90.0 && lat >= -90.0 && lon <= 180.0 && lon >= -180.0) { - //lon = lon * Proj4js.common.D2R; - //lat = lat * Proj4js.common.D2R; - } else { - Proj4js.reportError("lcc:forward: llInputOutOfRange: "+ lon +" : " + lat); - return null; - } - - var con = Math.abs( Math.abs(lat) - Proj4js.common.HALF_PI); - var ts, rh1; - if (con > Proj4js.common.EPSLN) { - ts = Proj4js.common.tsfnz(this.e, lat, Math.sin(lat) ); - rh1 = this.a * this.f0 * Math.pow(ts, this.ns); - } else { - con = lat * this.ns; - if (con <= 0) { - Proj4js.reportError("lcc:forward: No Projection"); - return null; - } - rh1 = 0; - } - var theta = this.ns * Proj4js.common.adjust_lon(lon - this.long0); - p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0; - p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0; - - return p; - }, - - // Lambert Conformal Conic inverse equations--mapping x,y to lat/long - // ----------------------------------------------------------------- - inverse : function(p) { - - var rh1, con, ts; - var lat, lon; - x = (p.x - this.x0)/this.k0; - y = (this.rh - (p.y - this.y0)/this.k0); - if (this.ns > 0) { - rh1 = Math.sqrt (x * x + y * y); - con = 1.0; - } else { - rh1 = -Math.sqrt (x * x + y * y); - con = -1.0; - } - var theta = 0.0; - if (rh1 != 0) { - theta = Math.atan2((con * x),(con * y)); - } - if ((rh1 != 0) || (this.ns > 0.0)) { - con = 1.0/this.ns; - ts = Math.pow((rh1/(this.a * this.f0)), con); - lat = Proj4js.common.phi2z(this.e, ts); - if (lat == -9999) return null; - } else { - lat = -Proj4js.common.HALF_PI; - } - lon = Proj4js.common.adjust_lon(theta/this.ns + this.long0); - - p.x = lon; - p.y = lat; - return p; - } -}; - - - - -/* ====================================================================== - projCode/laea.js - ====================================================================== */ - -/******************************************************************************* -NAME LAMBERT AZIMUTHAL EQUAL-AREA - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the Lambert Azimuthal Equal-Area projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -D. Steinwand, EROS March, 1991 - -This function was adapted from the Lambert Azimuthal Equal Area projection -code (FORTRAN) in the General Cartographic Transformation Package software -which is available from the U.S. Geological Survey National Mapping Division. - -ALGORITHM REFERENCES - -1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, - The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. - -2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. - -3. "Software Documentation for GCTP General Cartographic Transformation - Package", U.S. Geological Survey National Mapping Division, May 1982. -*******************************************************************************/ - -Proj4js.Proj.laea = { - S_POLE: 1, - N_POLE: 2, - EQUIT: 3, - OBLIQ: 4, - - -/* Initialize the Lambert Azimuthal Equal Area projection - ------------------------------------------------------*/ - init: function() { - var t = Math.abs(this.lat0); - if (Math.abs(t - Proj4js.common.HALF_PI) < Proj4js.common.EPSLN) { - this.mode = this.lat0 < 0. ? this.S_POLE : this.N_POLE; - } else if (Math.abs(t) < Proj4js.common.EPSLN) { - this.mode = this.EQUIT; - } else { - this.mode = this.OBLIQ; - } - if (this.es > 0) { - var sinphi; - - this.qp = Proj4js.common.qsfnz(this.e, 1.0); - this.mmf = .5 / (1. - this.es); - this.apa = this.authset(this.es); - switch (this.mode) { - case this.N_POLE: - case this.S_POLE: - this.dd = 1.; - break; - case this.EQUIT: - this.rq = Math.sqrt(.5 * this.qp); - this.dd = 1. / this.rq; - this.xmf = 1.; - this.ymf = .5 * this.qp; - break; - case this.OBLIQ: - this.rq = Math.sqrt(.5 * this.qp); - sinphi = Math.sin(this.lat0); - this.sinb1 = Proj4js.common.qsfnz(this.e, sinphi) / this.qp; - this.cosb1 = Math.sqrt(1. - this.sinb1 * this.sinb1); - this.dd = Math.cos(this.lat0) / (Math.sqrt(1. - this.es * sinphi * sinphi) * this.rq * this.cosb1); - this.ymf = (this.xmf = this.rq) / this.dd; - this.xmf *= this.dd; - break; - } - } else { - if (this.mode == this.OBLIQ) { - this.sinph0 = Math.sin(this.lat0); - this.cosph0 = Math.cos(this.lat0); - } - } - }, - -/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y - -----------------------------------------------------------------------*/ - forward: function(p) { - - /* Forward equations - -----------------*/ - var x,y; - var lam=p.x; - var phi=p.y; - lam = Proj4js.common.adjust_lon(lam - this.long0); - - if (this.sphere) { - var coslam, cosphi, sinphi; - - sinphi = Math.sin(phi); - cosphi = Math.cos(phi); - coslam = Math.cos(lam); - switch (this.mode) { - case this.EQUIT: - y = (this.mode == this.EQUIT) ? 1. + cosphi * coslam : 1. + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; - if (y <= Proj4js.common.EPSLN) { - Proj4js.reportError("laea:fwd:y less than eps"); - return null; - } - y = Math.sqrt(2. / y); - x = y * cosphi * Math.sin(lam); - y *= (this.mode == this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; - break; - case this.N_POLE: - coslam = -coslam; - case this.S_POLE: - if (Math.abs(phi + this.phi0) < Proj4js.common.EPSLN) { - Proj4js.reportError("laea:fwd:phi < eps"); - return null; - } - y = Proj4js.common.FORTPI - phi * .5; - y = 2. * ((this.mode == this.S_POLE) ? Math.cos(y) : Math.sin(y)); - x = y * Math.sin(lam); - y *= coslam; - break; - } - } else { - var coslam, sinlam, sinphi, q, sinb=0.0, cosb=0.0, b=0.0; - - coslam = Math.cos(lam); - sinlam = Math.sin(lam); - sinphi = Math.sin(phi); - q = Proj4js.common.qsfnz(this.e, sinphi); - if (this.mode == this.OBLIQ || this.mode == this.EQUIT) { - sinb = q / this.qp; - cosb = Math.sqrt(1. - sinb * sinb); - } - switch (this.mode) { - case this.OBLIQ: - b = 1. + this.sinb1 * sinb + this.cosb1 * cosb * coslam; - break; - case this.EQUIT: - b = 1. + cosb * coslam; - break; - case this.N_POLE: - b = Proj4js.common.HALF_PI + phi; - q = this.qp - q; - break; - case this.S_POLE: - b = phi - Proj4js.common.HALF_PI; - q = this.qp + q; - break; - } - if (Math.abs(b) < Proj4js.common.EPSLN) { - Proj4js.reportError("laea:fwd:b < eps"); - return null; - } - switch (this.mode) { - case this.OBLIQ: - case this.EQUIT: - b = Math.sqrt(2. / b); - if (this.mode == this.OBLIQ) { - y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam); - } else { - y = (b = Math.sqrt(2. / (1. + cosb * coslam))) * sinb * this.ymf; - } - x = this.xmf * b * cosb * sinlam; - break; - case this.N_POLE: - case this.S_POLE: - if (q >= 0.) { - x = (b = Math.sqrt(q)) * sinlam; - y = coslam * ((this.mode == this.S_POLE) ? b : -b); - } else { - x = y = 0.; - } - break; - } - } - - //v 1.0 - /* - var sin_lat=Math.sin(lat); - var cos_lat=Math.cos(lat); - - var sin_delta_lon=Math.sin(delta_lon); - var cos_delta_lon=Math.cos(delta_lon); - - var g =this.sin_lat_o * sin_lat +this.cos_lat_o * cos_lat * cos_delta_lon; - if (g == -1.0) { - Proj4js.reportError("laea:fwd:Point projects to a circle of radius "+ 2.0 * R); - return null; - } - var ksp = this.a * Math.sqrt(2.0 / (1.0 + g)); - var x = ksp * cos_lat * sin_delta_lon + this.x0; - var y = ksp * (this.cos_lat_o * sin_lat - this.sin_lat_o * cos_lat * cos_delta_lon) + this.y0; - */ - p.x = this.a*x + this.x0; - p.y = this.a*y + this.y0; - return p; - },//lamazFwd() - -/* Inverse equations - -----------------*/ - inverse: function(p) { - p.x -= this.x0; - p.y -= this.y0; - var x = p.x/this.a; - var y = p.y/this.a; - - if (this.sphere) { - var cosz=0.0, rh, sinz=0.0; - - rh = Math.sqrt(x*x + y*y); - var phi = rh * .5; - if (phi > 1.) { - Proj4js.reportError("laea:Inv:DataError"); - return null; - } - phi = 2. * Math.asin(phi); - if (this.mode == this.OBLIQ || this.mode == this.EQUIT) { - sinz = Math.sin(phi); - cosz = Math.cos(phi); - } - switch (this.mode) { - case this.EQUIT: - phi = (Math.abs(rh) <= Proj4js.common.EPSLN) ? 0. : Math.asin(y * sinz / rh); - x *= sinz; - y = cosz * rh; - break; - case this.OBLIQ: - phi = (Math.abs(rh) <= Proj4js.common.EPSLN) ? this.phi0 : Math.asin(cosz * sinph0 + y * sinz * cosph0 / rh); - x *= sinz * cosph0; - y = (cosz - Math.sin(phi) * sinph0) * rh; - break; - case this.N_POLE: - y = -y; - phi = Proj4js.common.HALF_PI - phi; - break; - case this.S_POLE: - phi -= Proj4js.common.HALF_PI; - break; - } - lam = (y == 0. && (this.mode == this.EQUIT || this.mode == this.OBLIQ)) ? 0. : Math.atan2(x, y); - } else { - var cCe, sCe, q, rho, ab=0.0; - - switch (this.mode) { - case this.EQUIT: - case this.OBLIQ: - x /= this.dd; - y *= this.dd; - rho = Math.sqrt(x*x + y*y); - if (rho < Proj4js.common.EPSLN) { - p.x = 0.; - p.y = this.phi0; - return p; - } - sCe = 2. * Math.asin(.5 * rho / this.rq); - cCe = Math.cos(sCe); - x *= (sCe = Math.sin(sCe)); - if (this.mode == this.OBLIQ) { - ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho - q = this.qp * ab; - y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe; - } else { - ab = y * sCe / rho; - q = this.qp * ab; - y = rho * cCe; - } - break; - case this.N_POLE: - y = -y; - case this.S_POLE: - q = (x * x + y * y); - if (!q ) { - p.x = 0.; - p.y = this.phi0; - return p; - } - /* - q = this.qp - q; - */ - ab = 1. - q / this.qp; - if (this.mode == this.S_POLE) { - ab = - ab; - } - break; - } - lam = Math.atan2(x, y); - phi = this.authlat(Math.asin(ab), this.apa); - } - - /* - var Rh = Math.Math.sqrt(p.x *p.x +p.y * p.y); - var temp = Rh / (2.0 * this.a); - - if (temp > 1) { - Proj4js.reportError("laea:Inv:DataError"); - return null; - } - - var z = 2.0 * Proj4js.common.asinz(temp); - var sin_z=Math.sin(z); - var cos_z=Math.cos(z); - - var lon =this.long0; - if (Math.abs(Rh) > Proj4js.common.EPSLN) { - var lat = Proj4js.common.asinz(this.sin_lat_o * cos_z +this. cos_lat_o * sin_z *p.y / Rh); - var temp =Math.abs(this.lat0) - Proj4js.common.HALF_PI; - if (Math.abs(temp) > Proj4js.common.EPSLN) { - temp = cos_z -this.sin_lat_o * Math.sin(lat); - if(temp!=0.0) lon=Proj4js.common.adjust_lon(this.long0+Math.atan2(p.x*sin_z*this.cos_lat_o,temp*Rh)); - } else if (this.lat0 < 0.0) { - lon = Proj4js.common.adjust_lon(this.long0 - Math.atan2(-p.x,p.y)); - } else { - lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x, -p.y)); - } - } else { - lat = this.lat0; - } - */ - //return(OK); - p.x = Proj4js.common.adjust_lon(this.long0+lam); - p.y = phi; - return p; - },//lamazInv() - -/* determine latitude from authalic latitude */ - P00: .33333333333333333333, - P01: .17222222222222222222, - P02: .10257936507936507936, - P10: .06388888888888888888, - P11: .06640211640211640211, - P20: .01641501294219154443, - - authset: function(es) { - var t; - var APA = new Array(); - APA[0] = es * this.P00; - t = es * es; - APA[0] += t * this.P01; - APA[1] = t * this.P10; - t *= es; - APA[0] += t * this.P02; - APA[1] += t * this.P11; - APA[2] = t * this.P20; - return APA; - }, - - authlat: function(beta, APA) { - var t = beta+beta; - return(beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t+t) + APA[2] * Math.sin(t+t+t)); - } - -}; - - - -/* ====================================================================== - projCode/aeqd.js - ====================================================================== */ - -Proj4js.Proj.aeqd = { - - init : function() { - this.sin_p12=Math.sin(this.lat0); - this.cos_p12=Math.cos(this.lat0); - }, - - forward: function(p) { - var lon=p.x; - var lat=p.y; - var ksp; - - var sinphi=Math.sin(p.y); - var cosphi=Math.cos(p.y); - var dlon = Proj4js.common.adjust_lon(lon - this.long0); - var coslon = Math.cos(dlon); - var g = this.sin_p12 * sinphi + this.cos_p12 * cosphi * coslon; - if (Math.abs(Math.abs(g) - 1.0) < Proj4js.common.EPSLN) { - ksp = 1.0; - if (g < 0.0) { - Proj4js.reportError("aeqd:Fwd:PointError"); - return; - } - } else { - var z = Math.acos(g); - ksp = z/Math.sin(z); - } - p.x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon); - p.y = this.y0 + this.a * ksp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * coslon); - return p; - }, - - inverse: function(p){ - p.x -= this.x0; - p.y -= this.y0; - - var rh = Math.sqrt(p.x * p.x + p.y *p.y); - if (rh > (2.0 * Proj4js.common.HALF_PI * this.a)) { - Proj4js.reportError("aeqdInvDataError"); - return; - } - var z = rh / this.a; - - var sinz=Math.sin(z); - var cosz=Math.cos(z); - - var lon = this.long0; - var lat; - if (Math.abs(rh) <= Proj4js.common.EPSLN) { - lat = this.lat0; - } else { - lat = Proj4js.common.asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh); - var con = Math.abs(this.lat0) - Proj4js.common.HALF_PI; - if (Math.abs(con) <= Proj4js.common.EPSLN) { - if (lat0 >= 0.0) { - lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x , -p.y)); - } else { - lon = Proj4js.common.adjust_lon(this.long0 - Math.atan2(-p.x , p.y)); - } - } else { - con = cosz - this.sin_p12 * Math.sin(lat); - if ((Math.abs(con) < Proj4js.common.EPSLN) && (Math.abs(p.x) < Proj4js.common.EPSLN)) { - //no-op, just keep the lon value as is - } else { - var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh)); - lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh))); - } - } - } - - p.x = lon; - p.y = lat; - return p; - } -}; -/* ====================================================================== - projCode/moll.js - ====================================================================== */ - -/******************************************************************************* -NAME MOLLWEIDE - -PURPOSE: Transforms input longitude and latitude to Easting and - Northing for the MOllweide projection. The - longitude and latitude must be in radians. The Easting - and Northing values will be returned in meters. - -PROGRAMMER DATE ----------- ---- -D. Steinwand, EROS May, 1991; Updated Sept, 1992; Updated Feb, 1993 -S. Nelson, EDC Jun, 2993; Made corrections in precision and - number of iterations. - -ALGORITHM REFERENCES - -1. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", - U.S. Geological Survey Professional Paper 1453 , United State Government - Printing Office, Washington D.C., 1989. - -2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological - Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United - State Government Printing Office, Washington D.C., 1987. -*******************************************************************************/ - -Proj4js.Proj.moll = { - - /* Initialize the Mollweide projection - ------------------------------------*/ - init: function(){ - //no-op - }, - - /* Mollweide forward equations--mapping lat,long to x,y - ----------------------------------------------------*/ - forward: function(p) { - - /* Forward equations - -----------------*/ - var lon=p.x; - var lat=p.y; - - var delta_lon = Proj4js.common.adjust_lon(lon - this.long0); - var theta = lat; - var con = Proj4js.common.PI * Math.sin(lat); - - /* Iterate using the Newton-Raphson method to find theta - -----------------------------------------------------*/ - for (var i=0;true;i++) { - var delta_theta = -(theta + Math.sin(theta) - con)/ (1.0 + Math.cos(theta)); - theta += delta_theta; - if (Math.abs(delta_theta) < Proj4js.common.EPSLN) break; - if (i >= 50) { - Proj4js.reportError("moll:Fwd:IterationError"); - //return(241); - } - } - theta /= 2.0; - - /* If the latitude is 90 deg, force the x coordinate to be "0 + false easting" - this is done here because of precision problems with "cos(theta)" - --------------------------------------------------------------------------*/ - if (Proj4js.common.PI/2 - Math.abs(lat) < Proj4js.common.EPSLN) delta_lon =0; - var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0; - var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0; - - p.x=x; - p.y=y; - return p; - }, - - inverse: function(p){ - var theta; - var arg; - - /* Inverse equations - -----------------*/ - p.x-= this.x0; - //~ p.y -= this.y0; - var arg = p.y / (1.4142135623731 * this.a); - - /* Because of division by zero problems, 'arg' can not be 1.0. Therefore - a number very close to one is used instead. - -------------------------------------------------------------------*/ - if(Math.abs(arg) > 0.999999999999) arg=0.999999999999; - var theta =Math.asin(arg); - var lon = Proj4js.common.adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta)))); - if(lon < (-Proj4js.common.PI)) lon= -Proj4js.common.PI; - if(lon > Proj4js.common.PI) lon= Proj4js.common.PI; - arg = (2.0 * theta + Math.sin(2.0 * theta)) / Proj4js.common.PI; - if(Math.abs(arg) > 1.0)arg=1.0; - var lat = Math.asin(arg); - //return(OK); - - p.x=lon; - p.y=lat; - return p; - } -}; - diff --git a/WebContent/js/vendor/proj4js/proj4.js b/WebContent/js/vendor/proj4js/proj4.js new file mode 100644 index 0000000..cf126ea --- /dev/null +++ b/WebContent/js/vendor/proj4js/proj4.js @@ -0,0 +1,3 @@ +!function(a){if("object"==typeof exports)module.exports=a();else if("function"==typeof define&&define.amd)define(a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.proj4=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;gf;f++)if(!b||2!==f||void 0!==c.z)switch(0===f?(d=g,e="x"):1===f?(d=h,e="y"):(d=i,e="z"),a.axis[f]){case"e":c[e]=d;break;case"w":c[e]=-d;break;case"n":c[e]=d;break;case"s":c[e]=-d;break;case"u":void 0!==c[e]&&(c.z=d);break;case"d":void 0!==c[e]&&(c.z=-d);break;default:return null}return c}},{}],4:[function(a,b,c){var d=Math.PI/2,e=a("./sign");b.exports=function(a){return Math.abs(a)1&&(a=a>1?1:-1),Math.asin(a)}},{}],7:[function(a,b,c){b.exports=function(a){return 1-.25*a*(1+a/16*(3+1.25*a))}},{}],8:[function(a,b,c){b.exports=function(a){return.375*a*(1+.25*a*(1+.46875*a))}},{}],9:[function(a,b,c){b.exports=function(a){return.05859375*a*a*(1+.75*a)}},{}],10:[function(a,b,c){b.exports=function(a){return a*a*a*(35/3072)}},{}],11:[function(a,b,c){b.exports=function(a,b,c){var d=b*c;return a/Math.sqrt(1-d*d)}},{}],12:[function(a,b,c){b.exports=function(a,b,c,d,e){var f,g;f=a/b;for(var h=0;15>h;h++)if(g=(a-(b*f-c*Math.sin(2*f)+d*Math.sin(4*f)-e*Math.sin(6*f)))/(b-2*c*Math.cos(2*f)+4*d*Math.cos(4*f)-6*e*Math.cos(6*f)),f+=g,Math.abs(g)<=1e-10)return f;return 0/0}},{}],13:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b){var c=1-(1-a*a)/(2*a)*Math.log((1-a)/(1+a));if(Math.abs(Math.abs(b)-c)<1e-6)return 0>b?-1*d:d;for(var e,f,g,h,i=Math.asin(.5*b),j=0;30>j;j++)if(f=Math.sin(i),g=Math.cos(i),h=a*f,e=Math.pow(1-h*h,2)/(2*g)*(b/(1-a*a)-f/(1-h*h)+.5/a*Math.log((1-h)/(1+h))),i+=e,Math.abs(e)<=1e-10)return i;return 0/0}},{}],14:[function(a,b,c){b.exports=function(a,b,c,d,e){return a*e-b*Math.sin(2*e)+c*Math.sin(4*e)-d*Math.sin(6*e)}},{}],15:[function(a,b,c){b.exports=function(a,b,c){var d=a*b;return c/Math.sqrt(1-d*d)}},{}],16:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b){for(var c,e,f=.5*a,g=d-2*Math.atan(b),h=0;15>=h;h++)if(c=a*Math.sin(g),e=d-2*Math.atan(b*Math.pow((1-c)/(1+c),f))-g,g+=e,Math.abs(e)<=1e-10)return g;return-9999}},{}],17:[function(a,b,c){var d=1,e=.25,f=.046875,g=.01953125,h=.01068115234375,i=.75,j=.46875,k=.013020833333333334,l=.007120768229166667,m=.3645833333333333,n=.005696614583333333,o=.3076171875;b.exports=function(a){var b=[];b[0]=d-a*(e+a*(f+a*(g+a*h))),b[1]=a*(i-a*(f+a*(g+a*h)));var c=a*a;return b[2]=c*(j-a*(k+a*l)),c*=a,b[3]=c*(m-a*n),b[4]=c*a*o,b}},{}],18:[function(a,b,c){var d=a("./pj_mlfn"),e=1e-10,f=20;b.exports=function(a,b,c){for(var g=1/(1-b),h=a,i=f;i;--i){var j=Math.sin(h),k=1-b*j*j;if(k=(d(h,j,Math.cos(h),c)-a)*k*Math.sqrt(k)*g,h-=k,Math.abs(k)1e-7?(c=a*b,(1-a*a)*(b/(1-c*c)-.5/a*Math.log((1-c)/(1+c)))):2*b}},{}],21:[function(a,b,c){b.exports=function(a){return 0>a?-1:1}},{}],22:[function(a,b,c){b.exports=function(a,b){return Math.pow((1-a)/(1+a),b)}},{}],23:[function(a,b,c){b.exports=function(a){var b={x:a[0],y:a[1]};return a.length>2&&(b.z=a[2]),a.length>3&&(b.m=a[3]),b}},{}],24:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b,c){var e=a*c,f=.5*a;return e=Math.pow((1-e)/(1+e),f),Math.tan(.5*(d-b))/e}},{}],25:[function(a,b,c){c.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},c.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},c.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},c.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},c.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},c.potsdam={towgs84:"606.0,23.0,413.0",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},c.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},c.hermannskogel={towgs84:"653.0,-212.0,449.0",ellipse:"bessel",datumName:"Hermannskogel"},c.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},c.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},c.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},c.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},c.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},c.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},c.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},c.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"}},{}],26:[function(a,b,c){c.MERIT={a:6378137,rf:298.257,ellipseName:"MERIT 1983"},c.SGS85={a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},c.GRS80={a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},c.IAU76={a:6378140,rf:298.257,ellipseName:"IAU 1976"},c.airy={a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},c.APL4={a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},c.NWL9D={a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},c.mod_airy={a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},c.andrae={a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},c.aust_SA={a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},c.GRS67={a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},c.bessel={a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},c.bess_nam={a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},c.clrk66={a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},c.clrk80={a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},c.clrk58={a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},c.CPM={a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},c.delmbr={a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},c.engelis={a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},c.evrst30={a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},c.evrst48={a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},c.evrst56={a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},c.evrst69={a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},c.evrstSS={a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},c.fschr60={a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},c.fschr60m={a:6378155,rf:298.3,ellipseName:"Fischer 1960"},c.fschr68={a:6378150,rf:298.3,ellipseName:"Fischer 1968"},c.helmert={a:6378200,rf:298.3,ellipseName:"Helmert 1906"},c.hough={a:6378270,rf:297,ellipseName:"Hough"},c.intl={a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},c.kaula={a:6378163,rf:298.24,ellipseName:"Kaula 1961"},c.lerch={a:6378139,rf:298.257,ellipseName:"Lerch 1979"},c.mprts={a:6397300,rf:191,ellipseName:"Maupertius 1738"},c.new_intl={a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},c.plessis={a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},c.krass={a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},c.SEasia={a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},c.walbeck={a:6376896,b:6355834.8467,ellipseName:"Walbeck"},c.WGS60={a:6378165,rf:298.3,ellipseName:"WGS 60"},c.WGS66={a:6378145,rf:298.25,ellipseName:"WGS 66"},c.WGS7={a:6378135,rf:298.26,ellipseName:"WGS 72"},c.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"},c.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"}},{}],27:[function(a,b,c){c.greenwich=0,c.lisbon=-9.131906111111,c.paris=2.337229166667,c.bogota=-74.080916666667,c.madrid=-3.687938888889,c.rome=12.452333333333,c.bern=7.439583333333,c.jakarta=106.807719444444,c.ferro=-17.666666666667,c.brussels=4.367975,c.stockholm=18.058277777778,c.athens=23.7163375,c.oslo=10.722916666667},{}],28:[function(a,b,c){c.ft={to_meter:.3048},c["us-ft"]={to_meter:1200/3937}},{}],29:[function(a,b,c){function d(a,b,c){var d;return Array.isArray(c)?(d=g(a,b,c),3===c.length?[d.x,d.y,d.z]:[d.x,d.y]):g(a,b,c)}function e(a){return a instanceof f?a:a.oProj?a.oProj:f(a)}function proj4(a,b,c){a=e(a);var f,g=!1;return"undefined"==typeof b?(b=a,a=h,g=!0):("undefined"!=typeof b.x||Array.isArray(b))&&(c=b,b=a,a=h,g=!0),b=e(b),c?d(a,b,c):(f={forward:function(c){return d(a,b,c)},inverse:function(c){return d(b,a,c)}},g&&(f.oProj=b),f)}var f=a("./Proj"),g=a("./transform"),h=f("WGS84");b.exports=proj4},{"./Proj":2,"./transform":65}],30:[function(a,b,c){var d=Math.PI/2,e=1,f=2,g=3,h=4,i=5,j=484813681109536e-20,k=1.0026,l=.3826834323650898,m=function(a){if(!(this instanceof m))return new m(a);if(this.datum_type=h,a){if(a.datumCode&&"none"===a.datumCode&&(this.datum_type=i),a.datum_params){for(var b=0;b3&&(0!==a.datum_params[3]||0!==a.datum_params[4]||0!==a.datum_params[5]||0!==a.datum_params[6])&&(this.datum_type=f,a.datum_params[3]*=j,a.datum_params[4]*=j,a.datum_params[5]*=j,a.datum_params[6]=a.datum_params[6]/1e6+1)}this.datum_type=a.grids?g:this.datum_type,this.a=a.a,this.b=a.b,this.es=a.es,this.ep2=a.ep2,this.datum_params=a.datum_params,this.datum_type===g&&(this.grids=a.grids)}};m.prototype={compare_datums:function(a){return this.datum_type!==a.datum_type?!1:this.a!==a.a||Math.abs(this.es-a.es)>5e-11?!1:this.datum_type===e?this.datum_params[0]===a.datum_params[0]&&this.datum_params[1]===a.datum_params[1]&&this.datum_params[2]===a.datum_params[2]:this.datum_type===f?this.datum_params[0]===a.datum_params[0]&&this.datum_params[1]===a.datum_params[1]&&this.datum_params[2]===a.datum_params[2]&&this.datum_params[3]===a.datum_params[3]&&this.datum_params[4]===a.datum_params[4]&&this.datum_params[5]===a.datum_params[5]&&this.datum_params[6]===a.datum_params[6]:this.datum_type===g||a.datum_type===g?this.nadgrids===a.nadgrids:!0},geodetic_to_geocentric:function(a){var b,c,e,f,g,h,i,j=a.x,k=a.y,l=a.z?a.z:0,m=0;if(-d>k&&k>-1.001*d)k=-d;else if(k>d&&1.001*d>k)k=d;else if(-d>k||k>d)return null;return j>Math.PI&&(j-=2*Math.PI),g=Math.sin(k),i=Math.cos(k),h=g*g,f=this.a/Math.sqrt(1-this.es*h),b=(f+l)*i*Math.cos(j),c=(f+l)*i*Math.sin(j),e=(f*(1-this.es)+l)*g,a.x=b,a.y=c,a.z=e,m},geocentric_to_geodetic:function(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t=1e-12,u=t*t,v=30,w=a.x,x=a.y,y=a.z?a.z:0;if(o=!1,b=Math.sqrt(w*w+x*x),c=Math.sqrt(w*w+x*x+y*y),b/this.au&&v>p);return r=Math.atan(m/Math.abs(l)),a.x=q,a.y=r,a.z=s,a},geocentric_to_geodetic_noniter:function(a){var b,c,e,f,g,h,i,j,m,n,o,p,q,r,s,t,u,v=a.x,w=a.y,x=a.z?a.z:0;if(v=parseFloat(v),w=parseFloat(w),x=parseFloat(x),u=!1,0!==v)b=Math.atan2(w,v);else if(w>0)b=d;else if(0>w)b=-d;else if(u=!0,b=0,x>0)c=d;else{if(!(0>x))return c=d,void(e=-this.b);c=-d}return g=v*v+w*w,f=Math.sqrt(g),h=x*k,j=Math.sqrt(h*h+g),n=h/j,p=f/j,o=n*n*n,i=x+this.b*this.ep2*o,t=f-this.a*this.es*p*p*p,m=Math.sqrt(i*i+t*t),q=i/m,r=t/m,s=this.a/Math.sqrt(1-this.es*q*q),e=r>=l?f/r-s:-l>=r?f/-r-s:x/q+s*(this.es-1),u===!1&&(c=Math.atan(q/r)),a.x=b,a.y=c,a.z=e,a},geocentric_to_wgs84:function(a){if(this.datum_type===e)a.x+=this.datum_params[0],a.y+=this.datum_params[1],a.z+=this.datum_params[2];else if(this.datum_type===f){var b=this.datum_params[0],c=this.datum_params[1],d=this.datum_params[2],g=this.datum_params[3],h=this.datum_params[4],i=this.datum_params[5],j=this.datum_params[6],k=j*(a.x-i*a.y+h*a.z)+b,l=j*(i*a.x+a.y-g*a.z)+c,m=j*(-h*a.x+g*a.y+a.z)+d;a.x=k,a.y=l,a.z=m}},geocentric_from_wgs84:function(a){if(this.datum_type===e)a.x-=this.datum_params[0],a.y-=this.datum_params[1],a.z-=this.datum_params[2];else if(this.datum_type===f){var b=this.datum_params[0],c=this.datum_params[1],d=this.datum_params[2],g=this.datum_params[3],h=this.datum_params[4],i=this.datum_params[5],j=this.datum_params[6],k=(a.x-b)/j,l=(a.y-c)/j,m=(a.z-d)/j;a.x=k+i*l-h*m,a.y=-i*k+l+g*m,a.z=h*k-g*l+m}}},b.exports=m},{}],31:[function(a,b,c){var d=1,e=2,f=3,g=5,h=6378137,i=.006694379990141316;b.exports=function(a,b,c){function j(a){return a===d||a===e}var k,l,m;if(a.compare_datums(b))return c;if(a.datum_type===g||b.datum_type===g)return c;var n=a.a,o=a.es,p=b.a,q=b.es,r=a.datum_type;if(r===f)if(0===this.apply_gridshift(a,0,c))a.a=h,a.es=i;else{if(!a.datum_params)return a.a=n,a.es=a.es,c;for(k=1,l=0,m=a.datum_params.length;m>l;l++)k*=a.datum_params[l];if(0===k)return a.a=n,a.es=a.es,c;r=a.datum_params.length>3?e:d}return b.datum_type===f&&(b.a=h,b.es=i),(a.es!==b.es||a.a!==b.a||j(r)||j(b.datum_type))&&(a.geodetic_to_geocentric(c),j(a.datum_type)&&a.geocentric_to_wgs84(c),j(b.datum_type)&&b.geocentric_from_wgs84(c),b.geocentric_to_geodetic(c)),b.datum_type===f&&this.apply_gridshift(b,1,c),a.a=n,a.es=o,b.a=p,b.es=q,c}},{}],32:[function(a,b,c){function d(a){var b=this;if(2===arguments.length){var c=arguments[1];d[a]="string"==typeof c?"+"===c.charAt(0)?f(arguments[1]):g(arguments[1]):c}else if(1===arguments.length){if(Array.isArray(a))return a.map(function(a){Array.isArray(a)?d.apply(b,a):d(a)});if("string"==typeof a){if(a in d)return d[a]}else"EPSG"in a?d["EPSG:"+a.EPSG]=a:"ESRI"in a?d["ESRI:"+a.ESRI]=a:"IAU2000"in a?d["IAU2000:"+a.IAU2000]=a:console.log(a);return}}var e=a("./global"),f=a("./projString"),g=a("./wkt");e(d),b.exports=d},{"./global":35,"./projString":38,"./wkt":66}],33:[function(a,b,c){var d=a("./constants/Datum"),e=a("./constants/Ellipsoid"),f=a("./extend"),g=a("./datum"),h=1e-10,i=.16666666666666666,j=.04722222222222222,k=.022156084656084655;b.exports=function(a){if(a.datumCode&&"none"!==a.datumCode){var b=d[a.datumCode];b&&(a.datum_params=b.towgs84?b.towgs84.split(","):null,a.ellps=b.ellipse,a.datumName=b.datumName?b.datumName:a.datumCode)}if(!a.a){var c=e[a.ellps]?e[a.ellps]:e.WGS84;f(a,c)}return a.rf&&!a.b&&(a.b=(1-1/a.rf)*a.a),(0===a.rf||Math.abs(a.a-a.b)d?(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},c.forward=function(a){var b=a.x,c=a.y;this.sin_phi=Math.sin(c),this.cos_phi=Math.cos(c);var d=f(this.e3,this.sin_phi,this.cos_phi),e=this.a*Math.sqrt(this.c-this.ns0*d)/this.ns0,h=this.ns0*g(b-this.long0),i=e*Math.sin(h)+this.x0,j=this.rh-e*Math.cos(h)+this.y0;return a.x=i,a.y=j,a},c.inverse=function(a){var b,c,d,e,f,h;return a.x-=this.x0,a.y=this.rh-a.y+this.y0,this.ns0>=0?(b=Math.sqrt(a.x*a.x+a.y*a.y),d=1):(b=-Math.sqrt(a.x*a.x+a.y*a.y),d=-1),e=0,0!==b&&(e=Math.atan2(d*a.x,d*a.y)),d=b*this.ns0/this.a,this.sphere?h=Math.asin((this.c-d*d)/(2*this.ns0)):(c=(this.c-d*d)/this.ns0,h=this.phi1z(this.e3,c)),f=g(e/this.ns0+this.long0),a.x=f,a.y=h,a},c.phi1z=function(a,b){var c,e,f,g,i,j=h(.5*b);if(d>a)return j;for(var k=a*a,l=1;25>=l;l++)if(c=Math.sin(j),e=Math.cos(j),f=a*c,g=1-f*f,i=.5*g*g/e*(b/(1-k)-c/g+.5/a*Math.log((1-f)/(1+f))),j+=i,Math.abs(i)<=1e-7)return j;return null},c.names=["Albers_Conic_Equal_Area","Albers","aea"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/msfnz":15,"../common/qsfnz":20}],41:[function(a,b,c){var d=a("../common/adjust_lon"),e=Math.PI/2,f=1e-10,g=a("../common/mlfn"),h=a("../common/e0fn"),i=a("../common/e1fn"),j=a("../common/e2fn"),k=a("../common/e3fn"),l=a("../common/gN"),m=a("../common/asinz"),n=a("../common/imlfn");c.init=function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},c.forward=function(a){var b,c,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H=a.x,I=a.y,J=Math.sin(a.y),K=Math.cos(a.y),L=d(H-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=f?(a.x=this.x0+this.a*(e-I)*Math.sin(L),a.y=this.y0-this.a*(e-I)*Math.cos(L),a):Math.abs(this.sin_p12+1)<=f?(a.x=this.x0+this.a*(e+I)*Math.sin(L),a.y=this.y0+this.a*(e+I)*Math.cos(L),a):(B=this.sin_p12*J+this.cos_p12*K*Math.cos(L),z=Math.acos(B),A=z/Math.sin(z),a.x=this.x0+this.a*A*K*Math.sin(L),a.y=this.y0+this.a*A*(this.cos_p12*J-this.sin_p12*K*Math.cos(L)),a):(b=h(this.es),c=i(this.es),m=j(this.es),n=k(this.es),Math.abs(this.sin_p12-1)<=f?(o=this.a*g(b,c,m,n,e),p=this.a*g(b,c,m,n,I),a.x=this.x0+(o-p)*Math.sin(L),a.y=this.y0-(o-p)*Math.cos(L),a):Math.abs(this.sin_p12+1)<=f?(o=this.a*g(b,c,m,n,e),p=this.a*g(b,c,m,n,I),a.x=this.x0+(o+p)*Math.sin(L),a.y=this.y0+(o+p)*Math.cos(L),a):(q=J/K,r=l(this.a,this.e,this.sin_p12),s=l(this.a,this.e,J),t=Math.atan((1-this.es)*q+this.es*r*this.sin_p12/(s*K)),u=Math.atan2(Math.sin(L),this.cos_p12*Math.tan(t)-this.sin_p12*Math.cos(L)),C=0===u?Math.asin(this.cos_p12*Math.sin(t)-this.sin_p12*Math.cos(t)):Math.abs(Math.abs(u)-Math.PI)<=f?-Math.asin(this.cos_p12*Math.sin(t)-this.sin_p12*Math.cos(t)):Math.asin(Math.sin(L)*Math.cos(t)/Math.sin(u)),v=this.e*this.sin_p12/Math.sqrt(1-this.es),w=this.e*this.cos_p12*Math.cos(u)/Math.sqrt(1-this.es),x=v*w,y=w*w,D=C*C,E=D*C,F=E*C,G=F*C,z=r*C*(1-D*y*(1-y)/6+E/8*x*(1-2*y)+F/120*(y*(4-7*y)-3*v*v*(1-7*y))-G/48*x),a.x=this.x0+z*Math.sin(u),a.y=this.y0+z*Math.cos(u),a))},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I;if(this.sphere){if(b=Math.sqrt(a.x*a.x+a.y*a.y),b>2*e*this.a)return;return c=b/this.a,o=Math.sin(c),p=Math.cos(c),q=this.long0,Math.abs(b)<=f?r=this.lat0:(r=m(p*this.sin_p12+a.y*o*this.cos_p12/b),s=Math.abs(this.lat0)-e,q=d(Math.abs(s)<=f?this.lat0>=0?this.long0+Math.atan2(a.x,-a.y):this.long0-Math.atan2(-a.x,a.y):this.long0+Math.atan2(a.x*o,b*this.cos_p12*p-a.y*this.sin_p12*o))),a.x=q,a.y=r,a}return t=h(this.es),u=i(this.es),v=j(this.es),w=k(this.es),Math.abs(this.sin_p12-1)<=f?(x=this.a*g(t,u,v,w,e),b=Math.sqrt(a.x*a.x+a.y*a.y),y=x-b,r=n(y/this.a,t,u,v,w),q=d(this.long0+Math.atan2(a.x,-1*a.y)),a.x=q,a.y=r,a):Math.abs(this.sin_p12+1)<=f?(x=this.a*g(t,u,v,w,e),b=Math.sqrt(a.x*a.x+a.y*a.y),y=b-x,r=n(y/this.a,t,u,v,w),q=d(this.long0+Math.atan2(a.x,a.y)),a.x=q,a.y=r,a):(b=Math.sqrt(a.x*a.x+a.y*a.y),B=Math.atan2(a.x,a.y),z=l(this.a,this.e,this.sin_p12),C=Math.cos(B),D=this.e*this.cos_p12*C,E=-D*D/(1-this.es),F=3*this.es*(1-E)*this.sin_p12*this.cos_p12*C/(1-this.es),G=b/z,H=G-E*(1+E)*Math.pow(G,3)/6-F*(1+3*E)*Math.pow(G,4)/24,I=1-E*H*H/2-G*H*H*H/6,A=Math.asin(this.sin_p12*Math.cos(H)+this.cos_p12*Math.sin(H)*C),q=d(this.long0+Math.asin(Math.sin(B)*Math.sin(H)/Math.cos(A))),r=Math.atan((1-this.es*I*this.sin_p12/Math.sin(A))*Math.tan(A)/(1-this.es)),a.x=q,a.y=r,a)},c.names=["Azimuthal_Equidistant","aeqd"]},{"../common/adjust_lon":5,"../common/asinz":6,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],42:[function(a,b,c){var d=a("../common/mlfn"),e=a("../common/e0fn"),f=a("../common/e1fn"),g=a("../common/e2fn"),h=a("../common/e3fn"),i=a("../common/gN"),j=a("../common/adjust_lon"),k=a("../common/adjust_lat"),l=a("../common/imlfn"),m=Math.PI/2,n=1e-10;c.init=function(){this.sphere||(this.e0=e(this.es),this.e1=f(this.es),this.e2=g(this.es),this.e3=h(this.es),this.ml0=this.a*d(this.e0,this.e1,this.e2,this.e3,this.lat0))},c.forward=function(a){var b,c,e=a.x,f=a.y;if(e=j(e-this.long0),this.sphere)b=this.a*Math.asin(Math.cos(f)*Math.sin(e)),c=this.a*(Math.atan2(Math.tan(f),Math.cos(e))-this.lat0);else{var g=Math.sin(f),h=Math.cos(f),k=i(this.a,this.e,g),l=Math.tan(f)*Math.tan(f),m=e*Math.cos(f),n=m*m,o=this.es*h*h/(1-this.es),p=this.a*d(this.e0,this.e1,this.e2,this.e3,f);b=k*m*(1-n*l*(1/6-(8-l+8*o)*n/120)),c=p-this.ml0+k*g/h*n*(.5+(5-l+6*o)*n/24)}return a.x=b+this.x0,a.y=c+this.y0,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,d=a.x/this.a,e=a.y/this.a;if(this.sphere){var f=e+this.lat0;b=Math.asin(Math.sin(f)*Math.cos(d)),c=Math.atan2(Math.tan(d),Math.cos(f))}else{var g=this.ml0/this.a+e,h=l(g,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(h)-m)<=n)return a.x=this.long0,a.y=m,0>e&&(a.y*=-1),a;var o=i(this.a,this.e,Math.sin(h)),p=o*o*o/this.a/this.a*(1-this.es),q=Math.pow(Math.tan(h),2),r=d*this.a/o,s=r*r;b=h-o*Math.tan(h)/p*r*r*(.5-(1+3*q)*r*r/24),c=r*(1-s*(q/3+(1+3*q)*q*s/15))/Math.cos(h)}return a.x=j(c+this.long0),a.y=k(b),a},c.names=["Cassini","Cassini_Soldner","cass"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/gN":11,"../common/imlfn":12,"../common/mlfn":14}],43:[function(a,b,c){var d=a("../common/adjust_lon"),e=a("../common/qsfnz"),f=a("../common/msfnz"),g=a("../common/iqsfnz");c.init=function(){this.sphere||(this.k0=f(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},c.forward=function(a){var b,c,f=a.x,g=a.y,h=d(f-this.long0);if(this.sphere)b=this.x0+this.a*h*Math.cos(this.lat_ts),c=this.y0+this.a*Math.sin(g)/Math.cos(this.lat_ts);else{var i=e(this.e,Math.sin(g));b=this.x0+this.a*this.k0*h,c=this.y0+this.a*i*.5/this.k0}return a.x=b,a.y=c,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c;return this.sphere?(b=d(this.long0+a.x/this.a/Math.cos(this.lat_ts)),c=Math.asin(a.y/this.a*Math.cos(this.lat_ts))):(c=g(this.e,2*a.y*this.k0/this.a),b=d(this.long0+a.x/(this.a*this.k0))),a.x=b,a.y=c,a},c.names=["cea"]},{"../common/adjust_lon":5,"../common/iqsfnz":13,"../common/msfnz":15,"../common/qsfnz":20}],44:[function(a,b,c){var d=a("../common/adjust_lon"),e=a("../common/adjust_lat");c.init=function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},c.forward=function(a){var b=a.x,c=a.y,f=d(b-this.long0),g=e(c-this.lat0);return a.x=this.x0+this.a*f*this.rc,a.y=this.y0+this.a*g,a},c.inverse=function(a){var b=a.x,c=a.y;return a.x=d(this.long0+(b-this.x0)/(this.a*this.rc)),a.y=e(this.lat0+(c-this.y0)/this.a),a},c.names=["Equirectangular","Equidistant_Cylindrical","eqc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5}],45:[function(a,b,c){var d=a("../common/e0fn"),e=a("../common/e1fn"),f=a("../common/e2fn"),g=a("../common/e3fn"),h=a("../common/msfnz"),i=a("../common/mlfn"),j=a("../common/adjust_lon"),k=a("../common/adjust_lat"),l=a("../common/imlfn"),m=1e-10;c.init=function(){Math.abs(this.lat1+this.lat2)=0?(c=Math.sqrt(a.x*a.x+a.y*a.y),b=1):(c=-Math.sqrt(a.x*a.x+a.y*a.y),b=-1);var f=0;if(0!==c&&(f=Math.atan2(b*a.x,b*a.y)),this.sphere)return e=j(this.long0+f/this.ns),d=k(this.g-c/this.a),a.x=e,a.y=d,a;var g=this.g-c/this.a;return d=l(g,this.e0,this.e1,this.e2,this.e3),e=j(this.long0+f/this.ns),a.x=e,a.y=d,a},c.names=["Equidistant_Conic","eqdc"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/e0fn":7,"../common/e1fn":8,"../common/e2fn":9,"../common/e3fn":10,"../common/imlfn":12,"../common/mlfn":14,"../common/msfnz":15}],46:[function(a,b,c){var d=Math.PI/4,e=a("../common/srat"),f=Math.PI/2,g=20;c.init=function(){var a=Math.sin(this.lat0),b=Math.cos(this.lat0);b*=b,this.rc=Math.sqrt(1-this.es)/(1-this.es*a*a),this.C=Math.sqrt(1+this.es*b*b/(1-this.es)),this.phic0=Math.asin(a/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+d)/(Math.pow(Math.tan(.5*this.lat0+d),this.C)*e(this.e*a,this.ratexp))},c.forward=function(a){var b=a.x,c=a.y;return a.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*c+d),this.C)*e(this.e*Math.sin(c),this.ratexp))-f,a.x=this.C*b,a},c.inverse=function(a){for(var b=1e-14,c=a.x/this.C,h=a.y,i=Math.pow(Math.tan(.5*h+d)/this.K,1/this.C),j=g;j>0&&(h=2*Math.atan(i*e(this.e*Math.sin(a.y),-.5*this.e))-f,!(Math.abs(h-a.y)0||Math.abs(i)<=e?(j=this.x0+this.a*h*c*Math.sin(f)/i,k=this.y0+this.a*h*(this.cos_p14*b-this.sin_p14*c*g)/i):(j=this.x0+this.infinity_dist*c*Math.sin(f),k=this.y0+this.infinity_dist*(this.cos_p14*b-this.sin_p14*c*g)),a.x=j,a.y=k,a},c.inverse=function(a){var b,c,e,g,h,i;return a.x=(a.x-this.x0)/this.a,a.y=(a.y-this.y0)/this.a,a.x/=this.k0,a.y/=this.k0,(b=Math.sqrt(a.x*a.x+a.y*a.y))?(g=Math.atan2(b,this.rc),c=Math.sin(g),e=Math.cos(g),i=f(e*this.sin_p14+a.y*c*this.cos_p14/b),h=Math.atan2(a.x*c,b*this.cos_p14*e-a.y*this.sin_p14*c),h=d(this.long0+h)):(i=this.phic0,h=0),a.x=h,a.y=i,a},c.names=["gnom"]},{"../common/adjust_lon":5,"../common/asinz":6}],48:[function(a,b,c){var d=a("../common/adjust_lon");c.init=function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},c.forward=function(a){var b,c,e,f,g,h,i,j=a.x,k=a.y,l=d(j-this.long0);return b=Math.pow((1+this.e*Math.sin(k))/(1-this.e*Math.sin(k)),this.alfa*this.e/2),c=2*(Math.atan(this.k*Math.pow(Math.tan(k/2+this.s45),this.alfa)/b)-this.s45),e=-l*this.alfa,f=Math.asin(Math.cos(this.ad)*Math.sin(c)+Math.sin(this.ad)*Math.cos(c)*Math.cos(e)),g=Math.asin(Math.cos(c)*Math.sin(e)/Math.cos(f)),h=this.n*g,i=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(f/2+this.s45),this.n),a.y=i*Math.cos(h)/1,a.x=i*Math.sin(h)/1,this.czech||(a.y*=-1,a.x*=-1),a},c.inverse=function(a){var b,c,d,e,f,g,h,i,j=a.x;a.x=a.y,a.y=j,this.czech||(a.y*=-1,a.x*=-1),g=Math.sqrt(a.x*a.x+a.y*a.y),f=Math.atan2(a.y,a.x),e=f/Math.sin(this.s0),d=2*(Math.atan(Math.pow(this.ro0/g,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),b=Math.asin(Math.cos(this.ad)*Math.sin(d)-Math.sin(this.ad)*Math.cos(d)*Math.cos(e)),c=Math.asin(Math.cos(d)*Math.sin(e)/Math.cos(b)),a.x=this.long0-c/this.alfa,h=b,i=0;var k=0;do a.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(b/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(h))/(1-this.e*Math.sin(h)),this.e/2))-this.s45),Math.abs(h-a.y)<1e-10&&(i=1),h=a.y,k+=1;while(0===i&&15>k);return k>=15?null:a},c.names=["Krovak","krovak"]},{"../common/adjust_lon":5}],49:[function(a,b,c){var d=Math.PI/2,e=Math.PI/4,f=1e-10,g=a("../common/qsfnz"),h=a("../common/adjust_lon");c.S_POLE=1,c.N_POLE=2,c.EQUIT=3,c.OBLIQ=4,c.init=function(){var a=Math.abs(this.lat0);if(this.mode=Math.abs(a-d)0){var b;switch(this.qp=g(this.e,1),this.mmf=.5/(1-this.es),this.apa=this.authset(this.es),this.mode){case this.N_POLE:this.dd=1;break;case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),b=Math.sin(this.lat0),this.sinb1=g(this.e,b)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*b*b)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},c.forward=function(a){var b,c,i,j,k,l,m,n,o,p,q=a.x,r=a.y;if(q=h(q-this.long0),this.sphere){if(k=Math.sin(r),p=Math.cos(r),i=Math.cos(q),this.mode===this.OBLIQ||this.mode===this.EQUIT){if(c=this.mode===this.EQUIT?1+p*i:1+this.sinph0*k+this.cosph0*p*i,f>=c)return null;c=Math.sqrt(2/c),b=c*p*Math.sin(q),c*=this.mode===this.EQUIT?k:this.cosph0*k-this.sinph0*p*i}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(i=-i),Math.abs(r+this.phi0)=0?(b=(o=Math.sqrt(l))*j,c=i*(this.mode===this.S_POLE?o:-o)):b=c=0}}return a.x=this.a*b+this.x0,a.y=this.a*c+this.y0,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,e,g,i,j,k,l=a.x/this.a,m=a.y/this.a;if(this.sphere){var n,o=0,p=0;if(n=Math.sqrt(l*l+m*m),c=.5*n,c>1)return null;switch(c=2*Math.asin(c),(this.mode===this.OBLIQ||this.mode===this.EQUIT)&&(p=Math.sin(c),o=Math.cos(c)),this.mode){case this.EQUIT:c=Math.abs(n)<=f?0:Math.asin(m*p/n),l*=p,m=o*n;break;case this.OBLIQ:c=Math.abs(n)<=f?this.phi0:Math.asin(o*this.sinph0+m*p*this.cosph0/n),l*=p*this.cosph0,m=(o-Math.sin(c)*this.sinph0)*n;break;case this.N_POLE:m=-m,c=d-c;break;case this.S_POLE:c-=d}b=0!==m||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(l,m):0}else{if(k=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(l/=this.dd,m*=this.dd,j=Math.sqrt(l*l+m*m),f>j)return a.x=0,a.y=this.phi0,a;g=2*Math.asin(.5*j/this.rq),e=Math.cos(g),l*=g=Math.sin(g),this.mode===this.OBLIQ?(k=e*this.sinb1+m*g*this.cosb1/j,i=this.qp*k,m=j*this.cosb1*e-m*this.sinb1*g):(k=m*g/j,i=this.qp*k,m=j*e)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(m=-m),i=l*l+m*m,!i)return a.x=0,a.y=this.phi0,a;k=1-i/this.qp,this.mode===this.S_POLE&&(k=-k)}b=Math.atan2(l,m),c=this.authlat(Math.asin(k),this.apa)}return a.x=h(this.long0+b),a.y=c,a},c.P00=.3333333333333333,c.P01=.17222222222222222,c.P02=.10257936507936508,c.P10=.06388888888888888,c.P11=.0664021164021164,c.P20=.016415012942191543,c.authset=function(a){var b,c=[];return c[0]=a*this.P00,b=a*a,c[0]+=b*this.P01,c[1]=b*this.P10,b*=a,c[0]+=b*this.P02,c[1]+=b*this.P11,c[2]=b*this.P20,c},c.authlat=function(a,b){var c=a+a;return a+b[0]*Math.sin(c)+b[1]*Math.sin(c+c)+b[2]*Math.sin(c+c+c)},c.names=["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"]},{"../common/adjust_lon":5,"../common/qsfnz":20}],50:[function(a,b,c){var d=1e-10,e=a("../common/msfnz"),f=a("../common/tsfnz"),g=Math.PI/2,h=a("../common/sign"),i=a("../common/adjust_lon"),j=a("../common/phi2z");c.init=function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)d?Math.log(g/k)/Math.log(h/l):b,isNaN(this.ns)&&(this.ns=b),this.f0=g/(this.ns*Math.pow(h,this.ns)),this.rh=this.a*this.f0*Math.pow(m,this.ns),this.title||(this.title="Lambert Conformal Conic")}},c.forward=function(a){var b=a.x,c=a.y;Math.abs(2*Math.abs(c)-Math.PI)<=d&&(c=h(c)*(g-2*d));var e,j,k=Math.abs(Math.abs(c)-g);if(k>d)e=f(this.e,c,Math.sin(c)),j=this.a*this.f0*Math.pow(e,this.ns);else{if(k=c*this.ns,0>=k)return null;j=0}var l=this.ns*i(b-this.long0);return a.x=this.k0*j*Math.sin(l)+this.x0,a.y=this.k0*(this.rh-j*Math.cos(l))+this.y0,a},c.inverse=function(a){var b,c,d,e,f,h=(a.x-this.x0)/this.k0,k=this.rh-(a.y-this.y0)/this.k0;this.ns>0?(b=Math.sqrt(h*h+k*k),c=1):(b=-Math.sqrt(h*h+k*k),c=-1);var l=0;if(0!==b&&(l=Math.atan2(c*h,c*k)),0!==b||this.ns>0){if(c=1/this.ns,d=Math.pow(b/(this.a*this.f0),c),e=j(this.e,d),-9999===e)return null}else e=-g;return f=i(l/this.ns+this.long0),a.x=f,a.y=e,a},c.names=["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_2SP","lcc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],51:[function(a,b,c){function d(a){return a}c.init=function(){},c.forward=d,c.inverse=d,c.names=["longlat","identity"]},{}],52:[function(a,b,c){var d=a("../common/msfnz"),e=Math.PI/2,f=1e-10,g=57.29577951308232,h=a("../common/adjust_lon"),i=Math.PI/4,j=a("../common/tsfnz"),k=a("../common/phi2z");c.init=function(){var a=this.b/this.a;this.es=1-a*a,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.k0=this.sphere?Math.cos(this.lat_ts):d(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k0=this.k?this.k:1)},c.forward=function(a){var b=a.x,c=a.y;if(c*g>90&&-90>c*g&&b*g>180&&-180>b*g)return null;var d,k;if(Math.abs(Math.abs(c)-e)<=f)return null;if(this.sphere)d=this.x0+this.a*this.k0*h(b-this.long0),k=this.y0+this.a*this.k0*Math.log(Math.tan(i+.5*c));else{var l=Math.sin(c),m=j(this.e,c,l);d=this.x0+this.a*this.k0*h(b-this.long0),k=this.y0-this.a*this.k0*Math.log(m)}return a.x=d,a.y=k,a},c.inverse=function(a){var b,c,d=a.x-this.x0,f=a.y-this.y0;if(this.sphere)c=e-2*Math.atan(Math.exp(-f/(this.a*this.k0)));else{var g=Math.exp(-f/(this.a*this.k0));if(c=k(this.e,g),-9999===c)return null}return b=h(this.long0+d/(this.a*this.k0)),a.x=b,a.y=c,a},c.names=["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/tsfnz":24}],53:[function(a,b,c){var d=a("../common/adjust_lon");c.init=function(){},c.forward=function(a){var b=a.x,c=a.y,e=d(b-this.long0),f=this.x0+this.a*e,g=this.y0+this.a*Math.log(Math.tan(Math.PI/4+c/2.5))*1.25;return a.x=f,a.y=g,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b=d(this.long0+a.x/this.a),c=2.5*(Math.atan(Math.exp(.8*a.y/this.a))-Math.PI/4);return a.x=b,a.y=c,a},c.names=["Miller_Cylindrical","mill"]},{"../common/adjust_lon":5}],54:[function(a,b,c){var d=a("../common/adjust_lon"),e=1e-10;c.init=function(){},c.forward=function(a){for(var b=a.x,c=a.y,f=d(b-this.long0),g=c,h=Math.PI*Math.sin(c),i=0;!0;i++){var j=-(g+Math.sin(g)-h)/(1+Math.cos(g));if(g+=j,Math.abs(j).999999999999&&(c=.999999999999),b=Math.asin(c);var e=d(this.long0+a.x/(.900316316158*this.a*Math.cos(b)));e<-Math.PI&&(e=-Math.PI),e>Math.PI&&(e=Math.PI),c=(2*b+Math.sin(2*b))/Math.PI,Math.abs(c)>1&&(c=1);var f=Math.asin(c);return a.x=e,a.y=f,a},c.names=["Mollweide","moll"]},{"../common/adjust_lon":5}],55:[function(a,b,c){var d=484813681109536e-20;c.iterations=1,c.init=function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},c.forward=function(a){var b,c=a.x,e=a.y,f=e-this.lat0,g=c-this.long0,h=f/d*1e-5,i=g,j=1,k=0;for(b=1;10>=b;b++)j*=h,k+=this.A[b]*j;var l,m,n=k,o=i,p=1,q=0,r=0,s=0;for(b=1;6>=b;b++)l=p*n-q*o,m=q*n+p*o,p=l,q=m,r=r+this.B_re[b]*p-this.B_im[b]*q,s=s+this.B_im[b]*p+this.B_re[b]*q;return a.x=s*this.a+this.x0,a.y=r*this.a+this.y0,a},c.inverse=function(a){var b,c,e,f=a.x,g=a.y,h=f-this.x0,i=g-this.y0,j=i/this.a,k=h/this.a,l=1,m=0,n=0,o=0;for(b=1;6>=b;b++)c=l*j-m*k,e=m*j+l*k,l=c,m=e,n=n+this.C_re[b]*l-this.C_im[b]*m,o=o+this.C_im[b]*l+this.C_re[b]*m;for(var p=0;p=b;b++)q=s*n-t*o,r=t*n+s*o,s=q,t=r,u+=(b-1)*(this.B_re[b]*s-this.B_im[b]*t),v+=(b-1)*(this.B_im[b]*s+this.B_re[b]*t);s=1,t=0;var w=this.B_re[1],x=this.B_im[1];for(b=2;6>=b;b++)q=s*n-t*o,r=t*n+s*o,s=q,t=r,w+=b*(this.B_re[b]*s-this.B_im[b]*t),x+=b*(this.B_im[b]*s+this.B_re[b]*t);var y=w*w+x*x;n=(u*w+v*x)/y,o=(v*w-u*x)/y}var z=n,A=o,B=1,C=0;for(b=1;9>=b;b++)B*=z,C+=this.D[b]*B;var D=this.lat0+C*d*1e5,E=this.long0+A;return a.x=E,a.y=D,a},c.names=["New_Zealand_Map_Grid","nzmg"]},{}],56:[function(a,b,c){var d=a("../common/tsfnz"),e=a("../common/adjust_lon"),f=a("../common/phi2z"),g=Math.PI/2,h=Math.PI/4,i=1e-10;c.init=function(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var a=Math.sin(this.lat0),b=Math.cos(this.lat0),c=this.e*a;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(b,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-c*c);var f=d(this.e,this.lat0,a),g=this.bl/b*Math.sqrt((1-this.es)/(1-c*c));1>g*g&&(g=1);var h,i;if(isNaN(this.longc)){var j=d(this.e,this.lat1,Math.sin(this.lat1)),k=d(this.e,this.lat2,Math.sin(this.lat2));this.el=this.lat0>=0?(g+Math.sqrt(g*g-1))*Math.pow(f,this.bl):(g-Math.sqrt(g*g-1))*Math.pow(f,this.bl);var l=Math.pow(j,this.bl),m=Math.pow(k,this.bl);h=this.el/l,i=.5*(h-1/h);var n=(this.el*this.el-m*l)/(this.el*this.el+m*l),o=(m-l)/(m+l),p=e(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(n*Math.tan(.5*this.bl*p)/o)/this.bl,this.long0=e(this.long0);var q=e(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*q)/i),this.alpha=Math.asin(g*Math.sin(this.gamma0))}else h=this.lat0>=0?g+Math.sqrt(g*g-1):g-Math.sqrt(g*g-1),this.el=h*Math.pow(f,this.bl),i=.5*(h-1/h),this.gamma0=Math.asin(Math.sin(this.alpha)/g),this.long0=this.longc-Math.asin(i*Math.tan(this.gamma0))/this.bl;this.uc=this.no_off?0:this.lat0>=0?this.al/this.bl*Math.atan2(Math.sqrt(g*g-1),Math.cos(this.alpha)):-1*this.al/this.bl*Math.atan2(Math.sqrt(g*g-1),Math.cos(this.alpha))},c.forward=function(a){var b,c,f,j=a.x,k=a.y,l=e(j-this.long0);if(Math.abs(Math.abs(k)-g)<=i)f=k>0?-1:1,c=this.al/this.bl*Math.log(Math.tan(h+f*this.gamma0*.5)),b=-1*f*g*this.al/this.bl;else{var m=d(this.e,k,Math.sin(k)),n=this.el/Math.pow(m,this.bl),o=.5*(n-1/n),p=.5*(n+1/n),q=Math.sin(this.bl*l),r=(o*Math.sin(this.gamma0)-q*Math.cos(this.gamma0))/p;c=Math.abs(Math.abs(r)-1)<=i?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-r)/(1+r))/this.bl,b=Math.abs(Math.cos(this.bl*l))<=i?this.al*this.bl*l:this.al*Math.atan2(o*Math.cos(this.gamma0)+q*Math.sin(this.gamma0),Math.cos(this.bl*l))/this.bl}return this.no_rot?(a.x=this.x0+b,a.y=this.y0+c):(b-=this.uc,a.x=this.x0+c*Math.cos(this.alpha)+b*Math.sin(this.alpha),a.y=this.y0+b*Math.cos(this.alpha)-c*Math.sin(this.alpha)),a},c.inverse=function(a){var b,c;this.no_rot?(c=a.y-this.y0,b=a.x-this.x0):(c=(a.x-this.x0)*Math.cos(this.alpha)-(a.y-this.y0)*Math.sin(this.alpha),b=(a.y-this.y0)*Math.cos(this.alpha)+(a.x-this.x0)*Math.sin(this.alpha),b+=this.uc);var d=Math.exp(-1*this.bl*c/this.al),h=.5*(d-1/d),j=.5*(d+1/d),k=Math.sin(this.bl*b/this.al),l=(k*Math.cos(this.gamma0)+h*Math.sin(this.gamma0))/j,m=Math.pow(this.el/Math.sqrt((1+l)/(1-l)),1/this.bl);return Math.abs(l-1)g?(g=Math.sin(b),c=this.long0+a.x*Math.sqrt(1-this.es*g*g)/(this.a*Math.cos(b)),f=d(c)):j>g-k&&(f=this.long0)),a.x=f,a.y=b,a},c.names=["Sinusoidal","sinu"]},{"../common/adjust_lat":4,"../common/adjust_lon":5,"../common/asinz":6,"../common/pj_enfn":17,"../common/pj_inv_mlfn":18,"../common/pj_mlfn":19}],59:[function(a,b,c){c.init=function(){var a=this.lat0;this.lambda0=this.long0;var b=Math.sin(a),c=this.a,d=this.rf,e=1/d,f=2*e-Math.pow(e,2),g=this.e=Math.sqrt(f);this.R=this.k0*c*Math.sqrt(1-f)/(1-f*Math.pow(b,2)),this.alpha=Math.sqrt(1+f/(1-f)*Math.pow(Math.cos(a),4)),this.b0=Math.asin(b/this.alpha);var h=Math.log(Math.tan(Math.PI/4+this.b0/2)),i=Math.log(Math.tan(Math.PI/4+a/2)),j=Math.log((1+g*b)/(1-g*b));this.K=h-this.alpha*i+this.alpha*g/2*j},c.forward=function(a){var b=Math.log(Math.tan(Math.PI/4-a.y/2)),c=this.e/2*Math.log((1+this.e*Math.sin(a.y))/(1-this.e*Math.sin(a.y))),d=-this.alpha*(b+c)+this.K,e=2*(Math.atan(Math.exp(d))-Math.PI/4),f=this.alpha*(a.x-this.lambda0),g=Math.atan(Math.sin(f)/(Math.sin(this.b0)*Math.tan(e)+Math.cos(this.b0)*Math.cos(f))),h=Math.asin(Math.cos(this.b0)*Math.sin(e)-Math.sin(this.b0)*Math.cos(e)*Math.cos(f));return a.y=this.R/2*Math.log((1+Math.sin(h))/(1-Math.sin(h)))+this.y0,a.x=this.R*g+this.x0,a},c.inverse=function(a){for(var b=a.x-this.x0,c=a.y-this.y0,d=b/this.R,e=2*(Math.atan(Math.exp(c/this.R))-Math.PI/4),f=Math.asin(Math.cos(this.b0)*Math.sin(e)+Math.sin(this.b0)*Math.cos(e)*Math.cos(d)),g=Math.atan(Math.sin(d)/(Math.cos(this.b0)*Math.cos(d)-Math.sin(this.b0)*Math.tan(e))),h=this.lambda0+g/this.alpha,i=0,j=f,k=-1e3,l=0;Math.abs(j-k)>1e-7;){if(++l>20)return;i=1/this.alpha*(Math.log(Math.tan(Math.PI/4+f/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(j))/2)),k=j,j=2*Math.atan(Math.exp(i))-Math.PI/2}return a.x=h,a.y=j,a},c.names=["somerc"]},{}],60:[function(a,b,c){var d=Math.PI/2,e=1e-10,f=a("../common/sign"),g=a("../common/msfnz"),h=a("../common/tsfnz"),i=a("../common/phi2z"),j=a("../common/adjust_lon");c.ssfn_=function(a,b,c){return b*=c,Math.tan(.5*(d+a))*Math.pow((1-b)/(1+b),.5*c)},c.init=function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=e&&(this.k0=.5*(1+f(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=e&&(this.con=this.lat0>0?1:-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=e&&(this.k0=.5*this.cons*g(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/h(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=g(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-d,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},c.forward=function(a){var b,c,f,g,i,k,l=a.x,m=a.y,n=Math.sin(m),o=Math.cos(m),p=j(l-this.long0);return Math.abs(Math.abs(l-this.long0)-Math.PI)<=e&&Math.abs(m+this.lat0)<=e?(a.x=0/0,a.y=0/0,a):this.sphere?(b=2*this.k0/(1+this.sinlat0*n+this.coslat0*o*Math.cos(p)),a.x=this.a*b*o*Math.sin(p)+this.x0,a.y=this.a*b*(this.coslat0*n-this.sinlat0*o*Math.cos(p))+this.y0,a):(c=2*Math.atan(this.ssfn_(m,n,this.e))-d,g=Math.cos(c),f=Math.sin(c),Math.abs(this.coslat0)<=e?(i=h(this.e,m*this.con,this.con*n),k=2*this.a*this.k0*i/this.cons,a.x=this.x0+k*Math.sin(l-this.long0),a.y=this.y0-this.con*k*Math.cos(l-this.long0),a):(Math.abs(this.sinlat0)=k?(a.x=b,a.y=c,a):(c=Math.asin(Math.cos(l)*this.sinlat0+a.y*Math.sin(l)*this.coslat0/k),b=j(Math.abs(this.coslat0)0?this.long0+Math.atan2(a.x,-1*a.y):this.long0+Math.atan2(a.x,a.y):this.long0+Math.atan2(a.x*Math.sin(l),k*this.coslat0*Math.cos(l)-a.y*this.sinlat0*Math.sin(l))),a.x=b,a.y=c,a)}if(Math.abs(this.coslat0)<=e){if(e>=k)return c=this.lat0,b=this.long0,a.x=b,a.y=c,a;a.x*=this.con,a.y*=this.con,f=k*this.cons/(2*this.a*this.k0),c=this.con*i(this.e,f),b=this.con*j(this.con*this.long0+Math.atan2(a.x,-1*a.y))}else g=2*Math.atan(k*this.cosX0/(2*this.a*this.k0*this.ms1)),b=this.long0,e>=k?h=this.X0:(h=Math.asin(Math.cos(g)*this.sinX0+a.y*Math.sin(g)*this.cosX0/k),b=j(this.long0+Math.atan2(a.x*Math.sin(g),k*this.cosX0*Math.cos(g)-a.y*this.sinX0*Math.sin(g)))),c=-1*i(this.e,Math.tan(.5*(d+h)));return a.x=b,a.y=c,a},c.names=["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"]},{"../common/adjust_lon":5,"../common/msfnz":15,"../common/phi2z":16,"../common/sign":21,"../common/tsfnz":24}],61:[function(a,b,c){var d=a("./gauss"),e=a("../common/adjust_lon");c.init=function(){d.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},c.forward=function(a){var b,c,f,g;return a.x=e(a.x-this.long0),d.forward.apply(this,[a]),b=Math.sin(a.y),c=Math.cos(a.y),f=Math.cos(a.x),g=this.k0*this.R2/(1+this.sinc0*b+this.cosc0*c*f),a.x=g*c*Math.sin(a.x),a.y=g*(this.cosc0*b-this.sinc0*c*f),a.x=this.a*a.x+this.x0,a.y=this.a*a.y+this.y0,a},c.inverse=function(a){var b,c,f,g,h;if(a.x=(a.x-this.x0)/this.a,a.y=(a.y-this.y0)/this.a,a.x/=this.k0,a.y/=this.k0,h=Math.sqrt(a.x*a.x+a.y*a.y)){var i=2*Math.atan2(h,this.R2);b=Math.sin(i),c=Math.cos(i),g=Math.asin(c*this.sinc0+a.y*b*this.cosc0/h),f=Math.atan2(a.x*b,h*this.cosc0*c-a.y*this.sinc0*b)}else g=this.phic0,f=0;return a.x=f,a.y=g,d.inverse.apply(this,[a]),a.x=e(a.x+this.long0),a},c.names=["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative"]},{"../common/adjust_lon":5,"./gauss":46}],62:[function(a,b,c){var d=a("../common/e0fn"),e=a("../common/e1fn"),f=a("../common/e2fn"),g=a("../common/e3fn"),h=a("../common/mlfn"),i=a("../common/adjust_lon"),j=Math.PI/2,k=1e-10,l=a("../common/sign"),m=a("../common/asinz");c.init=function(){this.e0=d(this.es),this.e1=e(this.es),this.e2=f(this.es),this.e3=g(this.es),this.ml0=this.a*h(this.e0,this.e1,this.e2,this.e3,this.lat0)},c.forward=function(a){var b,c,d,e=a.x,f=a.y,g=i(e-this.long0),j=Math.sin(f),k=Math.cos(f);if(this.sphere){var l=k*Math.sin(g);if(Math.abs(Math.abs(l)-1)<1e-10)return 93;c=.5*this.a*this.k0*Math.log((1+l)/(1-l)),b=Math.acos(k*Math.cos(g)/Math.sqrt(1-l*l)),0>f&&(b=-b),d=this.a*this.k0*(b-this.lat0)}else{var m=k*g,n=Math.pow(m,2),o=this.ep2*Math.pow(k,2),p=Math.tan(f),q=Math.pow(p,2);b=1-this.es*Math.pow(j,2);var r=this.a/Math.sqrt(b),s=this.a*h(this.e0,this.e1,this.e2,this.e3,f);c=this.k0*r*m*(1+n/6*(1-q+o+n/20*(5-18*q+Math.pow(q,2)+72*o-58*this.ep2)))+this.x0,d=this.k0*(s-this.ml0+r*p*n*(.5+n/24*(5-q+9*o+4*Math.pow(o,2)+n/30*(61-58*q+Math.pow(q,2)+600*o-330*this.ep2))))+this.y0}return a.x=c,a.y=d,a},c.inverse=function(a){var b,c,d,e,f,g,h=6;if(this.sphere){var n=Math.exp(a.x/(this.a*this.k0)),o=.5*(n-1/n),p=this.lat0+a.y/(this.a*this.k0),q=Math.cos(p);b=Math.sqrt((1-q*q)/(1+o*o)),f=m(b),0>p&&(f=-f),g=0===o&&0===q?this.long0:i(Math.atan2(o,q)+this.long0)}else{var r=a.x-this.x0,s=a.y-this.y0;for(b=(this.ml0+s/this.k0)/this.a,c=b,e=0;!0&&(d=(b+this.e1*Math.sin(2*c)-this.e2*Math.sin(4*c)+this.e3*Math.sin(6*c))/this.e0-c,c+=d,!(Math.abs(d)<=k));e++)if(e>=h)return 95;if(Math.abs(c)=0?this.y0+Math.PI*this.R*Math.tan(.5*k):this.y0+Math.PI*this.R*-Math.tan(.5*k));var l=.5*Math.abs(Math.PI/j-j/Math.PI),m=l*l,n=Math.sin(k),o=Math.cos(k),p=o/(n+o-1),q=p*p,r=p*(2/n-1),s=r*r,t=Math.PI*this.R*(l*(p-s)+Math.sqrt(m*(p-s)*(p-s)-(s+m)*(q-s)))/(s+m);0>j&&(t=-t),b=this.x0+t;var u=m+p;return t=Math.PI*this.R*(r*u-l*Math.sqrt((s+m)*(m+1)-u*u))/(s+m),c=i>=0?this.y0+t:this.y0-t,a.x=b,a.y=c,a},c.inverse=function(a){var b,c,e,g,h,i,j,k,l,m,n,o,p;return a.x-=this.x0,a.y-=this.y0,n=Math.PI*this.R,e=a.x/n,g=a.y/n,h=e*e+g*g,i=-Math.abs(g)*(1+h),j=i-2*g*g+e*e,k=-2*i+1+2*g*g+h*h,p=g*g/k+(2*j*j*j/k/k/k-9*i*j/k/k)/27,l=(i-j*j/3/k)/k,m=2*Math.sqrt(-l/3),n=3*p/l/m,Math.abs(n)>1&&(n=n>=0?1:-1),o=Math.acos(n)/3,c=a.y>=0?(-m*Math.cos(o+Math.PI/3)-j/3/k)*Math.PI:-(-m*Math.cos(o+Math.PI/3)-j/3/k)*Math.PI,b=Math.abs(e)-1?(b[c]={name:a[0].toLowerCase(),convert:a[1]},3===a.length&&(b[c].auth=a[2])):"SPHEROID"===c?(b[c]={name:a[0],a:a[1],rf:a[2]},4===a.length&&(b[c].auth=a[3])):["GEOGCS","GEOCCS","DATUM","VERT_CS","COMPD_CS","LOCAL_CS","FITTED_CS","LOCAL_DATUM"].indexOf(c)>-1?(a[0]=["name",a[0]],d(b,c,a)):a.every(function(a){return Array.isArray(a)})?d(b,c,a):e(a,b[c])):b[c]=!0,void 0):void(b[a]=!0)}function f(a,b){var c=b[0],d=b[1];!(c in a)&&d in a&&(a[c]=a[d],3===b.length&&(a[c]=b[2](a[c])))}function g(a){return a*i}function h(a){function b(b){var c=a.to_meter||1;return parseFloat(b,10)*c}"GEOGCS"===a.type?a.projName="longlat":"LOCAL_CS"===a.type?(a.projName="identity",a.local=!0):a.projName="object"==typeof a.PROJECTION?Object.keys(a.PROJECTION)[0]:a.PROJECTION,a.UNIT&&(a.units=a.UNIT.name.toLowerCase(),"metre"===a.units&&(a.units="meter"),a.UNIT.convert&&(a.to_meter=parseFloat(a.UNIT.convert,10))), +a.GEOGCS&&(a.datumCode=a.GEOGCS.DATUM?a.GEOGCS.DATUM.name.toLowerCase():a.GEOGCS.name.toLowerCase(),"d_"===a.datumCode.slice(0,2)&&(a.datumCode=a.datumCode.slice(2)),("new_zealand_geodetic_datum_1949"===a.datumCode||"new_zealand_1949"===a.datumCode)&&(a.datumCode="nzgd49"),"wgs_1984"===a.datumCode&&("Mercator_Auxiliary_Sphere"===a.PROJECTION&&(a.sphere=!0),a.datumCode="wgs84"),"_ferro"===a.datumCode.slice(-6)&&(a.datumCode=a.datumCode.slice(0,-6)),"_jakarta"===a.datumCode.slice(-8)&&(a.datumCode=a.datumCode.slice(0,-8)),~a.datumCode.indexOf("belge")&&(a.datumCode="rnb72"),a.GEOGCS.DATUM&&a.GEOGCS.DATUM.SPHEROID&&(a.ellps=a.GEOGCS.DATUM.SPHEROID.name.replace("_19","").replace(/[Cc]larke\_18/,"clrk"),"international"===a.ellps.toLowerCase().slice(0,13)&&(a.ellps="intl"),a.a=a.GEOGCS.DATUM.SPHEROID.a,a.rf=parseFloat(a.GEOGCS.DATUM.SPHEROID.rf,10)),~a.datumCode.indexOf("osgb_1936")&&(a.datumCode="osgb36")),a.b&&!isFinite(a.b)&&(a.b=a.a);var c=function(b){return f(a,b)},d=[["standard_parallel_1","Standard_Parallel_1"],["standard_parallel_2","Standard_Parallel_2"],["false_easting","False_Easting"],["false_northing","False_Northing"],["central_meridian","Central_Meridian"],["latitude_of_origin","Latitude_Of_Origin"],["latitude_of_origin","Central_Parallel"],["scale_factor","Scale_Factor"],["k0","scale_factor"],["latitude_of_center","Latitude_of_center"],["lat0","latitude_of_center",g],["longitude_of_center","Longitude_Of_Center"],["longc","longitude_of_center",g],["x0","false_easting",b],["y0","false_northing",b],["long0","central_meridian",g],["lat0","latitude_of_origin",g],["lat0","standard_parallel_1",g],["lat1","standard_parallel_1",g],["lat2","standard_parallel_2",g],["alpha","azimuth",g],["srsCode","name"]];d.forEach(c),a.long0||!a.longc||"Albers_Conic_Equal_Area"!==a.projName&&"Lambert_Azimuthal_Equal_Area"!==a.projName||(a.long0=a.longc),a.lat_ts||!a.lat1||"Stereographic_South_Pole"!==a.projName&&"Polar Stereographic (variant B)"!==a.projName||(a.lat0=g(a.lat1>0?90:-90),a.lat_ts=a.lat1)}var i=.017453292519943295,j=a("./extend");b.exports=function(a,b){var c=JSON.parse((","+a).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g,',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g,',"$1"]').replace(/,\["VERTCS".+/,"")),d=c.shift(),f=c.shift();c.unshift(["name",f]),c.unshift(["type",d]),c.unshift("output");var g={};return e(c,g),h(g.output),j(b,g.output)}},{"./extend":34}],67:[function(a,b,c){function d(a){return a*(Math.PI/180)}function e(a){return 180*(a/Math.PI)}function f(a){var b,c,e,f,g,i,j,k,l,m=a.lat,n=a.lon,o=6378137,p=.00669438,q=.9996,r=d(m),s=d(n);l=Math.floor((n+180)/6)+1,180===n&&(l=60),m>=56&&64>m&&n>=3&&12>n&&(l=32),m>=72&&84>m&&(n>=0&&9>n?l=31:n>=9&&21>n?l=33:n>=21&&33>n?l=35:n>=33&&42>n&&(l=37)),b=6*(l-1)-180+3,k=d(b),c=p/(1-p),e=o/Math.sqrt(1-p*Math.sin(r)*Math.sin(r)),f=Math.tan(r)*Math.tan(r),g=c*Math.cos(r)*Math.cos(r),i=Math.cos(r)*(s-k),j=o*((1-p/4-3*p*p/64-5*p*p*p/256)*r-(3*p/8+3*p*p/32+45*p*p*p/1024)*Math.sin(2*r)+(15*p*p/256+45*p*p*p/1024)*Math.sin(4*r)-35*p*p*p/3072*Math.sin(6*r));var t=q*e*(i+(1-f+g)*i*i*i/6+(5-18*f+f*f+72*g-58*c)*i*i*i*i*i/120)+5e5,u=q*(j+e*Math.tan(r)*(i*i/2+(5-f+9*g+4*g*g)*i*i*i*i/24+(61-58*f+f*f+600*g-330*c)*i*i*i*i*i*i/720));return 0>m&&(u+=1e7),{northing:Math.round(u),easting:Math.round(t),zoneNumber:l,zoneLetter:h(m)}}function g(a){var b=a.northing,c=a.easting,d=a.zoneLetter,f=a.zoneNumber;if(0>f||f>60)return null;var h,i,j,k,l,m,n,o,p,q,r=.9996,s=6378137,t=.00669438,u=(1-Math.sqrt(1-t))/(1+Math.sqrt(1-t)),v=c-5e5,w=b;"N">d&&(w-=1e7),o=6*(f-1)-180+3,h=t/(1-t),n=w/r,p=n/(s*(1-t/4-3*t*t/64-5*t*t*t/256)),q=p+(3*u/2-27*u*u*u/32)*Math.sin(2*p)+(21*u*u/16-55*u*u*u*u/32)*Math.sin(4*p)+151*u*u*u/96*Math.sin(6*p),i=s/Math.sqrt(1-t*Math.sin(q)*Math.sin(q)),j=Math.tan(q)*Math.tan(q),k=h*Math.cos(q)*Math.cos(q),l=s*(1-t)/Math.pow(1-t*Math.sin(q)*Math.sin(q),1.5),m=v/(i*r);var x=q-i*Math.tan(q)/l*(m*m/2-(5+3*j+10*k-4*k*k-9*h)*m*m*m*m/24+(61+90*j+298*k+45*j*j-252*h-3*k*k)*m*m*m*m*m*m/720);x=e(x);var y=(m-(1+2*j+k)*m*m*m/6+(5-2*k+28*j-3*k*k+8*h+24*j*j)*m*m*m*m*m/120)/Math.cos(q);y=o+e(y);var z;if(a.accuracy){var A=g({northing:a.northing+a.accuracy,easting:a.easting+a.accuracy,zoneLetter:a.zoneLetter,zoneNumber:a.zoneNumber});z={top:A.lat,right:A.lon,bottom:x,left:y}}else z={lat:x,lon:y};return z}function h(a){var b="Z";return 84>=a&&a>=72?b="X":72>a&&a>=64?b="W":64>a&&a>=56?b="V":56>a&&a>=48?b="U":48>a&&a>=40?b="T":40>a&&a>=32?b="S":32>a&&a>=24?b="R":24>a&&a>=16?b="Q":16>a&&a>=8?b="P":8>a&&a>=0?b="N":0>a&&a>=-8?b="M":-8>a&&a>=-16?b="L":-16>a&&a>=-24?b="K":-24>a&&a>=-32?b="J":-32>a&&a>=-40?b="H":-40>a&&a>=-48?b="G":-48>a&&a>=-56?b="F":-56>a&&a>=-64?b="E":-64>a&&a>=-72?b="D":-72>a&&a>=-80&&(b="C"),b}function i(a,b){var c=""+a.easting,d=""+a.northing;return a.zoneNumber+a.zoneLetter+j(a.easting,a.northing,a.zoneNumber)+c.substr(c.length-5,b)+d.substr(d.length-5,b)}function j(a,b,c){var d=k(c),e=Math.floor(a/1e5),f=Math.floor(b/1e5)%20;return l(e,f,d)}function k(a){var b=a%q;return 0===b&&(b=q),b}function l(a,b,c){var d=c-1,e=r.charCodeAt(d),f=s.charCodeAt(d),g=e+a-1,h=f+b,i=!1;g>x&&(g=g-x+t-1,i=!0),(g===u||u>e&&g>u||(g>u||u>e)&&i)&&g++,(g===v||v>e&&g>v||(g>v||v>e)&&i)&&(g++,g===u&&g++),g>x&&(g=g-x+t-1),h>w?(h=h-w+t-1,i=!0):i=!1,(h===u||u>f&&h>u||(h>u||u>f)&&i)&&h++,(h===v||v>f&&h>v||(h>v||v>f)&&i)&&(h++,h===u&&h++),h>w&&(h=h-w+t-1);var j=String.fromCharCode(g)+String.fromCharCode(h);return j}function m(a){if(a&&0===a.length)throw"MGRSPoint coverting from nothing";for(var b,c=a.length,d=null,e="",f=0;!/[A-Z]/.test(b=a.charAt(f));){if(f>=2)throw"MGRSPoint bad conversion from: "+a;e+=b,f++}var g=parseInt(e,10);if(0===f||f+3>c)throw"MGRSPoint bad conversion from: "+a;var h=a.charAt(f++);if("A">=h||"B"===h||"Y"===h||h>="Z"||"I"===h||"O"===h)throw"MGRSPoint zone letter "+h+" not handled: "+a;d=a.substring(f,f+=2);for(var i=k(g),j=n(d.charAt(0),i),l=o(d.charAt(1),i);l0&&(q=1e5/Math.pow(10,v),r=a.substring(f,f+v),w=parseFloat(r)*q,s=a.substring(f+v),x=parseFloat(s)*q),t=w+j,u=x+l,{easting:t,northing:u,zoneLetter:h,zoneNumber:g,accuracy:q}}function n(a,b){for(var c=r.charCodeAt(b-1),d=1e5,e=!1;c!==a.charCodeAt(0);){if(c++,c===u&&c++,c===v&&c++,c>x){if(e)throw"Bad character: "+a;c=t,e=!0}d+=1e5}return d}function o(a,b){if(a>"V")throw"MGRSPoint given invalid Northing "+a;for(var c=s.charCodeAt(b-1),d=0,e=!1;c!==a.charCodeAt(0);){if(c++,c===u&&c++,c===v&&c++,c>w){if(e)throw"Bad character: "+a;c=t,e=!0}d+=1e5}return d}function p(a){var b;switch(a){case"C":b=11e5;break;case"D":b=2e6;break;case"E":b=28e5;break;case"F":b=37e5;break;case"G":b=46e5;break;case"H":b=55e5;break;case"J":b=64e5;break;case"K":b=73e5;break;case"L":b=82e5;break;case"M":b=91e5;break;case"N":b=0;break;case"P":b=8e5;break;case"Q":b=17e5;break;case"R":b=26e5;break;case"S":b=35e5;break;case"T":b=44e5;break;case"U":b=53e5;break;case"V":b=62e5;break;case"W":b=7e6;break;case"X":b=79e5;break;default:b=-1}if(b>=0)return b;throw"Invalid zone letter: "+a}var q=6,r="AJSAJS",s="AFAFAF",t=65,u=73,v=79,w=86,x=90;c.forward=function(a,b){return b=b||5,i(f({lat:a[1],lon:a[0]}),b)},c.inverse=function(a){var b=g(m(a.toUpperCase()));return[b.left,b.bottom,b.right,b.top]},c.toPoint=function(a){var b=c.inverse(a);return[(b[2]+b[0])/2,(b[3]+b[1])/2]}},{}],68:[function(a,b,c){b.exports={name:"proj4",version:"2.3.6",description:"Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.",main:"lib/index.js",directories:{test:"test",doc:"docs"},scripts:{test:"./node_modules/istanbul/lib/cli.js test ./node_modules/mocha/bin/_mocha test/test.js"},repository:{type:"git",url:"git://github.com/proj4js/proj4js.git"},author:"",license:"MIT",jam:{main:"dist/proj4.js",include:["dist/proj4.js","README.md","AUTHORS","LICENSE.md"]},devDependencies:{"grunt-cli":"~0.1.13",grunt:"~0.4.2","grunt-contrib-connect":"~0.6.0","grunt-contrib-jshint":"~0.8.0",chai:"~1.8.1",mocha:"~1.17.1","grunt-mocha-phantomjs":"~0.4.0",browserify:"~3.24.5","grunt-browserify":"~1.3.0","grunt-contrib-uglify":"~0.3.2",curl:"git://github.com/cujojs/curl.git",istanbul:"~0.2.4",tin:"~0.4.0"},dependencies:{mgrs:"0.0.0"}}},{}],"./includedProjections":[function(a,b,c){b.exports=a("hTEDpn")},{}],hTEDpn:[function(a,b,c){var d=[a("./lib/projections/tmerc"),a("./lib/projections/utm"),a("./lib/projections/sterea"),a("./lib/projections/stere"),a("./lib/projections/somerc"),a("./lib/projections/omerc"),a("./lib/projections/lcc"),a("./lib/projections/krovak"),a("./lib/projections/cass"),a("./lib/projections/laea"),a("./lib/projections/aea"),a("./lib/projections/gnom"),a("./lib/projections/cea"),a("./lib/projections/eqc"),a("./lib/projections/poly"),a("./lib/projections/nzmg"),a("./lib/projections/mill"),a("./lib/projections/sinu"),a("./lib/projections/moll"),a("./lib/projections/eqdc"),a("./lib/projections/vandg"),a("./lib/projections/aeqd")];b.exports=function(proj4){d.forEach(function(a){proj4.Proj.projections.add(a)})}},{"./lib/projections/aea":40,"./lib/projections/aeqd":41,"./lib/projections/cass":42,"./lib/projections/cea":43,"./lib/projections/eqc":44,"./lib/projections/eqdc":45,"./lib/projections/gnom":47,"./lib/projections/krovak":48,"./lib/projections/laea":49,"./lib/projections/lcc":50,"./lib/projections/mill":53,"./lib/projections/moll":54,"./lib/projections/nzmg":55,"./lib/projections/omerc":56,"./lib/projections/poly":57,"./lib/projections/sinu":58,"./lib/projections/somerc":59,"./lib/projections/stere":60,"./lib/projections/sterea":61,"./lib/projections/tmerc":62,"./lib/projections/utm":63,"./lib/projections/vandg":64}]},{},[36])(36)}); \ No newline at end of file diff --git a/WebContent/species.html b/WebContent/species.html index de6ef19..eb8a94d 100644 --- a/WebContent/species.html +++ b/WebContent/species.html @@ -25,12 +25,23 @@ --> - + + + + + + + + + + + + @@ -74,7 +85,7 @@

Aquatic Species Distribution Map Viewer