UNPKG

proj4

Version:

Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.

1,767 lines (1,672 loc) 155 kB
!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.proj4=e():"undefined"!=typeof global?global.proj4=e():"undefined"!=typeof self&&(self.proj4=e())}(function(){var define,module,exports; return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ var mgrs = require('mgrs'); function Point(x, y, z) { if (!(this instanceof Point)) { return new Point(x, y, z); } if (Array.isArray(x)) { this.x = x[0]; this.y = x[1]; this.z = x[2] || 0.0; }else if(typeof x === 'object'){ this.x = x.x; this.y = x.y; this.z = x.z || 0.0; } else if (typeof x === 'string' && typeof y === 'undefined') { var coords = x.split(','); this.x = parseFloat(coords[0], 10); this.y = parseFloat(coords[1], 10); this.z = parseFloat(coords[2], 10) || 0.0; } else { this.x = x; this.y = y; this.z = z || 0.0; } this.clone = function() { return new Point(this.x, this.y, this.z); }; this.toArray = function(){ if(this.z){ return [this.x,this.y, this.z]; }else{ return [this.x,this.y]; } }; this.toString = function() { if(this.z){ return "x=" + this.x + ",y=" + this.y + ",z="+this.z; }else{ return "x=" + this.x + ",y=" + this.y; } }; this.toShortString = function() { if(this.z){ return this.x + "," + this.y+ "," + this.z; }else{ return this.x + "," + this.y; } }; } Point.fromMGRS = function(mgrsStr) { return new Point(mgrs.toPoint(mgrsStr)); }; Point.prototype.toMGRS = function(accuracy) { return mgrs.forward([this.x, this.y], accuracy); }; module.exports = Point; },{"mgrs":66}],2:[function(require,module,exports){ var parseCode = require("./parseCode"); var extend = require('./extend'); var projections = require('./projections'); var deriveConstants = require('./deriveConstants'); function Projection(srsCode,callback) { if (!(this instanceof Projection)) { return new Projection(srsCode); } callback = callback || function(error){ if(error){ throw error; } }; var json = parseCode(srsCode); if(typeof json !== 'object'){ callback(srsCode); return; } var modifiedJSON = deriveConstants(json); var ourProj = Projection.projections.get(modifiedJSON.projName); if(ourProj){ extend(this, modifiedJSON); extend(this, ourProj); this.init(); callback(null, this); }else{ callback(srsCode); } } Projection.projections = projections; Projection.projections.start(); module.exports = Projection; },{"./deriveConstants":31,"./extend":32,"./parseCode":35,"./projections":37}],3:[function(require,module,exports){ module.exports = function(crs, denorm, point) { var xin = point.x, yin = point.y, zin = point.z || 0.0; var v, t, i; for (i = 0; i < 3; i++) { if (denorm && i === 2 && point.z === undefined) { continue; } if (i === 0) { v = xin; t = 'x'; } else if (i === 1) { v = yin; t = 'y'; } else { v = zin; t = 'z'; } switch (crs.axis[i]) { case 'e': point[t] = v; break; case 'w': point[t] = -v; break; case 'n': point[t] = v; break; case 's': point[t] = -v; break; case 'u': if (point[t] !== undefined) { point.z = v; } break; case 'd': if (point[t] !== undefined) { point.z = -v; } break; default: //console.log("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+crs.projName); return null; } } return point; }; },{}],4:[function(require,module,exports){ var HALF_PI = Math.PI/2; var sign = require('./sign'); module.exports = function(x) { return (Math.abs(x) < HALF_PI) ? x : (x - (sign(x) * Math.PI)); }; },{"./sign":21}],5:[function(require,module,exports){ var TWO_PI = Math.PI * 2; var sign = require('./sign'); module.exports = function(x) { return (Math.abs(x) < Math.PI) ? x : (x - (sign(x) * TWO_PI)); }; },{"./sign":21}],6:[function(require,module,exports){ module.exports = function(x) { if (Math.abs(x) > 1) { x = (x > 1) ? 1 : -1; } return Math.asin(x); }; },{}],7:[function(require,module,exports){ module.exports = function(x) { return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x))); }; },{}],8:[function(require,module,exports){ module.exports = function(x) { return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x))); }; },{}],9:[function(require,module,exports){ module.exports = function(x) { return (0.05859375 * x * x * (1 + 0.75 * x)); }; },{}],10:[function(require,module,exports){ module.exports = function(x) { return (x * x * x * (35 / 3072)); }; },{}],11:[function(require,module,exports){ module.exports = function(a, e, sinphi) { var temp = e * sinphi; return a / Math.sqrt(1 - temp * temp); }; },{}],12:[function(require,module,exports){ module.exports = function(ml, e0, e1, e2, e3) { var phi; var dphi; phi = ml / e0; for (var i = 0; i < 15; i++) { dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi)); phi += dphi; if (Math.abs(dphi) <= 0.0000000001) { return phi; } } //..reportError("IMLFN-CONV:Latitude failed to converge after 15 iterations"); return NaN; }; },{}],13:[function(require,module,exports){ var HALF_PI = Math.PI/2; module.exports = function(eccent, q) { var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent)); if (Math.abs(Math.abs(q) - temp) < 1.0E-6) { if (q < 0) { return (-1 * HALF_PI); } else { return HALF_PI; } } //var phi = 0.5* q/(1-eccent*eccent); var phi = Math.asin(0.5 * q); var dphi; var sin_phi; var cos_phi; var con; for (var i = 0; i < 30; i++) { sin_phi = Math.sin(phi); cos_phi = Math.cos(phi); con = eccent * sin_phi; dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con))); phi += dphi; if (Math.abs(dphi) <= 0.0000000001) { return phi; } } //console.log("IQSFN-CONV:Latitude failed to converge after 30 iterations"); return NaN; }; },{}],14:[function(require,module,exports){ module.exports = function(e0, e1, e2, e3, phi) { return (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi)); }; },{}],15:[function(require,module,exports){ module.exports = function(eccent, sinphi, cosphi) { var con = eccent * sinphi; return cosphi / (Math.sqrt(1 - con * con)); }; },{}],16:[function(require,module,exports){ var HALF_PI = Math.PI/2; module.exports = function(eccent, ts) { var eccnth = 0.5 * eccent; var con, dphi; var phi = HALF_PI - 2 * Math.atan(ts); for (var i = 0; i <= 15; i++) { con = eccent * Math.sin(phi); dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi; phi += dphi; if (Math.abs(dphi) <= 0.0000000001) { return phi; } } //console.log("phi2z has NoConvergence"); return -9999; }; },{}],17:[function(require,module,exports){ var C00 = 1; var C02 = 0.25; var C04 = 0.046875; var C06 = 0.01953125; var C08 = 0.01068115234375; var C22 = 0.75; var C44 = 0.46875; var C46 = 0.01302083333333333333; var C48 = 0.00712076822916666666; var C66 = 0.36458333333333333333; var C68 = 0.00569661458333333333; var C88 = 0.3076171875; module.exports = function(es) { var en = []; en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08))); en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08))); var t = es * es; en[2] = t * (C44 - es * (C46 + es * C48)); t *= es; en[3] = t * (C66 - es * C68); en[4] = t * es * C88; return en; }; },{}],18:[function(require,module,exports){ var pj_mlfn = require("./pj_mlfn"); var EPSLN = 1.0e-10; var MAX_ITER = 20; module.exports = function(arg, es, en) { var k = 1 / (1 - es); var phi = arg; for (var i = MAX_ITER; i; --i) { /* rarely goes over 2 iterations */ var s = Math.sin(phi); var t = 1 - es * s * s; //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg; //phi -= t * (t * Math.sqrt(t)) * k; t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k; phi -= t; if (Math.abs(t) < EPSLN) { return phi; } } //..reportError("cass:pj_inv_mlfn: Convergence error"); return phi; }; },{"./pj_mlfn":19}],19:[function(require,module,exports){ module.exports = 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])))); }; },{}],20:[function(require,module,exports){ module.exports = function(eccent, sinphi) { var con; if (eccent > 1.0e-7) { con = eccent * sinphi; return ((1 - eccent * eccent) * (sinphi / (1 - con * con) - (0.5 / eccent) * Math.log((1 - con) / (1 + con)))); } else { return (2 * sinphi); } }; },{}],21:[function(require,module,exports){ module.exports = function(x) { return x<0 ? -1 : 1; }; },{}],22:[function(require,module,exports){ module.exports = function(esinp, exp) { return (Math.pow((1 - esinp) / (1 + esinp), exp)); }; },{}],23:[function(require,module,exports){ var HALF_PI = Math.PI/2; module.exports = function(eccent, phi, sinphi) { var con = eccent * sinphi; var com = 0.5 * eccent; con = Math.pow(((1 - con) / (1 + con)), com); return (Math.tan(0.5 * (HALF_PI - phi)) / con); }; },{}],24:[function(require,module,exports){ exports.wgs84 = { towgs84: "0,0,0", ellipse: "WGS84", datumName: "WGS84" }; exports.ch1903 = { towgs84: "674.374,15.056,405.346", ellipse: "bessel", datumName: "swiss" }; exports.ggrs87 = { towgs84: "-199.87,74.79,246.62", ellipse: "GRS80", datumName: "Greek_Geodetic_Reference_System_1987" }; exports.nad83 = { towgs84: "0,0,0", ellipse: "GRS80", datumName: "North_American_Datum_1983" }; exports.nad27 = { nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", ellipse: "clrk66", datumName: "North_American_Datum_1927" }; exports.potsdam = { towgs84: "606.0,23.0,413.0", ellipse: "bessel", datumName: "Potsdam Rauenberg 1950 DHDN" }; exports.carthage = { towgs84: "-263.0,6.0,431.0", ellipse: "clark80", datumName: "Carthage 1934 Tunisia" }; exports.hermannskogel = { towgs84: "653.0,-212.0,449.0", ellipse: "bessel", datumName: "Hermannskogel" }; exports.ire65 = { towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", ellipse: "mod_airy", datumName: "Ireland 1965" }; exports.rassadiran = { towgs84: "-133.63,-157.5,-158.62", ellipse: "intl", datumName: "Rassadiran" }; exports.nzgd49 = { towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", ellipse: "intl", datumName: "New Zealand Geodetic Datum 1949" }; exports.osgb36 = { towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", ellipse: "airy", datumName: "Airy 1830" }; exports.s_jtsk = { towgs84: "589,76,480", ellipse: 'bessel', datumName: 'S-JTSK (Ferro)' }; exports.beduaram = { towgs84: '-106,-87,188', ellipse: 'clrk80', datumName: 'Beduaram' }; exports.gunung_segara = { towgs84: '-403,684,41', ellipse: 'bessel', datumName: 'Gunung Segara Jakarta' }; },{}],25:[function(require,module,exports){ exports.MERIT = { a: 6378137.0, rf: 298.257, ellipseName: "MERIT 1983" }; exports.SGS85 = { a: 6378136.0, rf: 298.257, ellipseName: "Soviet Geodetic System 85" }; exports.GRS80 = { a: 6378137.0, rf: 298.257222101, ellipseName: "GRS 1980(IUGG, 1980)" }; exports.IAU76 = { a: 6378140.0, rf: 298.257, ellipseName: "IAU 1976" }; exports.airy = { a: 6377563.396, b: 6356256.910, ellipseName: "Airy 1830" }; exports.APL4 = { a: 6378137, rf: 298.25, ellipseName: "Appl. Physics. 1965" }; exports.NWL9D = { a: 6378145.0, rf: 298.25, ellipseName: "Naval Weapons Lab., 1965" }; exports.mod_airy = { a: 6377340.189, b: 6356034.446, ellipseName: "Modified Airy" }; exports.andrae = { a: 6377104.43, rf: 300.0, ellipseName: "Andrae 1876 (Den., Iclnd.)" }; exports.aust_SA = { a: 6378160.0, rf: 298.25, ellipseName: "Australian Natl & S. Amer. 1969" }; exports.GRS67 = { a: 6378160.0, rf: 298.2471674270, ellipseName: "GRS 67(IUGG 1967)" }; exports.bessel = { a: 6377397.155, rf: 299.1528128, ellipseName: "Bessel 1841" }; exports.bess_nam = { a: 6377483.865, rf: 299.1528128, ellipseName: "Bessel 1841 (Namibia)" }; exports.clrk66 = { a: 6378206.4, b: 6356583.8, ellipseName: "Clarke 1866" }; exports.clrk80 = { a: 6378249.145, rf: 293.4663, ellipseName: "Clarke 1880 mod." }; exports.clrk58 = { a: 6378293.645208759, rf: 294.2606763692654, ellipseName: "Clarke 1858" }; exports.CPM = { a: 6375738.7, rf: 334.29, ellipseName: "Comm. des Poids et Mesures 1799" }; exports.delmbr = { a: 6376428.0, rf: 311.5, ellipseName: "Delambre 1810 (Belgium)" }; exports.engelis = { a: 6378136.05, rf: 298.2566, ellipseName: "Engelis 1985" }; exports.evrst30 = { a: 6377276.345, rf: 300.8017, ellipseName: "Everest 1830" }; exports.evrst48 = { a: 6377304.063, rf: 300.8017, ellipseName: "Everest 1948" }; exports.evrst56 = { a: 6377301.243, rf: 300.8017, ellipseName: "Everest 1956" }; exports.evrst69 = { a: 6377295.664, rf: 300.8017, ellipseName: "Everest 1969" }; exports.evrstSS = { a: 6377298.556, rf: 300.8017, ellipseName: "Everest (Sabah & Sarawak)" }; exports.fschr60 = { a: 6378166.0, rf: 298.3, ellipseName: "Fischer (Mercury Datum) 1960" }; exports.fschr60m = { a: 6378155.0, rf: 298.3, ellipseName: "Fischer 1960" }; exports.fschr68 = { a: 6378150.0, rf: 298.3, ellipseName: "Fischer 1968" }; exports.helmert = { a: 6378200.0, rf: 298.3, ellipseName: "Helmert 1906" }; exports.hough = { a: 6378270.0, rf: 297.0, ellipseName: "Hough" }; exports.intl = { a: 6378388.0, rf: 297.0, ellipseName: "International 1909 (Hayford)" }; exports.kaula = { a: 6378163.0, rf: 298.24, ellipseName: "Kaula 1961" }; exports.lerch = { a: 6378139.0, rf: 298.257, ellipseName: "Lerch 1979" }; exports.mprts = { a: 6397300.0, rf: 191.0, ellipseName: "Maupertius 1738" }; exports.new_intl = { a: 6378157.5, b: 6356772.2, ellipseName: "New International 1967" }; exports.plessis = { a: 6376523.0, rf: 6355863.0, ellipseName: "Plessis 1817 (France)" }; exports.krass = { a: 6378245.0, rf: 298.3, ellipseName: "Krassovsky, 1942" }; exports.SEasia = { a: 6378155.0, b: 6356773.3205, ellipseName: "Southeast Asia" }; exports.walbeck = { a: 6376896.0, b: 6355834.8467, ellipseName: "Walbeck" }; exports.WGS60 = { a: 6378165.0, rf: 298.3, ellipseName: "WGS 60" }; exports.WGS66 = { a: 6378145.0, rf: 298.25, ellipseName: "WGS 66" }; exports.WGS7 = { a: 6378135.0, rf: 298.26, ellipseName: "WGS 72" }; exports.WGS84 = { a: 6378137.0, rf: 298.257223563, ellipseName: "WGS 84" }; exports.sphere = { a: 6370997.0, b: 6370997.0, ellipseName: "Normal Sphere (r=6370997)" }; },{}],26:[function(require,module,exports){ exports.greenwich = 0.0; //"0dE", exports.lisbon = -9.131906111111; //"9d07'54.862\"W", exports.paris = 2.337229166667; //"2d20'14.025\"E", exports.bogota = -74.080916666667; //"74d04'51.3\"W", exports.madrid = -3.687938888889; //"3d41'16.58\"W", exports.rome = 12.452333333333; //"12d27'8.4\"E", exports.bern = 7.439583333333; //"7d26'22.5\"E", exports.jakarta = 106.807719444444; //"106d48'27.79\"E", exports.ferro = -17.666666666667; //"17d40'W", exports.brussels = 4.367975; //"4d22'4.71\"E", exports.stockholm = 18.058277777778; //"18d3'29.8\"E", exports.athens = 23.7163375; //"23d42'58.815\"E", exports.oslo = 10.722916666667; //"10d43'22.5\"E" },{}],27:[function(require,module,exports){ var point = require('./Point'); var proj = require('./Proj'); var transform = require('./transform'); var wgs84 = proj('WGS84'); function transformer(from, to, coords) { var transformedArray; if (Array.isArray(coords)) { transformedArray = transform(from, to, point(coords)); if (coords.length === 3) { return [transformedArray.x, transformedArray.y, transformedArray.z]; } else { return [transformedArray.x, transformedArray.y]; } } else { return transform(from, to, coords); } } function checkProj(item) { if (item instanceof proj) { return item; } if (item.oProj) { return item.oProj; } return proj(item); } function proj4(fromProj, toProj, coord) { fromProj = checkProj(fromProj); var single = false; var obj; if (typeof toProj === 'undefined') { toProj = fromProj; fromProj = wgs84; single = true; } else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) { coord = toProj; toProj = fromProj; fromProj = wgs84; single = true; } toProj = checkProj(toProj); if (coord) { return transformer(fromProj, toProj, coord); } else { obj = { forward: function(coords) { return transformer(fromProj, toProj, coords); }, inverse: function(coords) { return transformer(toProj, fromProj, coords); } }; if (single) { obj.oProj = toProj; } return obj; } } module.exports = proj4; },{"./Point":1,"./Proj":2,"./transform":63}],28:[function(require,module,exports){ var HALF_PI = Math.PI/2; var PJD_3PARAM = 1; var PJD_7PARAM = 2; var PJD_GRIDSHIFT = 3; var PJD_WGS84 = 4; // WGS84 or equivalent var PJD_NODATUM = 5; // WGS84 or equivalent var SEC_TO_RAD = 4.84813681109535993589914102357e-6; var AD_C = 1.0026000; var COS_67P5 = 0.38268343236508977; var datum = function(proj) { if (!(this instanceof datum)) { return new datum(proj); } this.datum_type = PJD_WGS84; //default setting if (!proj) { return; } if (proj.datumCode && proj.datumCode === 'none') { this.datum_type = PJD_NODATUM; } if (proj.datum_params) { for (var i = 0; i < proj.datum_params.length; i++) { proj.datum_params[i] = parseFloat(proj.datum_params[i]); } if (proj.datum_params[0] !== 0 || proj.datum_params[1] !== 0 || proj.datum_params[2] !== 0) { this.datum_type = PJD_3PARAM; } if (proj.datum_params.length > 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 = PJD_7PARAM; proj.datum_params[3] *= SEC_TO_RAD; proj.datum_params[4] *= SEC_TO_RAD; proj.datum_params[5] *= SEC_TO_RAD; proj.datum_params[6] = (proj.datum_params[6] / 1000000.0) + 1.0; } } } // DGR 2011-03-21 : nadgrids support this.datum_type = proj.grids ? PJD_GRIDSHIFT : this.datum_type; 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; if (this.datum_type === PJD_GRIDSHIFT) { this.grids = proj.grids; } }; datum.prototype = { /****************************************************************/ // cs_compare_datums() // 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 } 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 === 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 === 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 === PJD_GRIDSHIFT || dest.datum_type === PJD_GRIDSHIFT) { //alert("ERROR: Grid shift transformations are not implemented."); //return false //DGR 2012-07-29 lazy ... return this.nadgrids === dest.nadgrids; } 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 < -HALF_PI && Latitude > -1.001 * HALF_PI) { Latitude = -HALF_PI; } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) { Latitude = HALF_PI; } else if ((Latitude < -HALF_PI) || (Latitude > HALF_PI)) { /* Latitude out of range */ //..reportError('geocent:lat out of range:' + Latitude); return null; } if (Longitude > Math.PI) { Longitude -= (2 * Math.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 = 1e-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 = 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 for 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 = HALF_PI; } else if (Y < 0) { Longitude = -HALF_PI; } else { At_Pole = true; Longitude = 0.0; if (Z > 0.0) { /* north pole */ Latitude = HALF_PI; } else if (Z < 0.0) { /* south pole */ Latitude = -HALF_PI; } else { /* center of earth */ Latitude = HALF_PI; Height = -this.b; return; } } } W2 = X * X + Y * Y; W = Math.sqrt(W2); T0 = Z * 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 >= COS_67P5) { Height = W / Cos_p1 - Rn; } else if (Cos_p1 <= -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 === 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 === 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 === 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 === 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. */ module.exports = datum; },{}],29:[function(require,module,exports){ var PJD_3PARAM = 1; var PJD_7PARAM = 2; var PJD_GRIDSHIFT = 3; var PJD_NODATUM = 5; // WGS84 or equivalent var SRS_WGS84_SEMIMAJOR = 6378137; // only used in grid shift transforms var SRS_WGS84_ESQUARED = 0.006694379990141316; //DGR: 2012-07-29 module.exports = function(source, dest, point) { var wp, i, l; function checkParams(fallback) { return (fallback === PJD_3PARAM || fallback === PJD_7PARAM); } // Short cut if the datums are identical. if (source.compare_datums(dest)) { return point; // in this case, zero is sucess, // whereas cs_compare_datums returns 1 to indicate TRUE // confusing, should fix this } // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) { return point; } //DGR: 2012-07-29 : add nadgrids support (begin) var src_a = source.a; var src_es = source.es; var dst_a = dest.a; var dst_es = dest.es; var fallback = source.datum_type; // If this datum requires grid shifts, then apply it to geodetic coordinates. if (fallback === PJD_GRIDSHIFT) { if (this.apply_gridshift(source, 0, point) === 0) { source.a = SRS_WGS84_SEMIMAJOR; source.es = SRS_WGS84_ESQUARED; } else { // try 3 or 7 params transformation or nothing ? if (!source.datum_params) { source.a = src_a; source.es = source.es; return point; } wp = 1; for (i = 0, l = source.datum_params.length; i < l; i++) { wp *= source.datum_params[i]; } if (wp === 0) { source.a = src_a; source.es = source.es; return point; } if (source.datum_params.length > 3) { fallback = PJD_7PARAM; } else { fallback = PJD_3PARAM; } } } if (dest.datum_type === PJD_GRIDSHIFT) { dest.a = SRS_WGS84_SEMIMAJOR; dest.es = SRS_WGS84_ESQUARED; } // Do we need to go through geocentric coordinates? if (source.es !== dest.es || source.a !== dest.a || checkParams(fallback) || checkParams(dest.datum_type)) { //DGR: 2012-07-29 : add nadgrids support (end) // Convert to geocentric coordinates. source.geodetic_to_geocentric(point); // CHECK_RETURN; // Convert between datums if (checkParams(source.datum_type)) { source.geocentric_to_wgs84(point); // CHECK_RETURN; } if (checkParams(dest.datum_type)) { dest.geocentric_from_wgs84(point); // CHECK_RETURN; } // Convert back to geodetic coordinates dest.geocentric_to_geodetic(point); // CHECK_RETURN; } // Apply grid shift to destination if required if (dest.datum_type === PJD_GRIDSHIFT) { this.apply_gridshift(dest, 1, point); // CHECK_RETURN; } source.a = src_a; source.es = src_es; dest.a = dst_a; dest.es = dst_es; return point; }; },{}],30:[function(require,module,exports){ var globals = require('./global'); var parseProj = require('./projString'); var wkt = require('./wkt'); function defs(name) { /*global console*/ var that = this; if (arguments.length === 2) { if (arguments[1][0] === '+') { defs[name] = parseProj(arguments[1]); } else { defs[name] = wkt(arguments[1]); } } else if (arguments.length === 1) { if (Array.isArray(name)) { return name.map(function(v) { if (Array.isArray(v)) { defs.apply(that, v); } else { defs(v); } }); } else if (typeof name === 'string') { } else if ('EPSG' in name) { defs['EPSG:' + name.EPSG] = name; } else if ('ESRI' in name) { defs['ESRI:' + name.ESRI] = name; } else if ('IAU2000' in name) { defs['IAU2000:' + name.IAU2000] = name; } else { console.log(name); } return; } } globals(defs); module.exports = defs; },{"./global":33,"./projString":36,"./wkt":65}],31:[function(require,module,exports){ var Datum = require('./constants/Datum'); var Ellipsoid = require('./constants/Ellipsoid'); var extend = require('./extend'); var datum = require('./datum'); var EPSLN = 1.0e-10; // ellipoid pj_set_ell.c var SIXTH = 0.1666666666666666667; /* 1/6 */ var RA4 = 0.04722222222222222222; /* 17/360 */ var RA6 = 0.02215608465608465608; module.exports = function(json) { // DGR 2011-03-20 : nagrids -> nadgrids if (json.datumCode && json.datumCode !== 'none') { var datumDef = Datum[json.datumCode]; if (datumDef) { json.datum_params = datumDef.towgs84 ? datumDef.towgs84.split(',') : null; json.ellps = datumDef.ellipse; json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode; } } if (!json.a) { // do we have an ellipsoid? var ellipse = Ellipsoid[json.ellps] ? Ellipsoid[json.ellps] : Ellipsoid.WGS84; extend(json, ellipse); } if (json.rf && !json.b) { json.b = (1.0 - 1.0 / json.rf) * json.a; } if (json.rf === 0 || Math.abs(json.a - json.b) < EPSLN) { json.sphere = true; json.b = json.a; } json.a2 = json.a * json.a; // used in geocentric json.b2 = json.b * json.b; // used in geocentric json.es = (json.a2 - json.b2) / json.a2; // e ^ 2 json.e = Math.sqrt(json.es); // eccentricity if (json.R_A) { json.a *= 1 - json.es * (SIXTH + json.es * (RA4 + json.es * RA6)); json.a2 = json.a * json.a; json.b2 = json.b * json.b; json.es = 0; } json.ep2 = (json.a2 - json.b2) / json.b2; // used in geocentric if (!json.k0) { json.k0 = 1.0; //default value } //DGR 2010-11-12: axis if (!json.axis) { json.axis = "enu"; } json.datum = datum(json); return json; }; },{"./constants/Datum":24,"./constants/Ellipsoid":25,"./datum":28,"./extend":32}],32:[function(require,module,exports){ module.exports = function(destination, source) { destination = destination || {}; var value, property; if (!source) { return destination; } for (property in source) { value = source[property]; if (value !== undefined) { destination[property] = value; } } return destination; }; },{}],33:[function(require,module,exports){ module.exports = function(defs) { defs('WGS84', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"); defs('EPSG:4326', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"); defs('EPSG:4269', "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"); defs('EPSG:3857', "+title=WGS 84 / Pseudo-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"); defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857 defs.GOOGLE = defs['EPSG:3857']; defs['EPSG:900913'] = defs['EPSG:3857']; defs['EPSG:102113'] = defs['EPSG:3857']; }; },{}],34:[function(require,module,exports){ var proj4 = require('./core'); proj4.defaultDatum = 'WGS84'; //default datum proj4.Proj = require('./Proj'); proj4.WGS84 = new proj4.Proj('WGS84'); proj4.Point = require('./Point'); proj4.defs = require('./defs'); proj4.transform = require('./transform'); proj4.mgrs = require('mgrs'); proj4.version = require('./version'); require('./includedProjections')(proj4); module.exports = proj4; },{"./Point":1,"./Proj":2,"./core":27,"./defs":30,"./includedProjections":"gWUPNW","./transform":63,"./version":64,"mgrs":66}],35:[function(require,module,exports){ var defs = require('./defs'); var wkt = require('./wkt'); var projStr = require('./projString'); function testObj(code){ return typeof code === 'string'; } function testDef(code){ return code in defs; } function testWKT(code){ var codeWords = ['GEOGCS','GEOCCS','PROJCS','LOCAL_CS']; return codeWords.reduce(function(a,b){ return a+1+code.indexOf(b); },0); } function testProj(code){ return code[0] === '+'; } function parse(code){ if (testObj(code)) { //check to see if this is a WKT string if (testDef(code)) { return defs[code]; } else if (testWKT(code)) { return wkt(code); } else if (testProj(code)) { return projStr(code); } }else{ return code; } } module.exports = parse; },{"./defs":30,"./projString":36,"./wkt":65}],36:[function(require,module,exports){ var D2R = 0.01745329251994329577; var PrimeMeridian = require('./constants/PrimeMeridian'); module.exports = function(defData) { var self = {}; var paramObj = {}; defData.split("+").map(function(v) { return v.trim(); }).filter(function(a) { return a; }).forEach(function(a) { var split = a.split("="); split.push(true); paramObj[split[0].toLowerCase()] = split[1]; }); var paramName, paramVal, paramOutname; var params = { proj: 'projName', datum: 'datumCode', rf: function(v) { self.rf = parseFloat(v, 10); }, lat_0: function(v) { self.lat0 = v * D2R; }, lat_1: function(v) { self.lat1 = v * D2R; }, lat_2: function(v) { self.lat2 = v * D2R; }, lat_ts: function(v) { self.lat_ts = v * D2R; }, lon_0: function(v) { self.long0 = v * D2R; }, lon_1: function(v) { self.long1 = v * D2R; }, lon_2: function(v) { self.long2 = v * D2R; }, alpha: function(v) { self.alpha = parseFloat(v) * D2R; }, lonc: function(v) { self.longc = v * D2R; }, x_0: function(v) { self.x0 = parseFloat(v, 10); }, y_0: function(v) { self.y0 = parseFloat(v, 10); }, k_0: function(v) { self.k0 = parseFloat(v, 10); }, k: function(v) { self.k0 = parseFloat(v, 10); }, r_a: function() { self.R_A = true; }, zone: function(v) { self.zone = parseInt(v, 10); }, south: function() { self.utmSouth = true; }, towgs84: function(v) { self.datum_params = v.split(",").map(function(a) { return parseFloat(a, 10); }); }, to_meter: function(v) { self.to_meter = parseFloat(v, 10); }, from_greenwich: function(v) { self.from_greenwich = v * D2R; }, pm: function(v) { self.from_greenwich = (PrimeMeridian[v] ? PrimeMeridian[v] : parseFloat(v, 10)) * D2R; }, nadgrids: function(v) { if (v === '@null') { self.datumCode = 'none'; } else { self.nadgrids = v; } }, axis: function(v) { var legalAxis = "ewnsud"; if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) { self.axis = v; } } }; for (paramName in paramObj) { paramVal = paramObj[paramName]; if (paramName in params) { paramOutname = params[paramName]; if (typeof paramOutname === 'function') { paramOutname(paramVal); } else { self[paramOutname] = paramVal; } } else { self[paramName] = paramVal; } } return self; }; },{"./constants/PrimeMeridian":26}],37:[function(require,module,exports){ var projs = [ require('./projections/merc'), require('./projections/longlat') ]; var names = {}; var projStore = []; function add(proj, i) { var len = projStore.length; if (!proj.names) { console.log(i); return true; } projStore[len] = proj; proj.names.forEach(function(n) { names[n.toLowerCase()] = len; }); return this; } exports.add = add; exports.get = function(name) { if (!name) { return false; } var n = name.toLowerCase(); if (typeof names[n] !== 'undefined' && projStore[names[n]]) { return projStore[names[n]]; } }; exports.start = function() { projs.forEach(add); }; },{"./projections/longlat":49,"./projections/merc":50}],38:[function(require,module,exports){ var EPSLN = 1.0e-10; var msfnz = require('../common/msfnz'); var qsfnz = require('../common/qsfnz'); var adjust_lon = require('../common/adjust_lon'); var asinz = require('../common/asinz'); exports.init = function() { if (Math.abs(this.lat1 + this.lat2) < EPSLN) { return; } this.temp = this.b / this.a; this.es = 1 - 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 = msfnz(this.e3, this.sin_po, this.cos_po); this.qs1 = 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 = msfnz(this.e3, this.sin_po, this.cos_po); this.qs2 = 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 = qsfnz(this.e3, this.sin_po, this.cos_po); if (Math.abs(this.lat1 - this.lat2) > 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 -------------------------------------------------------------------*/ exports.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 = 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 * 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; }; exports.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; } else { rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); con = -1; } theta = 0; if (rh1 !== 0) { theta = Math.atan2(con * p.x, con * p.y); } con = rh1 * this.ns0 / this.a; if (this.sphere) { lat = Math.asin((this.c - con * con) / (2 * this.ns0)); } else { qs = (this.c - con * con) / this.ns0; lat = this.phi1z(this.e3, qs); } lon = 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. -------------------------------------------*/ exports.phi1z = function(eccent, qs) { var sinphi, cosphi, con, com, dphi; var phi = asinz(0.5 * qs); if (eccent < 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 - con * con; dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con))); phi = phi + dphi; if (Math.abs(dphi) <= 1e-7) { return phi; } } return null; }; exports.names = ["Albers_Conic_Equal_Area", "Albers", "aea"]; },{"../common/adjust_lon":5,"../common/asinz":6,"../common/msfnz":15,"../common/qsfnz":20}],39:[function(require,module,exports){ var adjust_lon = require('../common/adjust_lon'); var HALF_PI = Math.PI/2; var EPSLN = 1.0e-10; var mlfn = require('../common/mlfn'); var e0fn = require('../common/e0fn'); var e1fn = require('../common/e1fn'); var e2fn = require('../common/e2fn'); var e3fn = require('../common/e3fn'); var gN = require('../common/gN'); var asinz = require('../common/asinz'); var imlfn = require('../common/imlfn'); exports.init = function() { this.sin_p12 = Math.sin(this.lat0); this.cos_p12 = Math.cos(this.lat0); }; exports.forward = function(p) { var lon = p.x; var lat = p.y; var sinphi = Math.sin(p.y); var cosphi = Math.cos(p.y); var dlon = adjust_lon(lon - this.long0); var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5; if (this.sphere) { if (Math.abs(this.sin_p12 - 1) <= EPSLN) { //North Pole case p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon); p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon); return p; } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { //South Pole case p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon); p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon); return p; } else { //default case cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon); c = Math.acos(cos_c); kp = c / Math.sin(c); p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon); p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon)); return p; } } else { e0 = e0fn(this.es); e1 = e1fn(this.es); e2 = e2fn(this.es); e3 = e3fn(this.es); if (Math.abs(this.sin_p12 - 1) <= EPSLN) { //North Pole case Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); Ml = this.a * mlfn(e0, e1, e2, e3, lat); p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon); p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon); return p; } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { //South Pole case Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); Ml = this.a * mlfn(e0, e1, e2, e3, lat); p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon); p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon); return p; } else { //Default case tanphi = sinphi / cosphi; Nl1 = gN(this.a, this.e, this.sin_p12); Nl = gN(this.a, this.e, sinphi); psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi)); Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon)); if (Az === 0) { s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); } else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) { s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); }