Loading lib/proj4js-combined.js +202 −86 Original line number Diff line number Diff line Loading @@ -89,9 +89,10 @@ Proj4js = { return point; } // Workaround for Spherical Mercator if ((source.srsProjNumber =="900913" && dest.datumCode != "WGS84" && !dest.datum_params) || (dest.srsProjNumber == "900913" && source.datumCode != "WGS84" && !source.datum_params)) { // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 if (source.datum && dest.datum && ( ((source.datum.datum_type == Proj4js.common.PJD_3PARAM || source.datum.datum_type == Proj4js.common.PJD_7PARAM) && dest.datumCode != "WGS84") || ((dest.datum.datum_type == Proj4js.common.PJD_3PARAM || dest.datum.datum_type == Proj4js.common.PJD_7PARAM) && source.datumCode != "WGS84"))) { var wgs84 = Proj4js.WGS84; this.transform(source, wgs84, point); source = wgs84; Loading Loading @@ -167,29 +168,6 @@ Proj4js = { return point; } // If this datum requires grid shifts, then apply it to geodetic coordinates. if( source.datum_type == Proj4js.common.PJD_GRIDSHIFT ) { alert("ERROR: Grid shift transformations are not implemented yet."); /* pj_apply_gridshift( pj_param(source.params,"snadgrids").s, 0, point_count, point_offset, x, y, z ); CHECK_RETURN; src_a = SRS_WGS84_SEMIMAJOR; src_es = 0.006694379990; */ } if( dest.datum_type == Proj4js.common.PJD_GRIDSHIFT ) { alert("ERROR: Grid shift transformations are not implemented yet."); /* dst_a = ; dst_es = 0.006694379990; */ } // Do we need to go through geocentric coordinates? if( source.es != dest.es || source.a != dest.a || source.datum_type == Proj4js.common.PJD_3PARAM Loading Loading @@ -218,13 +196,6 @@ Proj4js = { // CHECK_RETURN; } // Apply grid shift to destination if required if( dest.datum_type == Proj4js.common.PJD_GRIDSHIFT ) { alert("ERROR: Grid shift transformations are not implemented yet."); // pj_apply_gridshift( pj_param(dest.params,"snadgrids").s, 1, point); // CHECK_RETURN; } return point; }, // cs_datum_transform Loading Loading @@ -265,7 +236,7 @@ Proj4js = { if (point[t]!==undefined) { point.z= -v; } break; default : alert("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+src.projName); alert("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+crs.projName); return null; } } Loading Loading @@ -884,9 +855,9 @@ Proj4js.Proj = Proj4js.Class({ } if (!this.axis) { this.axis= "enu"; } switch(name) { case 'X': this.axis= value + this.axis.substr(1,2); break; case 'Y': this.axis= this.axis.substr(0,1) + value + this.axis.substr(2,1); break; case 'Z': this.axis= this.axis.substr(0,2) + value ; break; case 'x': this.axis= value + this.axis.substr(1,2); break; case 'y': this.axis= this.axis.substr(0,1) + value + this.axis.substr(2,1); break; case 'z': this.axis= this.axis.substr(0,2) + value ; break; default : break; } case 'MORE_HERE': Loading Loading @@ -991,7 +962,7 @@ Proj4js.Proj = Proj4js.Class({ Proj4js.extend(this, ellipse); } if (this.rf && !this.b) this.b = (1.0 - 1.0/this.rf) * this.a; if (Math.abs(this.a - this.b)<Proj4js.common.EPSLN) { if (this.rf === 0 || Math.abs(this.a - this.b)<Proj4js.common.EPSLN) { this.sphere = true; this.b= this.a; } Loading Loading @@ -1049,11 +1020,12 @@ Proj4js.defs = { '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" 'EPSG:3875': "+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.defs['EPSG:3785'] = Proj4js.defs['EPSG:3875']; //maintain backward compat, official code is 3875 Proj4js.defs['GOOGLE'] = Proj4js.defs['EPSG:3875']; Proj4js.defs['EPSG:900913'] = Proj4js.defs['EPSG:3875']; Proj4js.defs['EPSG:102113'] = Proj4js.defs['EPSG:3875']; Proj4js.common = { PI : 3.141592653589793238, //Math.PI, Loading Loading @@ -1285,7 +1257,7 @@ Proj4js.datum = Proj4js.Class({ /****************************************************************/ // cs_compare_datums() // Returns 1 (TRUE) if the two datums match, otherwise 0 (FALSE). // Returns TRUE if the two datums match, otherwise FALSE. compare_datums : function( dest ) { if( this.datum_type != dest.datum_type ) { return false; // false, datums are not equal Loading @@ -1305,9 +1277,10 @@ Proj4js.datum = Proj4js.Class({ && 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 if ( this.datum_type == Proj4js.common.PJD_GRIDSHIFT || dest.datum_type == Proj4js.common.PJD_GRIDSHIFT ) { alert("ERROR: Grid shift transformations are not implemented."); return false } else { return true; // datums are equal } Loading Loading @@ -1794,6 +1767,7 @@ Proj4js.wktProjections = { "Lambert Tangential Conformal Conic Projection": "lcc", "Mercator": "merc", "Popular Visualisation Pseudo Mercator": "merc", "Mercator_1SP": "merc", "Transverse_Mercator": "tmerc", "Transverse Mercator": "tmerc", "Lambert Azimuthal Equal Area": "laea", Loading Loading @@ -1913,13 +1887,13 @@ Proj4js.Proj.aea = { lat = this.phi1z(this.e3,qs); } else { if (qs >= 0) { lat = .5 * PI; lat = .5 * Proj4js.common.PI; } else { lat = -.5 * PI; lat = -.5 * Proj4js.common.PI; } } } else { lat = this.phi1z(e3,qs); lat = this.phi1z(this.e3,qs); } lon = Proj4js.common.adjust_lon(theta/this.ns0 + this.long0); Loading @@ -1932,7 +1906,7 @@ Proj4js.Proj.aea = { Albers Conical Equal-Area projection. -------------------------------------------*/ phi1z: function (eccent,qs) { var con, com, dphi; var sinphi, cosphi, con, com, dphi; var phi = Proj4js.common.asinz(.5 * qs); if (eccent < Proj4js.common.EPSLN) return phi; Loading Loading @@ -1975,6 +1949,7 @@ Proj4js.Proj.sterea = { }, forward : function(p) { var sinc, cosc, cosl, k; 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); Loading @@ -1989,14 +1964,14 @@ Proj4js.Proj.sterea = { }, inverse : function(p) { var lon,lat; var sinc, cosc, lon, lat, rho; 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); var 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); Loading @@ -2022,7 +1997,7 @@ Proj4js.Proj.sterea = { Polyconic projection. ------------------------------------------------------------*/ function phi4z (eccent,e0,e1,e2,e3,a,b,c,phi) { var sinphi, sin2ph, tanph, ml, mlp, con1, con2, con3, dphi, i; var sinphi, sin2ph, tanphi, ml, mlp, con1, con2, con3, dphi, i; phi = a; for (i = 1; i <= 15; i++) { Loading Loading @@ -2092,7 +2067,7 @@ Proj4js.Proj.poly = { ----------------------------------*/ init: function() { var temp; /* temporary variable */ if (this.lat0=0) this.lat0=90;//this.lat0 ca if (this.lat0 == 0) this.lat0 = 90;//this.lat0 ca /* Place parameters in static storage for common use -------------------------------------------------*/ Loading Loading @@ -2882,6 +2857,145 @@ Proj4js.Proj.ortho = { }; /* ====================================================================== projCode/krovak.js ====================================================================== */ /** NOTES: According to EPSG the full Krovak projection method should have the following parameters. Within PROJ.4 the azimuth, and pseudo standard parallel are hardcoded in the algorithm and can't be altered from outside. The others all have defaults to match the common usage with Krovak projection. lat_0 = latitude of centre of the projection lon_0 = longitude of centre of the projection ** = azimuth (true) of the centre line passing through the centre of the projection ** = latitude of pseudo standard parallel k = scale factor on the pseudo standard parallel x_0 = False Easting of the centre of the projection at the apex of the cone y_0 = False Northing of the centre of the projection at the apex of the cone **/ Proj4js.Proj.krovak = { init: function() { /* we want Bessel as fixed ellipsoid */ this.a = 6377397.155; this.es = 0.006674372230614; this.e = Math.sqrt(this.es); /* if latitude of projection center is not set, use 49d30'N */ if (!this.lat0) { this.lat0 = 0.863937979737193; } if (!this.long0) { this.long0 = 0.7417649320975901 - 0.308341501185665; } /* if scale not set default to 0.9999 */ if (!this.k0) { this.k0 = 0.9999; } this.s45 = 0.785398163397448; /* 45° */ this.s90 = 2 * this.s45; this.fi0 = this.lat0; /* Latitude of projection centre 49° 30' */ /* Ellipsoid Bessel 1841 a = 6377397.155m 1/f = 299.1528128, e2=0.006674372230614; */ this.e2 = this.es; /* 0.006674372230614; */ 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; /* DU(2, 59, 42, 42.69689) */ 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; /* Latitude of pseudo standard parallel 78° 30'00" N */ this.n = Math.sin(this.s0); this.ro0 = this.k1 * this.n0 / Math.tan(this.s0); this.ad = this.s90 - this.uq; }, /* ellipsoid */ /* calculate xy from lat/lon */ /* Constants, identical to inverse transform function */ forward: function(p) { var gfi, u, deltav, s, d, eps, ro; var lon = p.x; var lat = p.y; var delta_lon = Proj4js.common.adjust_lon(lon - this.long0); // Delta longitude /* Transformation */ gfi = Math.pow ( ((1. + this.e * Math.sin(lat)) / (1. - this.e * Math.sin(lat))) , (this.alfa * this.e / 2.)); u= 2. * (Math.atan(this.k * Math.pow( Math.tan(lat / 2. + this.s45), this.alfa) / gfi)-this.s45); deltav = - delta_lon * this.alfa; s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav)); d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s)); eps = this.n * d; ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2. + this.s45) , this.n) / Math.pow(Math.tan(s / 2. + this.s45) , this.n); /* x and y are reverted! */ //p.y = ro * Math.cos(eps) / a; //p.x = ro * Math.sin(eps) / a; p.y = ro * Math.cos(eps) / 1.0; p.x = ro * Math.sin(eps) / 1.0; if(this.czech) { p.y *= -1.0; p.x *= -1.0; } return (p); }, /* calculate lat/lon from xy */ inverse: function(p) { /* Constants, identisch wie in der Umkehrfunktion */ var u, deltav, s, d, eps, ro, fi1; var ok; /* Transformation */ /* revert y, x*/ var tmp = p.x; p.x=p.y; p.y=tmp; if(this.czech) { p.y *= -1.0; p.x *= -1.0; } ro = Math.sqrt(p.x * p.x + p.y * p.y); eps = Math.atan2(p.y, p.x); d = eps / Math.sin(this.s0); s = 2. * (Math.atan( Math.pow(this.ro0 / ro, 1. / this.n) * Math.tan(this.s0 / 2. + this.s45)) - this.s45); u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d)); deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u)); p.x = this.long0 - deltav / this.alfa; /* ITERATION FOR lat */ fi1 = u; ok = 0; var iter = 0; do { p.y = 2. * ( Math.atan( Math.pow( this.k, -1. / this.alfa) * Math.pow( Math.tan(u / 2. + this.s45) , 1. / this.alfa) * Math.pow( (1. + this.e * Math.sin(fi1)) / (1. - this.e * Math.sin(fi1)) , this.e / 2.) ) - this.s45); if (Math.abs(fi1 - p.y) < 0.0000000001) ok=1; fi1 = p.y; iter += 1; } while (ok==0 && iter < 15); if (iter >= 15) { Proj4js.reportError("PHI3Z-CONV:Latitude failed to converge after 15 iterations"); //console.log('iter:', iter); return null; } return (p); } }; /* ====================================================================== projCode/somerc.js ====================================================================== */ Loading Loading @@ -3120,19 +3234,20 @@ Proj4js.Proj.stere = { coslam = Math.cos(lon); sinlam = Math.sin(lon); sinphi = Math.sin(lat); var sinX, cosX; 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); var Xt = 2. * Math.atan(this.ssfn_(lat, sinphi, this.e)); sinX = Math.sin(Xt - Proj4js.common.HALF_PI); cosX = Math.cos(Xt); } switch (this.mode) { case this.OBLIQ: A = this.akm1 / (this.cosX1 * (1. + this.sinX1 * sinX + this.cosX1 * cosX * coslam)); var 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); var A = 2. * this.akm1 / (1. + cosX * coslam); y = A * sinX; x = A * cosX; break; Loading Loading @@ -3433,7 +3548,7 @@ Proj4js.Proj.nzmg = { var d_phi_n = 1; // d_phi^0 var d_psi = 0; for (n = 1; n <= 10; n++) { for (var n = 1; n <= 10; n++) { d_phi_n = d_phi_n * d_phi; d_psi = d_psi + this.A[n] * d_phi_n; } Loading @@ -3446,17 +3561,15 @@ Proj4js.Proj.nzmg = { var th_n_re1; var th_n_im1; var z_re = 0; var z_im = 0; for (n = 1; n <= 6; n++) { for (var 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; p.x = (z_im * this.a) + this.x0; p.y = (z_re * this.a) + this.y0; return p; }, Loading @@ -3481,7 +3594,7 @@ Proj4js.Proj.nzmg = { var z_n_re1; var z_n_im1; var th_re = 0; var th_im = 0; for (n = 1; n <= 6; n++) { for (var 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; Loading @@ -3491,12 +3604,12 @@ Proj4js.Proj.nzmg = { // 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++) { for (var 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++) { for (var 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); Loading @@ -3504,7 +3617,7 @@ Proj4js.Proj.nzmg = { 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++) { for (var 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); Loading @@ -3520,7 +3633,7 @@ Proj4js.Proj.nzmg = { var d_psi_n = 1; // d_psi^0 var d_phi = 0; for (n = 1; n <= 9; n++) { for (var n = 1; n <= 9; n++) { d_psi_n = d_psi_n * d_psi; d_phi = d_phi + this.D[n] * d_psi_n; } Loading Loading @@ -3658,6 +3771,7 @@ Proj4js.Proj.gnom = { var coslon; /* cos of longitude */ var ksp; /* scale factor */ var g; var x, y; var lon=p.x; var lat=p.y; /* Forward equations Loading Loading @@ -3904,7 +4018,7 @@ Proj4js.Proj.vandg = { /* Van Der Grinten inverse equations--mapping x,y to lat/long ---------------------------------------------------------*/ inverse: function(p) { var dlon; var lon, lat; var xx,yy,xys,c1,c2,c3; var al,asq; var a1; Loading Loading @@ -4007,7 +4121,7 @@ Proj4js.Proj.cea = { var lat=p.y; /* Forward equations -----------------*/ dlon = Proj4js.common.adjust_lon(lon -this.long0); var 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 Loading Loading @@ -4173,6 +4287,7 @@ Proj4js.Proj.cass = { p.y -= this.y0; var x = p.x/this.a; var y = p.y/this.a; var phi, lam; if (this.sphere) { this.dd = y + this.lat0; Loading @@ -4180,7 +4295,7 @@ Proj4js.Proj.cass = { lam = Math.atan2(Math.tan(x), Math.cos(this.dd)); } else { /* ellipsoid */ ph1 = this.pj_inv_mlfn(this.m0 + y, this.es, this.en); var 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); Loading @@ -4200,7 +4315,7 @@ Proj4js.Proj.cass = { //code from the PROJ.4 pj_mlfn.c file; this may be useful for other projections pj_enfn: function(es) { en = new Array(); var 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; Loading @@ -4218,10 +4333,10 @@ Proj4js.Proj.cass = { }, 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); var k = 1./(1.-es); var phi = arg; for (var i = Proj4js.common.MAX_ITER; i ; --i) { /* rarely goes over 2 iterations */ var 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; Loading Loading @@ -4261,8 +4376,8 @@ Proj4js.Proj.cass = { Proj4js.Proj.gauss = { init : function() { sphi = Math.sin(this.lat0); cphi = Math.cos(this.lat0); var sphi = Math.sin(this.lat0); var 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)); Loading @@ -4284,7 +4399,7 @@ Proj4js.Proj.gauss = { 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); var 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; Loading Loading @@ -4429,7 +4544,7 @@ Proj4js.Proj.omerc = { } else { this.con = Math.abs(this.lat1); } if ((this.con <= Proj4js.common.EPSLN) || (Math.abs(this.con - HALF_PI) <= Proj4js.common.EPSLN)) { if ((this.con <= Proj4js.common.EPSLN) || (Math.abs(this.con - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN)) { Proj4js.reportError("omercInitDataError"); //return(202); } else { Loading Loading @@ -4522,7 +4637,7 @@ Proj4js.Proj.omerc = { var con, n, ml; /* cone constant, small m */ var vs,us,q,s,ts1; var vl,ul,bs; var dlon; var lon, lat; var flag; /* Inverse equations Loading Loading @@ -4924,6 +5039,7 @@ Proj4js.Proj.laea = { p.y -= this.y0; var x = p.x/this.a; var y = p.y/this.a; var lam, phi; if (this.sphere) { var cosz=0.0, rh, sinz=0.0; Loading lib/proj4js-compressed.js +36 −36 File changed.Preview size limit exceeded, changes collapsed. Show changes lib/proj4js.js +4 −3 Original line number Diff line number Diff line Loading @@ -74,9 +74,10 @@ Proj4js = { return point; } // Workaround for Spherical Mercator if ((source.srsProjNumber =="900913" && dest.datumCode != "WGS84" && !dest.datum_params) || (dest.srsProjNumber == "900913" && source.datumCode != "WGS84" && !source.datum_params)) { // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 if (source.datum && dest.datum && ( ((source.datum.datum_type == Proj4js.common.PJD_3PARAM || source.datum.datum_type == Proj4js.common.PJD_7PARAM) && dest.datumCode != "WGS84") || ((dest.datum.datum_type == Proj4js.common.PJD_3PARAM || dest.datum.datum_type == Proj4js.common.PJD_7PARAM) && source.datumCode != "WGS84"))) { var wgs84 = Proj4js.WGS84; this.transform(source, wgs84, point); source = wgs84; Loading test/index.html +1 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ <head> <link href="base.css" type="text/css" rel="stylesheet"/> <title>Proj4js Test Page</title> <script src="../lib/proj4js.js"></script> <script src="../lib/proj4js-combined.js"></script> <script src="../lib/defs/EPSG42304.js"></script> <script src="../lib/util/MGRS.js"></script> <script src="testdata.js"></script> Loading test/runtests.js +13 −1 Original line number Diff line number Diff line Loading @@ -11,6 +11,18 @@ function runTests() { alert(testRes.toString()); */ /* //testing the conversion bewteen CSs which use the towgs84 params (ticket #64) //TODO convert this to asserts src = new Proj4js.Proj("EPSG:21781"); dest = new Proj4js.Proj("EPSG:900913"); var testPt = new Proj4js.Point([699212,227132]); var testRes = Proj4js.transform(src, dest, testPt); alert(testRes.toString()); //result should be 973791.60867,5972764.60117 */ for (var i=0; i < Proj4js.testPoints.length; ++i) { var test = Proj4js.testPoints[i]; var proj = new Proj4js.Proj(test.code, Proj4js.bind(showResults, this, test)); Loading Loading
lib/proj4js-combined.js +202 −86 Original line number Diff line number Diff line Loading @@ -89,9 +89,10 @@ Proj4js = { return point; } // Workaround for Spherical Mercator if ((source.srsProjNumber =="900913" && dest.datumCode != "WGS84" && !dest.datum_params) || (dest.srsProjNumber == "900913" && source.datumCode != "WGS84" && !source.datum_params)) { // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 if (source.datum && dest.datum && ( ((source.datum.datum_type == Proj4js.common.PJD_3PARAM || source.datum.datum_type == Proj4js.common.PJD_7PARAM) && dest.datumCode != "WGS84") || ((dest.datum.datum_type == Proj4js.common.PJD_3PARAM || dest.datum.datum_type == Proj4js.common.PJD_7PARAM) && source.datumCode != "WGS84"))) { var wgs84 = Proj4js.WGS84; this.transform(source, wgs84, point); source = wgs84; Loading Loading @@ -167,29 +168,6 @@ Proj4js = { return point; } // If this datum requires grid shifts, then apply it to geodetic coordinates. if( source.datum_type == Proj4js.common.PJD_GRIDSHIFT ) { alert("ERROR: Grid shift transformations are not implemented yet."); /* pj_apply_gridshift( pj_param(source.params,"snadgrids").s, 0, point_count, point_offset, x, y, z ); CHECK_RETURN; src_a = SRS_WGS84_SEMIMAJOR; src_es = 0.006694379990; */ } if( dest.datum_type == Proj4js.common.PJD_GRIDSHIFT ) { alert("ERROR: Grid shift transformations are not implemented yet."); /* dst_a = ; dst_es = 0.006694379990; */ } // Do we need to go through geocentric coordinates? if( source.es != dest.es || source.a != dest.a || source.datum_type == Proj4js.common.PJD_3PARAM Loading Loading @@ -218,13 +196,6 @@ Proj4js = { // CHECK_RETURN; } // Apply grid shift to destination if required if( dest.datum_type == Proj4js.common.PJD_GRIDSHIFT ) { alert("ERROR: Grid shift transformations are not implemented yet."); // pj_apply_gridshift( pj_param(dest.params,"snadgrids").s, 1, point); // CHECK_RETURN; } return point; }, // cs_datum_transform Loading Loading @@ -265,7 +236,7 @@ Proj4js = { if (point[t]!==undefined) { point.z= -v; } break; default : alert("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+src.projName); alert("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+crs.projName); return null; } } Loading Loading @@ -884,9 +855,9 @@ Proj4js.Proj = Proj4js.Class({ } if (!this.axis) { this.axis= "enu"; } switch(name) { case 'X': this.axis= value + this.axis.substr(1,2); break; case 'Y': this.axis= this.axis.substr(0,1) + value + this.axis.substr(2,1); break; case 'Z': this.axis= this.axis.substr(0,2) + value ; break; case 'x': this.axis= value + this.axis.substr(1,2); break; case 'y': this.axis= this.axis.substr(0,1) + value + this.axis.substr(2,1); break; case 'z': this.axis= this.axis.substr(0,2) + value ; break; default : break; } case 'MORE_HERE': Loading Loading @@ -991,7 +962,7 @@ Proj4js.Proj = Proj4js.Class({ Proj4js.extend(this, ellipse); } if (this.rf && !this.b) this.b = (1.0 - 1.0/this.rf) * this.a; if (Math.abs(this.a - this.b)<Proj4js.common.EPSLN) { if (this.rf === 0 || Math.abs(this.a - this.b)<Proj4js.common.EPSLN) { this.sphere = true; this.b= this.a; } Loading Loading @@ -1049,11 +1020,12 @@ Proj4js.defs = { '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" 'EPSG:3875': "+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.defs['EPSG:3785'] = Proj4js.defs['EPSG:3875']; //maintain backward compat, official code is 3875 Proj4js.defs['GOOGLE'] = Proj4js.defs['EPSG:3875']; Proj4js.defs['EPSG:900913'] = Proj4js.defs['EPSG:3875']; Proj4js.defs['EPSG:102113'] = Proj4js.defs['EPSG:3875']; Proj4js.common = { PI : 3.141592653589793238, //Math.PI, Loading Loading @@ -1285,7 +1257,7 @@ Proj4js.datum = Proj4js.Class({ /****************************************************************/ // cs_compare_datums() // Returns 1 (TRUE) if the two datums match, otherwise 0 (FALSE). // Returns TRUE if the two datums match, otherwise FALSE. compare_datums : function( dest ) { if( this.datum_type != dest.datum_type ) { return false; // false, datums are not equal Loading @@ -1305,9 +1277,10 @@ Proj4js.datum = Proj4js.Class({ && 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 if ( this.datum_type == Proj4js.common.PJD_GRIDSHIFT || dest.datum_type == Proj4js.common.PJD_GRIDSHIFT ) { alert("ERROR: Grid shift transformations are not implemented."); return false } else { return true; // datums are equal } Loading Loading @@ -1794,6 +1767,7 @@ Proj4js.wktProjections = { "Lambert Tangential Conformal Conic Projection": "lcc", "Mercator": "merc", "Popular Visualisation Pseudo Mercator": "merc", "Mercator_1SP": "merc", "Transverse_Mercator": "tmerc", "Transverse Mercator": "tmerc", "Lambert Azimuthal Equal Area": "laea", Loading Loading @@ -1913,13 +1887,13 @@ Proj4js.Proj.aea = { lat = this.phi1z(this.e3,qs); } else { if (qs >= 0) { lat = .5 * PI; lat = .5 * Proj4js.common.PI; } else { lat = -.5 * PI; lat = -.5 * Proj4js.common.PI; } } } else { lat = this.phi1z(e3,qs); lat = this.phi1z(this.e3,qs); } lon = Proj4js.common.adjust_lon(theta/this.ns0 + this.long0); Loading @@ -1932,7 +1906,7 @@ Proj4js.Proj.aea = { Albers Conical Equal-Area projection. -------------------------------------------*/ phi1z: function (eccent,qs) { var con, com, dphi; var sinphi, cosphi, con, com, dphi; var phi = Proj4js.common.asinz(.5 * qs); if (eccent < Proj4js.common.EPSLN) return phi; Loading Loading @@ -1975,6 +1949,7 @@ Proj4js.Proj.sterea = { }, forward : function(p) { var sinc, cosc, cosl, k; 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); Loading @@ -1989,14 +1964,14 @@ Proj4js.Proj.sterea = { }, inverse : function(p) { var lon,lat; var sinc, cosc, lon, lat, rho; 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); var 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); Loading @@ -2022,7 +1997,7 @@ Proj4js.Proj.sterea = { Polyconic projection. ------------------------------------------------------------*/ function phi4z (eccent,e0,e1,e2,e3,a,b,c,phi) { var sinphi, sin2ph, tanph, ml, mlp, con1, con2, con3, dphi, i; var sinphi, sin2ph, tanphi, ml, mlp, con1, con2, con3, dphi, i; phi = a; for (i = 1; i <= 15; i++) { Loading Loading @@ -2092,7 +2067,7 @@ Proj4js.Proj.poly = { ----------------------------------*/ init: function() { var temp; /* temporary variable */ if (this.lat0=0) this.lat0=90;//this.lat0 ca if (this.lat0 == 0) this.lat0 = 90;//this.lat0 ca /* Place parameters in static storage for common use -------------------------------------------------*/ Loading Loading @@ -2882,6 +2857,145 @@ Proj4js.Proj.ortho = { }; /* ====================================================================== projCode/krovak.js ====================================================================== */ /** NOTES: According to EPSG the full Krovak projection method should have the following parameters. Within PROJ.4 the azimuth, and pseudo standard parallel are hardcoded in the algorithm and can't be altered from outside. The others all have defaults to match the common usage with Krovak projection. lat_0 = latitude of centre of the projection lon_0 = longitude of centre of the projection ** = azimuth (true) of the centre line passing through the centre of the projection ** = latitude of pseudo standard parallel k = scale factor on the pseudo standard parallel x_0 = False Easting of the centre of the projection at the apex of the cone y_0 = False Northing of the centre of the projection at the apex of the cone **/ Proj4js.Proj.krovak = { init: function() { /* we want Bessel as fixed ellipsoid */ this.a = 6377397.155; this.es = 0.006674372230614; this.e = Math.sqrt(this.es); /* if latitude of projection center is not set, use 49d30'N */ if (!this.lat0) { this.lat0 = 0.863937979737193; } if (!this.long0) { this.long0 = 0.7417649320975901 - 0.308341501185665; } /* if scale not set default to 0.9999 */ if (!this.k0) { this.k0 = 0.9999; } this.s45 = 0.785398163397448; /* 45° */ this.s90 = 2 * this.s45; this.fi0 = this.lat0; /* Latitude of projection centre 49° 30' */ /* Ellipsoid Bessel 1841 a = 6377397.155m 1/f = 299.1528128, e2=0.006674372230614; */ this.e2 = this.es; /* 0.006674372230614; */ 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; /* DU(2, 59, 42, 42.69689) */ 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; /* Latitude of pseudo standard parallel 78° 30'00" N */ this.n = Math.sin(this.s0); this.ro0 = this.k1 * this.n0 / Math.tan(this.s0); this.ad = this.s90 - this.uq; }, /* ellipsoid */ /* calculate xy from lat/lon */ /* Constants, identical to inverse transform function */ forward: function(p) { var gfi, u, deltav, s, d, eps, ro; var lon = p.x; var lat = p.y; var delta_lon = Proj4js.common.adjust_lon(lon - this.long0); // Delta longitude /* Transformation */ gfi = Math.pow ( ((1. + this.e * Math.sin(lat)) / (1. - this.e * Math.sin(lat))) , (this.alfa * this.e / 2.)); u= 2. * (Math.atan(this.k * Math.pow( Math.tan(lat / 2. + this.s45), this.alfa) / gfi)-this.s45); deltav = - delta_lon * this.alfa; s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav)); d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s)); eps = this.n * d; ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2. + this.s45) , this.n) / Math.pow(Math.tan(s / 2. + this.s45) , this.n); /* x and y are reverted! */ //p.y = ro * Math.cos(eps) / a; //p.x = ro * Math.sin(eps) / a; p.y = ro * Math.cos(eps) / 1.0; p.x = ro * Math.sin(eps) / 1.0; if(this.czech) { p.y *= -1.0; p.x *= -1.0; } return (p); }, /* calculate lat/lon from xy */ inverse: function(p) { /* Constants, identisch wie in der Umkehrfunktion */ var u, deltav, s, d, eps, ro, fi1; var ok; /* Transformation */ /* revert y, x*/ var tmp = p.x; p.x=p.y; p.y=tmp; if(this.czech) { p.y *= -1.0; p.x *= -1.0; } ro = Math.sqrt(p.x * p.x + p.y * p.y); eps = Math.atan2(p.y, p.x); d = eps / Math.sin(this.s0); s = 2. * (Math.atan( Math.pow(this.ro0 / ro, 1. / this.n) * Math.tan(this.s0 / 2. + this.s45)) - this.s45); u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d)); deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u)); p.x = this.long0 - deltav / this.alfa; /* ITERATION FOR lat */ fi1 = u; ok = 0; var iter = 0; do { p.y = 2. * ( Math.atan( Math.pow( this.k, -1. / this.alfa) * Math.pow( Math.tan(u / 2. + this.s45) , 1. / this.alfa) * Math.pow( (1. + this.e * Math.sin(fi1)) / (1. - this.e * Math.sin(fi1)) , this.e / 2.) ) - this.s45); if (Math.abs(fi1 - p.y) < 0.0000000001) ok=1; fi1 = p.y; iter += 1; } while (ok==0 && iter < 15); if (iter >= 15) { Proj4js.reportError("PHI3Z-CONV:Latitude failed to converge after 15 iterations"); //console.log('iter:', iter); return null; } return (p); } }; /* ====================================================================== projCode/somerc.js ====================================================================== */ Loading Loading @@ -3120,19 +3234,20 @@ Proj4js.Proj.stere = { coslam = Math.cos(lon); sinlam = Math.sin(lon); sinphi = Math.sin(lat); var sinX, cosX; 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); var Xt = 2. * Math.atan(this.ssfn_(lat, sinphi, this.e)); sinX = Math.sin(Xt - Proj4js.common.HALF_PI); cosX = Math.cos(Xt); } switch (this.mode) { case this.OBLIQ: A = this.akm1 / (this.cosX1 * (1. + this.sinX1 * sinX + this.cosX1 * cosX * coslam)); var 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); var A = 2. * this.akm1 / (1. + cosX * coslam); y = A * sinX; x = A * cosX; break; Loading Loading @@ -3433,7 +3548,7 @@ Proj4js.Proj.nzmg = { var d_phi_n = 1; // d_phi^0 var d_psi = 0; for (n = 1; n <= 10; n++) { for (var n = 1; n <= 10; n++) { d_phi_n = d_phi_n * d_phi; d_psi = d_psi + this.A[n] * d_phi_n; } Loading @@ -3446,17 +3561,15 @@ Proj4js.Proj.nzmg = { var th_n_re1; var th_n_im1; var z_re = 0; var z_im = 0; for (n = 1; n <= 6; n++) { for (var 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; p.x = (z_im * this.a) + this.x0; p.y = (z_re * this.a) + this.y0; return p; }, Loading @@ -3481,7 +3594,7 @@ Proj4js.Proj.nzmg = { var z_n_re1; var z_n_im1; var th_re = 0; var th_im = 0; for (n = 1; n <= 6; n++) { for (var 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; Loading @@ -3491,12 +3604,12 @@ Proj4js.Proj.nzmg = { // 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++) { for (var 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++) { for (var 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); Loading @@ -3504,7 +3617,7 @@ Proj4js.Proj.nzmg = { 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++) { for (var 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); Loading @@ -3520,7 +3633,7 @@ Proj4js.Proj.nzmg = { var d_psi_n = 1; // d_psi^0 var d_phi = 0; for (n = 1; n <= 9; n++) { for (var n = 1; n <= 9; n++) { d_psi_n = d_psi_n * d_psi; d_phi = d_phi + this.D[n] * d_psi_n; } Loading Loading @@ -3658,6 +3771,7 @@ Proj4js.Proj.gnom = { var coslon; /* cos of longitude */ var ksp; /* scale factor */ var g; var x, y; var lon=p.x; var lat=p.y; /* Forward equations Loading Loading @@ -3904,7 +4018,7 @@ Proj4js.Proj.vandg = { /* Van Der Grinten inverse equations--mapping x,y to lat/long ---------------------------------------------------------*/ inverse: function(p) { var dlon; var lon, lat; var xx,yy,xys,c1,c2,c3; var al,asq; var a1; Loading Loading @@ -4007,7 +4121,7 @@ Proj4js.Proj.cea = { var lat=p.y; /* Forward equations -----------------*/ dlon = Proj4js.common.adjust_lon(lon -this.long0); var 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 Loading Loading @@ -4173,6 +4287,7 @@ Proj4js.Proj.cass = { p.y -= this.y0; var x = p.x/this.a; var y = p.y/this.a; var phi, lam; if (this.sphere) { this.dd = y + this.lat0; Loading @@ -4180,7 +4295,7 @@ Proj4js.Proj.cass = { lam = Math.atan2(Math.tan(x), Math.cos(this.dd)); } else { /* ellipsoid */ ph1 = this.pj_inv_mlfn(this.m0 + y, this.es, this.en); var 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); Loading @@ -4200,7 +4315,7 @@ Proj4js.Proj.cass = { //code from the PROJ.4 pj_mlfn.c file; this may be useful for other projections pj_enfn: function(es) { en = new Array(); var 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; Loading @@ -4218,10 +4333,10 @@ Proj4js.Proj.cass = { }, 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); var k = 1./(1.-es); var phi = arg; for (var i = Proj4js.common.MAX_ITER; i ; --i) { /* rarely goes over 2 iterations */ var 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; Loading Loading @@ -4261,8 +4376,8 @@ Proj4js.Proj.cass = { Proj4js.Proj.gauss = { init : function() { sphi = Math.sin(this.lat0); cphi = Math.cos(this.lat0); var sphi = Math.sin(this.lat0); var 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)); Loading @@ -4284,7 +4399,7 @@ Proj4js.Proj.gauss = { 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); var 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; Loading Loading @@ -4429,7 +4544,7 @@ Proj4js.Proj.omerc = { } else { this.con = Math.abs(this.lat1); } if ((this.con <= Proj4js.common.EPSLN) || (Math.abs(this.con - HALF_PI) <= Proj4js.common.EPSLN)) { if ((this.con <= Proj4js.common.EPSLN) || (Math.abs(this.con - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN)) { Proj4js.reportError("omercInitDataError"); //return(202); } else { Loading Loading @@ -4522,7 +4637,7 @@ Proj4js.Proj.omerc = { var con, n, ml; /* cone constant, small m */ var vs,us,q,s,ts1; var vl,ul,bs; var dlon; var lon, lat; var flag; /* Inverse equations Loading Loading @@ -4924,6 +5039,7 @@ Proj4js.Proj.laea = { p.y -= this.y0; var x = p.x/this.a; var y = p.y/this.a; var lam, phi; if (this.sphere) { var cosz=0.0, rh, sinz=0.0; Loading
lib/proj4js-compressed.js +36 −36 File changed.Preview size limit exceeded, changes collapsed. Show changes
lib/proj4js.js +4 −3 Original line number Diff line number Diff line Loading @@ -74,9 +74,10 @@ Proj4js = { return point; } // Workaround for Spherical Mercator if ((source.srsProjNumber =="900913" && dest.datumCode != "WGS84" && !dest.datum_params) || (dest.srsProjNumber == "900913" && source.datumCode != "WGS84" && !source.datum_params)) { // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 if (source.datum && dest.datum && ( ((source.datum.datum_type == Proj4js.common.PJD_3PARAM || source.datum.datum_type == Proj4js.common.PJD_7PARAM) && dest.datumCode != "WGS84") || ((dest.datum.datum_type == Proj4js.common.PJD_3PARAM || dest.datum.datum_type == Proj4js.common.PJD_7PARAM) && source.datumCode != "WGS84"))) { var wgs84 = Proj4js.WGS84; this.transform(source, wgs84, point); source = wgs84; Loading
test/index.html +1 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ <head> <link href="base.css" type="text/css" rel="stylesheet"/> <title>Proj4js Test Page</title> <script src="../lib/proj4js.js"></script> <script src="../lib/proj4js-combined.js"></script> <script src="../lib/defs/EPSG42304.js"></script> <script src="../lib/util/MGRS.js"></script> <script src="testdata.js"></script> Loading
test/runtests.js +13 −1 Original line number Diff line number Diff line Loading @@ -11,6 +11,18 @@ function runTests() { alert(testRes.toString()); */ /* //testing the conversion bewteen CSs which use the towgs84 params (ticket #64) //TODO convert this to asserts src = new Proj4js.Proj("EPSG:21781"); dest = new Proj4js.Proj("EPSG:900913"); var testPt = new Proj4js.Point([699212,227132]); var testRes = Proj4js.transform(src, dest, testPt); alert(testRes.toString()); //result should be 973791.60867,5972764.60117 */ for (var i=0; i < Proj4js.testPoints.length; ++i) { var test = Proj4js.testPoints[i]; var proj = new Proj4js.Proj(test.code, Proj4js.bind(showResults, this, test)); Loading