From 00ef0bf2ae135692ddf28227b40fe144d5ce1509 Mon Sep 17 00:00:00 2001 From: gagan-bansal Date: Fri, 11 Apr 2014 07:04:09 +0000 Subject: [PATCH] all test passed , remaining explode --- dist/geojson2svg.js | 5594 +------------------------------------------ examples/world.js | 28 +- package.json | 5 +- src/converter.js | 25 +- src/defaults.js | 8 - src/instance.js | 99 +- src/main.js | 3 +- test/test.js | 107 +- test/testdata1.js | 130 +- 9 files changed, 250 insertions(+), 5749 deletions(-) diff --git a/dist/geojson2svg.js b/dist/geojson2svg.js index 10406d1..3bcd3d9 100644 --- a/dist/geojson2svg.js +++ b/dist/geojson2svg.js @@ -134,5497 +134,6 @@ var deepExtend = module.exports = function (/*obj_1, [obj_2], [obj_N]*/) { })(); },{}],3:[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":69}],4:[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":33,"./extend":34,"./parseCode":38,"./projections":40}],5:[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; -}; - -},{}],6:[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":23}],7:[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":23}],8:[function(require,module,exports){ -module.exports = function(x) { - if (Math.abs(x) > 1) { - x = (x > 1) ? 1 : -1; - } - return Math.asin(x); -}; -},{}],9:[function(require,module,exports){ -module.exports = function(x) { - return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x))); -}; -},{}],10:[function(require,module,exports){ -module.exports = function(x) { - return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x))); -}; -},{}],11:[function(require,module,exports){ -module.exports = function(x) { - return (0.05859375 * x * x * (1 + 0.75 * x)); -}; -},{}],12:[function(require,module,exports){ -module.exports = function(x) { - return (x * x * x * (35 / 3072)); -}; -},{}],13:[function(require,module,exports){ -module.exports = function(a, e, sinphi) { - var temp = e * sinphi; - return a / Math.sqrt(1 - temp * temp); -}; -},{}],14:[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; -}; -},{}],15:[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; -}; -},{}],16:[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)); -}; -},{}],17:[function(require,module,exports){ -module.exports = function(eccent, sinphi, cosphi) { - var con = eccent * sinphi; - return cosphi / (Math.sqrt(1 - con * con)); -}; -},{}],18:[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; -}; -},{}],19:[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; -}; -},{}],20:[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":21}],21:[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])))); -}; -},{}],22:[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); - } -}; -},{}],23:[function(require,module,exports){ -module.exports = function(x) { - return x<0 ? -1 : 1; -}; -},{}],24:[function(require,module,exports){ -module.exports = function(esinp, exp) { - return (Math.pow((1 - esinp) / (1 + esinp), exp)); -}; -},{}],25:[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); -}; -},{}],26:[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' -}; -},{}],27:[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)" -}; -},{}],28:[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" -},{}],29:[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":3,"./Proj":4,"./transform":66}],30:[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; - -},{}],31:[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; -}; - - -},{}],32:[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":35,"./projString":39,"./wkt":68}],33:[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":26,"./constants/Ellipsoid":27,"./datum":30,"./extend":34}],34:[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; -}; - -},{}],35:[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']; -}; - -},{}],36:[function(require,module,exports){ -var projs = [ - require('./projections/tmerc'), - require('./projections/utm'), - require('./projections/sterea'), - require('./projections/stere'), - require('./projections/somerc'), - require('./projections/omerc'), - require('./projections/lcc'), - require('./projections/krovak'), - require('./projections/cass'), - require('./projections/laea'), - require('./projections/aea'), - require('./projections/gnom'), - require('./projections/cea'), - require('./projections/eqc'), - require('./projections/poly'), - require('./projections/nzmg'), - require('./projections/mill'), - require('./projections/sinu'), - require('./projections/moll'), - require('./projections/eqdc'), - require('./projections/vandg'), - require('./projections/aeqd') -]; -module.exports = function(proj4){ - projs.forEach(function(proj){ - proj4.Proj.projections.add(proj); - }); -}; -},{"./projections/aea":41,"./projections/aeqd":42,"./projections/cass":43,"./projections/cea":44,"./projections/eqc":45,"./projections/eqdc":46,"./projections/gnom":48,"./projections/krovak":49,"./projections/laea":50,"./projections/lcc":51,"./projections/mill":54,"./projections/moll":55,"./projections/nzmg":56,"./projections/omerc":57,"./projections/poly":58,"./projections/sinu":59,"./projections/somerc":60,"./projections/stere":61,"./projections/sterea":62,"./projections/tmerc":63,"./projections/utm":64,"./projections/vandg":65}],37:[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":3,"./Proj":4,"./core":29,"./defs":32,"./includedProjections":36,"./transform":66,"./version":67,"mgrs":69}],38:[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":32,"./projString":39,"./wkt":68}],39:[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":28}],40:[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":52,"./projections/merc":53}],41:[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":7,"../common/asinz":8,"../common/msfnz":17,"../common/qsfnz":22}],42:[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)); - } - else { - s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az)); - } - G = this.e * this.sin_p12 / Math.sqrt(1 - this.es); - H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es); - GH = G * H; - Hs = H * H; - s2 = s * s; - s3 = s2 * s; - s4 = s3 * s; - s5 = s4 * s; - c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH); - p.x = this.x0 + c * Math.sin(Az); - p.y = this.y0 + c * Math.cos(Az); - return p; - } - } - - -}; - -exports.inverse = function(p) { - p.x -= this.x0; - p.y -= this.y0; - var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F; - if (this.sphere) { - rh = Math.sqrt(p.x * p.x + p.y * p.y); - if (rh > (2 * HALF_PI * this.a)) { - return; - } - z = rh / this.a; - - sinz = Math.sin(z); - cosz = Math.cos(z); - - lon = this.long0; - if (Math.abs(rh) <= EPSLN) { - lat = this.lat0; - } - else { - lat = asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh); - con = Math.abs(this.lat0) - HALF_PI; - if (Math.abs(con) <= EPSLN) { - if (this.lat0 >= 0) { - lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y)); - } - else { - lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); - } - } - else { - /*con = cosz - this.sin_p12 * Math.sin(lat); - if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) { - //no-op, just keep the lon value as is - } else { - var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh)); - lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh))); - }*/ - lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz)); - } - } - - p.x = lon; - p.y = lat; - 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); - rh = Math.sqrt(p.x * p.x + p.y * p.y); - M = Mlp - rh; - lat = imlfn(M / this.a, e0, e1, e2, e3); - lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y)); - p.x = lon; - p.y = lat; - return p; - } - else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { - //South pole case - Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); - rh = Math.sqrt(p.x * p.x + p.y * p.y); - M = rh - Mlp; - - lat = imlfn(M / this.a, e0, e1, e2, e3); - lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); - p.x = lon; - p.y = lat; - return p; - } - else { - //default case - rh = Math.sqrt(p.x * p.x + p.y * p.y); - Az = Math.atan2(p.x, p.y); - N1 = gN(this.a, this.e, this.sin_p12); - cosAz = Math.cos(Az); - tmp = this.e * this.cos_p12 * cosAz; - A = -tmp * tmp / (1 - this.es); - B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es); - D = rh / N1; - Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24; - F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6; - psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz); - lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi))); - lat = Math.atan((1 - this.es * F * this.sin_p12 / Math.sin(psi)) * Math.tan(psi) / (1 - this.es)); - p.x = lon; - p.y = lat; - return p; - } - } - -}; -exports.names = ["Azimuthal_Equidistant", "aeqd"]; - -},{"../common/adjust_lon":7,"../common/asinz":8,"../common/e0fn":9,"../common/e1fn":10,"../common/e2fn":11,"../common/e3fn":12,"../common/gN":13,"../common/imlfn":14,"../common/mlfn":16}],43:[function(require,module,exports){ -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 adjust_lon = require('../common/adjust_lon'); -var adjust_lat = require('../common/adjust_lat'); -var imlfn = require('../common/imlfn'); -var HALF_PI = Math.PI/2; -var EPSLN = 1.0e-10; -exports.init = function() { - if (!this.sphere) { - this.e0 = e0fn(this.es); - this.e1 = e1fn(this.es); - this.e2 = e2fn(this.es); - this.e3 = e3fn(this.es); - this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); - } -}; - - - -/* Cassini forward equations--mapping lat,long to x,y - -----------------------------------------------------------------------*/ -exports.forward = function(p) { - - /* Forward equations - -----------------*/ - var x, y; - var lam = p.x; - var phi = p.y; - lam = adjust_lon(lam - this.long0); - - if (this.sphere) { - x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam)); - y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0); - } - else { - //ellipsoid - var sinphi = Math.sin(phi); - var cosphi = Math.cos(phi); - var nl = gN(this.a, this.e, sinphi); - var tl = Math.tan(phi) * Math.tan(phi); - var al = lam * Math.cos(phi); - var asq = al * al; - var cl = this.es * cosphi * cosphi / (1 - this.es); - var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); - - x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120)); - y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24); - - - } - - p.x = x + this.x0; - p.y = y + this.y0; - return p; -}; - -/* Inverse equations - -----------------*/ -exports.inverse = function(p) { - p.x -= this.x0; - p.y -= this.y0; - var x = p.x / this.a; - var y = p.y / this.a; - var phi, lam; - - if (this.sphere) { - var dd = y + this.lat0; - phi = Math.asin(Math.sin(dd) * Math.cos(x)); - lam = Math.atan2(Math.tan(x), Math.cos(dd)); - } - else { - /* ellipsoid */ - var ml1 = this.ml0 / this.a + y; - var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3); - if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) { - p.x = this.long0; - p.y = HALF_PI; - if (y < 0) { - p.y *= -1; - } - return p; - } - var nl1 = gN(this.a, this.e, Math.sin(phi1)); - - var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es); - var tl1 = Math.pow(Math.tan(phi1), 2); - var dl = x * this.a / nl1; - var dsq = dl * dl; - phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24); - lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1); - - } - - p.x = adjust_lon(lam + this.long0); - p.y = adjust_lat(phi); - return p; - -}; -exports.names = ["Cassini", "Cassini_Soldner", "cass"]; -},{"../common/adjust_lat":6,"../common/adjust_lon":7,"../common/e0fn":9,"../common/e1fn":10,"../common/e2fn":11,"../common/e3fn":12,"../common/gN":13,"../common/imlfn":14,"../common/mlfn":16}],44:[function(require,module,exports){ -var adjust_lon = require('../common/adjust_lon'); -var qsfnz = require('../common/qsfnz'); -var msfnz = require('../common/msfnz'); -var iqsfnz = require('../common/iqsfnz'); -/* - reference: - "Cartographic Projection Procedures for the UNIX Environment- - A User's Manual" by Gerald I. Evenden, - USGS Open File Report 90-284and Release 4 Interim Reports (2003) -*/ -exports.init = function() { - //no-op - if (!this.sphere) { - this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); - } -}; - - -/* Cylindrical Equal Area forward equations--mapping lat,long to x,y - ------------------------------------------------------------*/ -exports.forward = function(p) { - var lon = p.x; - var lat = p.y; - var x, y; - /* Forward equations - -----------------*/ - var dlon = adjust_lon(lon - this.long0); - if (this.sphere) { - x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); - y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts); - } - else { - var qs = qsfnz(this.e, Math.sin(lat)); - x = this.x0 + this.a * this.k0 * dlon; - y = this.y0 + this.a * qs * 0.5 / this.k0; - } - - p.x = x; - p.y = y; - return p; -}; - -/* Cylindrical Equal Area inverse equations--mapping x,y to lat/long - ------------------------------------------------------------*/ -exports.inverse = function(p) { - p.x -= this.x0; - p.y -= this.y0; - var lon, lat; - - if (this.sphere) { - lon = adjust_lon(this.long0 + (p.x / this.a) / Math.cos(this.lat_ts)); - lat = Math.asin((p.y / this.a) * Math.cos(this.lat_ts)); - } - else { - lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a); - lon = adjust_lon(this.long0 + p.x / (this.a * this.k0)); - } - - p.x = lon; - p.y = lat; - return p; -}; -exports.names = ["cea"]; - -},{"../common/adjust_lon":7,"../common/iqsfnz":15,"../common/msfnz":17,"../common/qsfnz":22}],45:[function(require,module,exports){ -var adjust_lon = require('../common/adjust_lon'); -var adjust_lat = require('../common/adjust_lat'); -exports.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); -}; - - -// forward equations--mapping lat,long to x,y -// ----------------------------------------------------------------- -exports.forward = function(p) { - - var lon = p.x; - var lat = p.y; - - var dlon = adjust_lon(lon - this.long0); - var dlat = 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 -// ----------------------------------------------------------------- -exports.inverse = function(p) { - - var x = p.x; - var y = p.y; - - p.x = adjust_lon(this.long0 + ((x - this.x0) / (this.a * this.rc))); - p.y = adjust_lat(this.lat0 + ((y - this.y0) / (this.a))); - return p; -}; -exports.names = ["Equirectangular", "Equidistant_Cylindrical", "eqc"]; - -},{"../common/adjust_lat":6,"../common/adjust_lon":7}],46:[function(require,module,exports){ -var e0fn = require('../common/e0fn'); -var e1fn = require('../common/e1fn'); -var e2fn = require('../common/e2fn'); -var e3fn = require('../common/e3fn'); -var msfnz = require('../common/msfnz'); -var mlfn = require('../common/mlfn'); -var adjust_lon = require('../common/adjust_lon'); -var adjust_lat = require('../common/adjust_lat'); -var imlfn = require('../common/imlfn'); -var EPSLN = 1.0e-10; -exports.init = function() { - - /* Place parameters in static storage for common use - -------------------------------------------------*/ - // Standard Parallels cannot be equal and on opposite sides of the equator - if (Math.abs(this.lat1 + this.lat2) < EPSLN) { - return; - } - this.lat2 = this.lat2 || this.lat1; - this.temp = this.b / this.a; - this.es = 1 - Math.pow(this.temp, 2); - this.e = Math.sqrt(this.es); - this.e0 = e0fn(this.es); - this.e1 = e1fn(this.es); - this.e2 = e2fn(this.es); - this.e3 = e3fn(this.es); - - this.sinphi = Math.sin(this.lat1); - this.cosphi = Math.cos(this.lat1); - - this.ms1 = msfnz(this.e, this.sinphi, this.cosphi); - this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1); - - if (Math.abs(this.lat1 - this.lat2) < EPSLN) { - this.ns = this.sinphi; - } - else { - this.sinphi = Math.sin(this.lat2); - this.cosphi = Math.cos(this.lat2); - this.ms2 = msfnz(this.e, this.sinphi, this.cosphi); - this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2); - this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1); - } - this.g = this.ml1 + this.ms1 / this.ns; - this.ml0 = 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 - -----------------------------------------------------------*/ -exports.forward = function(p) { - var lon = p.x; - var lat = p.y; - var rh1; - - /* Forward equations - -----------------*/ - if (this.sphere) { - rh1 = this.a * (this.g - lat); - } - else { - var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat); - rh1 = this.a * (this.g - ml); - } - var theta = this.ns * 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 - -----------------*/ -exports.inverse = function(p) { - p.x -= this.x0; - p.y = this.rh - p.y + this.y0; - var con, rh1, lat, lon; - if (this.ns >= 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; - } - var theta = 0; - if (rh1 !== 0) { - theta = Math.atan2(con * p.x, con * p.y); - } - - if (this.sphere) { - lon = adjust_lon(this.long0 + theta / this.ns); - lat = adjust_lat(this.g - rh1 / this.a); - p.x = lon; - p.y = lat; - return p; - } - else { - var ml = this.g - rh1 / this.a; - lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3); - lon = adjust_lon(this.long0 + theta / this.ns); - p.x = lon; - p.y = lat; - return p; - } - -}; -exports.names = ["Equidistant_Conic", "eqdc"]; - -},{"../common/adjust_lat":6,"../common/adjust_lon":7,"../common/e0fn":9,"../common/e1fn":10,"../common/e2fn":11,"../common/e3fn":12,"../common/imlfn":14,"../common/mlfn":16,"../common/msfnz":17}],47:[function(require,module,exports){ -var FORTPI = Math.PI/4; -var srat = require('../common/srat'); -var HALF_PI = Math.PI/2; -var MAX_ITER = 20; -exports.init = function() { - var sphi = Math.sin(this.lat0); - var cphi = Math.cos(this.lat0); - cphi *= cphi; - this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi); - this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - 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 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp)); -}; - -exports.forward = function(p) { - var lon = p.x; - var lat = p.y; - - p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI; - p.x = this.C * lon; - return p; -}; - -exports.inverse = function(p) { - var DEL_TOL = 1e-14; - var lon = p.x / this.C; - var lat = p.y; - var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C); - for (var i = MAX_ITER; i > 0; --i) { - lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI; - if (Math.abs(lat - p.y) < DEL_TOL) { - break; - } - p.y = lat; - } - /* convergence failed */ - if (!i) { - return null; - } - p.x = lon; - p.y = lat; - return p; -}; -exports.names = ["gauss"]; - -},{"../common/srat":24}],48:[function(require,module,exports){ -var adjust_lon = require('../common/adjust_lon'); -var EPSLN = 1.0e-10; -var asinz = require('../common/asinz'); - -/* - reference: - Wolfram Mathworld "Gnomonic Projection" - http://mathworld.wolfram.com/GnomonicProjection.html - Accessed: 12th November 2009 - */ -exports.init = function() { - - /* 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; - this.rc = 1; -}; - - -/* Gnomonic forward equations--mapping lat,long to x,y - ---------------------------------------------------*/ -exports.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 x, y; - var lon = p.x; - var lat = p.y; - /* Forward equations - -----------------*/ - dlon = 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; - if ((g > 0) || (Math.abs(g) <= 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 { - - // 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; -}; - - -exports.inverse = function(p) { - var rh; /* Rho */ - 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 = 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 = adjust_lon(this.long0 + lon); - } - else { - lat = this.phic0; - lon = 0; - } - - p.x = lon; - p.y = lat; - return p; -}; -exports.names = ["gnom"]; - -},{"../common/adjust_lon":7,"../common/asinz":8}],49:[function(require,module,exports){ -var adjust_lon = require('../common/adjust_lon'); -exports.init = function() { - this.a = 6377397.155; - this.es = 0.006674372230614; - this.e = Math.sqrt(this.es); - 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; - 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; -}; - -/* ellipsoid */ -/* calculate xy from lat/lon */ -/* Constants, identical to inverse transform function */ -exports.forward = function(p) { - var gfi, u, deltav, s, d, eps, ro; - var lon = p.x; - var lat = p.y; - var delta_lon = adjust_lon(lon - this.long0); - /* 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); - p.y = ro * Math.cos(eps) / 1; - p.x = ro * Math.sin(eps) / 1; - - if (!this.czech) { - p.y *= -1; - p.x *= -1; - } - return (p); -}; - -/* calculate lat/lon from xy */ -exports.inverse = function(p) { - 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; - p.x *= -1; - } - 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; - 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) { - return null; - } - - return (p); -}; -exports.names = ["Krovak", "krovak"]; - -},{"../common/adjust_lon":7}],50:[function(require,module,exports){ -var HALF_PI = Math.PI/2; -var FORTPI = Math.PI/4; -var EPSLN = 1.0e-10; -var qsfnz = require('../common/qsfnz'); -var adjust_lon = require('../common/adjust_lon'); -/* - reference - "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, - The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. - */ - -exports.S_POLE = 1; -exports.N_POLE = 2; -exports.EQUIT = 3; -exports.OBLIQ = 4; - - -/* Initialize the Lambert Azimuthal Equal Area projection - ------------------------------------------------------*/ -exports.init = function() { - var t = Math.abs(this.lat0); - if (Math.abs(t - HALF_PI) < EPSLN) { - this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE; - } - else if (Math.abs(t) < EPSLN) { - this.mode = this.EQUIT; - } - else { - this.mode = this.OBLIQ; - } - if (this.es > 0) { - var sinphi; - - this.qp = qsfnz(this.e, 1); - this.mmf = 0.5 / (1 - this.es); - this.apa = this.authset(this.es); - switch (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(0.5 * this.qp); - this.dd = 1 / this.rq; - this.xmf = 1; - this.ymf = 0.5 * this.qp; - break; - case this.OBLIQ: - this.rq = Math.sqrt(0.5 * this.qp); - sinphi = Math.sin(this.lat0); - this.sinb1 = 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 - -----------------------------------------------------------------------*/ -exports.forward = function(p) { - - /* Forward equations - -----------------*/ - var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi; - var lam = p.x; - var phi = p.y; - - lam = adjust_lon(lam - this.long0); - - if (this.sphere) { - sinphi = Math.sin(phi); - cosphi = Math.cos(phi); - coslam = Math.cos(lam); - if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { - y = (this.mode === this.EQUIT) ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; - if (y <= EPSLN) { - 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; - } - else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { - if (this.mode === this.N_POLE) { - coslam = -coslam; - } - if (Math.abs(phi + this.phi0) < EPSLN) { - return null; - } - y = FORTPI - phi * 0.5; - y = 2 * ((this.mode === this.S_POLE) ? Math.cos(y) : Math.sin(y)); - x = y * Math.sin(lam); - y *= coslam; - } - } - else { - sinb = 0; - cosb = 0; - b = 0; - coslam = Math.cos(lam); - sinlam = Math.sin(lam); - sinphi = Math.sin(phi); - q = 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 = HALF_PI + phi; - q = this.qp - q; - break; - case this.S_POLE: - b = phi - HALF_PI; - q = this.qp + q; - break; - } - if (Math.abs(b) < EPSLN) { - 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; - } - } - - p.x = this.a * x + this.x0; - p.y = this.a * y + this.y0; - return p; -}; - -/* Inverse equations - -----------------*/ -exports.inverse = function(p) { - p.x -= this.x0; - p.y -= this.y0; - var x = p.x / this.a; - var y = p.y / this.a; - var lam, phi, cCe, sCe, q, rho, ab; - - if (this.sphere) { - var cosz = 0, - rh, sinz = 0; - - rh = Math.sqrt(x * x + y * y); - phi = rh * 0.5; - if (phi > 1) { - 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) <= EPSLN) ? 0 : Math.asin(y * sinz / rh); - x *= sinz; - y = cosz * rh; - break; - case this.OBLIQ: - phi = (Math.abs(rh) <= EPSLN) ? this.phi0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh); - x *= sinz * this.cosph0; - y = (cosz - Math.sin(phi) * this.sinph0) * rh; - break; - case this.N_POLE: - y = -y; - phi = HALF_PI - phi; - break; - case this.S_POLE: - phi -= HALF_PI; - break; - } - lam = (y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ)) ? 0 : Math.atan2(x, y); - } - else { - ab = 0; - if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { - x /= this.dd; - y *= this.dd; - rho = Math.sqrt(x * x + y * y); - if (rho < EPSLN) { - p.x = 0; - p.y = this.phi0; - return p; - } - sCe = 2 * Math.asin(0.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; - } - } - else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { - if (this.mode === this.N_POLE) { - y = -y; - } - q = (x * x + y * y); - if (!q) { - p.x = 0; - p.y = this.phi0; - return p; - } - ab = 1 - q / this.qp; - if (this.mode === this.S_POLE) { - ab = -ab; - } - } - lam = Math.atan2(x, y); - phi = this.authlat(Math.asin(ab), this.apa); - } - - - p.x = adjust_lon(this.long0 + lam); - p.y = phi; - return p; -}; - -/* determine latitude from authalic latitude */ -exports.P00 = 0.33333333333333333333; -exports.P01 = 0.17222222222222222222; -exports.P02 = 0.10257936507936507936; -exports.P10 = 0.06388888888888888888; -exports.P11 = 0.06640211640211640211; -exports.P20 = 0.01641501294219154443; - -exports.authset = function(es) { - var t; - var APA = []; - 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; -}; - -exports.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)); -}; -exports.names = ["Lambert Azimuthal Equal Area", "Lambert_Azimuthal_Equal_Area", "laea"]; - -},{"../common/adjust_lon":7,"../common/qsfnz":22}],51:[function(require,module,exports){ -var EPSLN = 1.0e-10; -var msfnz = require('../common/msfnz'); -var tsfnz = require('../common/tsfnz'); -var HALF_PI = Math.PI/2; -var sign = require('../common/sign'); -var adjust_lon = require('../common/adjust_lon'); -var phi2z = require('../common/phi2z'); -exports.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.lat1; - } //if lat2 is not defined - if (!this.k0) { - this.k0 = 1; - } - - // Standard Parallels cannot be equal and on opposite sides of the equator - if (Math.abs(this.lat1 + this.lat2) < EPSLN) { - return; - } - - var temp = this.b / this.a; - this.e = Math.sqrt(1 - temp * temp); - - var sin1 = Math.sin(this.lat1); - var cos1 = Math.cos(this.lat1); - var ms1 = msfnz(this.e, sin1, cos1); - var ts1 = tsfnz(this.e, this.lat1, sin1); - - var sin2 = Math.sin(this.lat2); - var cos2 = Math.cos(this.lat2); - var ms2 = msfnz(this.e, sin2, cos2); - var ts2 = tsfnz(this.e, this.lat2, sin2); - - var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0)); - - if (Math.abs(this.lat1 - this.lat2) > EPSLN) { - this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2); - } - else { - this.ns = sin1; - } - if (isNaN(this.ns)) { - 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 -// ----------------------------------------------------------------- -exports.forward = function(p) { - - var lon = p.x; - var lat = p.y; - - // singular cases : - if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) { - lat = sign(lat) * (HALF_PI - 2 * EPSLN); - } - - var con = Math.abs(Math.abs(lat) - HALF_PI); - var ts, rh1; - if (con > EPSLN) { - ts = 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) { - return null; - } - rh1 = 0; - } - var theta = this.ns * 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 -// ----------------------------------------------------------------- -exports.inverse = function(p) { - - var rh1, con, ts; - var lat, lon; - var x = (p.x - this.x0) / this.k0; - var y = (this.rh - (p.y - this.y0) / this.k0); - if (this.ns > 0) { - rh1 = Math.sqrt(x * x + y * y); - con = 1; - } - else { - rh1 = -Math.sqrt(x * x + y * y); - con = -1; - } - var theta = 0; - if (rh1 !== 0) { - theta = Math.atan2((con * x), (con * y)); - } - if ((rh1 !== 0) || (this.ns > 0)) { - con = 1 / this.ns; - ts = Math.pow((rh1 / (this.a * this.f0)), con); - lat = phi2z(this.e, ts); - if (lat === -9999) { - return null; - } - } - else { - lat = -HALF_PI; - } - lon = adjust_lon(theta / this.ns + this.long0); - - p.x = lon; - p.y = lat; - return p; -}; - -exports.names = ["Lambert Tangential Conformal Conic Projection", "Lambert_Conformal_Conic", "Lambert_Conformal_Conic_2SP", "lcc"]; - -},{"../common/adjust_lon":7,"../common/msfnz":17,"../common/phi2z":18,"../common/sign":23,"../common/tsfnz":25}],52:[function(require,module,exports){ -exports.init = function() { - //no-op for longlat -}; - -function identity(pt) { - return pt; -} -exports.forward = identity; -exports.inverse = identity; -exports.names = ["longlat", "identity"]; - -},{}],53:[function(require,module,exports){ -var msfnz = require('../common/msfnz'); -var HALF_PI = Math.PI/2; -var EPSLN = 1.0e-10; -var R2D = 57.29577951308232088; -var adjust_lon = require('../common/adjust_lon'); -var FORTPI = Math.PI/4; -var tsfnz = require('../common/tsfnz'); -var phi2z = require('../common/phi2z'); -exports.init = function() { - var con = this.b / this.a; - this.es = 1 - con * con; - if(!('x0' in this)){ - this.x0 = 0; - } - if(!('y0' in this)){ - this.y0 = 0; - } - this.e = Math.sqrt(this.es); - if (this.lat_ts) { - if (this.sphere) { - this.k0 = Math.cos(this.lat_ts); - } - else { - this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); - } - } - else { - if (!this.k0) { - if (this.k) { - this.k0 = this.k; - } - else { - this.k0 = 1; - } - } - } -}; - -/* Mercator forward equations--mapping lat,long to x,y - --------------------------------------------------*/ - -exports.forward = function(p) { - var lon = p.x; - var lat = p.y; - // convert to radians - if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) { - return null; - } - - var x, y; - if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { - return null; - } - else { - if (this.sphere) { - x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); - y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat)); - } - else { - var sinphi = Math.sin(lat); - var ts = tsfnz(this.e, lat, sinphi); - x = this.x0 + this.a * this.k0 * 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 - --------------------------------------------------*/ -exports.inverse = function(p) { - - var x = p.x - this.x0; - var y = p.y - this.y0; - var lon, lat; - - if (this.sphere) { - lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0))); - } - else { - var ts = Math.exp(-y / (this.a * this.k0)); - lat = phi2z(this.e, ts); - if (lat === -9999) { - return null; - } - } - lon = adjust_lon(this.long0 + x / (this.a * this.k0)); - - p.x = lon; - p.y = lat; - return p; -}; - -exports.names = ["Mercator", "Popular Visualisation Pseudo Mercator", "Mercator_1SP", "Mercator_Auxiliary_Sphere", "merc"]; - -},{"../common/adjust_lon":7,"../common/msfnz":17,"../common/phi2z":18,"../common/tsfnz":25}],54:[function(require,module,exports){ -var adjust_lon = require('../common/adjust_lon'); -/* - reference - "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, - The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. - */ - - -/* Initialize the Miller Cylindrical projection - -------------------------------------------*/ -exports.init = function() { - //no-op -}; - - -/* Miller Cylindrical forward equations--mapping lat,long to x,y - ------------------------------------------------------------*/ -exports.forward = function(p) { - var lon = p.x; - var lat = p.y; - /* Forward equations - -----------------*/ - var dlon = adjust_lon(lon - this.long0); - var x = this.x0 + this.a * dlon; - var y = this.y0 + this.a * Math.log(Math.tan((Math.PI / 4) + (lat / 2.5))) * 1.25; - - p.x = x; - p.y = y; - return p; -}; - -/* Miller Cylindrical inverse equations--mapping x,y to lat/long - ------------------------------------------------------------*/ -exports.inverse = function(p) { - p.x -= this.x0; - p.y -= this.y0; - - var lon = adjust_lon(this.long0 + p.x / this.a); - var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4); - - p.x = lon; - p.y = lat; - return p; -}; -exports.names = ["Miller_Cylindrical", "mill"]; - -},{"../common/adjust_lon":7}],55:[function(require,module,exports){ -var adjust_lon = require('../common/adjust_lon'); -var EPSLN = 1.0e-10; -exports.init = function() {}; - -/* Mollweide forward equations--mapping lat,long to x,y - ----------------------------------------------------*/ -exports.forward = function(p) { - - /* Forward equations - -----------------*/ - var lon = p.x; - var lat = p.y; - - var delta_lon = adjust_lon(lon - this.long0); - var theta = lat; - var con = Math.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 + Math.cos(theta)); - theta += delta_theta; - if (Math.abs(delta_theta) < EPSLN) { - break; - } - } - theta /= 2; - - /* 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 (Math.PI / 2 - Math.abs(lat) < 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; -}; - -exports.inverse = function(p) { - var theta; - var arg; - - /* Inverse equations - -----------------*/ - p.x -= this.x0; - p.y -= this.y0; - arg = p.y / (1.4142135623731 * this.a); - - /* Because of division by zero problems, 'arg' can not be 1. Therefore - a number very close to one is used instead. - -------------------------------------------------------------------*/ - if (Math.abs(arg) > 0.999999999999) { - arg = 0.999999999999; - } - theta = Math.asin(arg); - var lon = adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta)))); - if (lon < (-Math.PI)) { - lon = -Math.PI; - } - if (lon > Math.PI) { - lon = Math.PI; - } - arg = (2 * theta + Math.sin(2 * theta)) / Math.PI; - if (Math.abs(arg) > 1) { - arg = 1; - } - var lat = Math.asin(arg); - - p.x = lon; - p.y = lat; - return p; -}; -exports.names = ["Mollweide", "moll"]; - -},{"../common/adjust_lon":7}],56:[function(require,module,exports){ -var SEC_TO_RAD = 4.84813681109535993589914102357e-6; -/* - reference - Department of Land and Survey Technical Circular 1973/32 - http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf - OSG Technical Report 4.1 - http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf - */ - -/** - * iterations: Number of iterations to refine inverse transform. - * 0 -> km accuracy - * 1 -> m accuracy -- suitable for most mapping applications - * 2 -> mm accuracy - */ -exports.iterations = 1; - -exports.init = function() { - this.A = []; - 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 = []; - this.B_im = []; - this.B_re[1] = 0.7557853228; - this.B_im[1] = 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 = []; - this.C_im = []; - this.C_re[1] = 1.3231270439; - this.C_im[1] = 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 = []; - 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 - */ -exports.forward = function(p) { - var n; - 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 / 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 - p.x = (z_im * this.a) + this.x0; - p.y = (z_re * this.a) + this.y0; - - return p; -}; - - -/** - New Zealand Map Grid Inverse - x/y to long/lat - */ -exports.inverse = function(p) { - var n; - 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 (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++) { - 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 * SEC_TO_RAD * 1E5); - var lon = this.long0 + d_lambda; - - p.x = lon; - p.y = lat; - - return p; -}; -exports.names = ["New_Zealand_Map_Grid", "nzmg"]; -},{}],57:[function(require,module,exports){ -var tsfnz = require('../common/tsfnz'); -var adjust_lon = require('../common/adjust_lon'); -var phi2z = require('../common/phi2z'); -var HALF_PI = Math.PI/2; -var FORTPI = Math.PI/4; -var EPSLN = 1.0e-10; - -/* Initialize the Oblique Mercator projection - ------------------------------------------*/ -exports.init = function() { - this.no_off = this.no_off || false; - this.no_rot = this.no_rot || false; - - if (isNaN(this.k0)) { - this.k0 = 1; - } - var sinlat = Math.sin(this.lat0); - var coslat = Math.cos(this.lat0); - var con = this.e * sinlat; - - this.bl = Math.sqrt(1 + this.es / (1 - this.es) * Math.pow(coslat, 4)); - this.al = this.a * this.bl * this.k0 * Math.sqrt(1 - this.es) / (1 - con * con); - var t0 = tsfnz(this.e, this.lat0, sinlat); - var dl = this.bl / coslat * Math.sqrt((1 - this.es) / (1 - con * con)); - if (dl * dl < 1) { - dl = 1; - } - var fl; - var gl; - if (!isNaN(this.longc)) { - //Central point and azimuth method - - if (this.lat0 >= 0) { - fl = dl + Math.sqrt(dl * dl - 1); - } - else { - fl = dl - Math.sqrt(dl * dl - 1); - } - this.el = fl * Math.pow(t0, this.bl); - gl = 0.5 * (fl - 1 / fl); - this.gamma0 = Math.asin(Math.sin(this.alpha) / dl); - this.long0 = this.longc - Math.asin(gl * Math.tan(this.gamma0)) / this.bl; - - } - else { - //2 points method - var t1 = tsfnz(this.e, this.lat1, Math.sin(this.lat1)); - var t2 = tsfnz(this.e, this.lat2, Math.sin(this.lat2)); - if (this.lat0 >= 0) { - this.el = (dl + Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl); - } - else { - this.el = (dl - Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl); - } - var hl = Math.pow(t1, this.bl); - var ll = Math.pow(t2, this.bl); - fl = this.el / hl; - gl = 0.5 * (fl - 1 / fl); - var jl = (this.el * this.el - ll * hl) / (this.el * this.el + ll * hl); - var pl = (ll - hl) / (ll + hl); - var dlon12 = adjust_lon(this.long1 - this.long2); - this.long0 = 0.5 * (this.long1 + this.long2) - Math.atan(jl * Math.tan(0.5 * this.bl * (dlon12)) / pl) / this.bl; - this.long0 = adjust_lon(this.long0); - var dlon10 = adjust_lon(this.long1 - this.long0); - this.gamma0 = Math.atan(Math.sin(this.bl * (dlon10)) / gl); - this.alpha = Math.asin(dl * Math.sin(this.gamma0)); - } - - if (this.no_off) { - this.uc = 0; - } - else { - if (this.lat0 >= 0) { - this.uc = this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha)); - } - else { - this.uc = -1 * this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha)); - } - } - -}; - - -/* Oblique Mercator forward equations--mapping lat,long to x,y - ----------------------------------------------------------*/ -exports.forward = function(p) { - var lon = p.x; - var lat = p.y; - var dlon = adjust_lon(lon - this.long0); - var us, vs; - var con; - if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { - if (lat > 0) { - con = -1; - } - else { - con = 1; - } - vs = this.al / this.bl * Math.log(Math.tan(FORTPI + con * this.gamma0 * 0.5)); - us = -1 * con * HALF_PI * this.al / this.bl; - } - else { - var t = tsfnz(this.e, lat, Math.sin(lat)); - var ql = this.el / Math.pow(t, this.bl); - var sl = 0.5 * (ql - 1 / ql); - var tl = 0.5 * (ql + 1 / ql); - var vl = Math.sin(this.bl * (dlon)); - var ul = (sl * Math.sin(this.gamma0) - vl * Math.cos(this.gamma0)) / tl; - if (Math.abs(Math.abs(ul) - 1) <= EPSLN) { - vs = Number.POSITIVE_INFINITY; - } - else { - vs = 0.5 * this.al * Math.log((1 - ul) / (1 + ul)) / this.bl; - } - if (Math.abs(Math.cos(this.bl * (dlon))) <= EPSLN) { - us = this.al * this.bl * (dlon); - } - else { - us = this.al * Math.atan2(sl * Math.cos(this.gamma0) + vl * Math.sin(this.gamma0), Math.cos(this.bl * dlon)) / this.bl; - } - } - - if (this.no_rot) { - p.x = this.x0 + us; - p.y = this.y0 + vs; - } - else { - - us -= this.uc; - p.x = this.x0 + vs * Math.cos(this.alpha) + us * Math.sin(this.alpha); - p.y = this.y0 + us * Math.cos(this.alpha) - vs * Math.sin(this.alpha); - } - return p; -}; - -exports.inverse = function(p) { - var us, vs; - if (this.no_rot) { - vs = p.y - this.y0; - us = p.x - this.x0; - } - else { - vs = (p.x - this.x0) * Math.cos(this.alpha) - (p.y - this.y0) * Math.sin(this.alpha); - us = (p.y - this.y0) * Math.cos(this.alpha) + (p.x - this.x0) * Math.sin(this.alpha); - us += this.uc; - } - var qp = Math.exp(-1 * this.bl * vs / this.al); - var sp = 0.5 * (qp - 1 / qp); - var tp = 0.5 * (qp + 1 / qp); - var vp = Math.sin(this.bl * us / this.al); - var up = (vp * Math.cos(this.gamma0) + sp * Math.sin(this.gamma0)) / tp; - var ts = Math.pow(this.el / Math.sqrt((1 + up) / (1 - up)), 1 / this.bl); - if (Math.abs(up - 1) < EPSLN) { - p.x = this.long0; - p.y = HALF_PI; - } - else if (Math.abs(up + 1) < EPSLN) { - p.x = this.long0; - p.y = -1 * HALF_PI; - } - else { - p.y = phi2z(this.e, ts); - p.x = adjust_lon(this.long0 - Math.atan2(sp * Math.cos(this.gamma0) - vp * Math.sin(this.gamma0), Math.cos(this.bl * us / this.al)) / this.bl); - } - return p; -}; - -exports.names = ["Hotine_Oblique_Mercator", "Hotine Oblique Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin", "Hotine_Oblique_Mercator_Azimuth_Center", "omerc"]; -},{"../common/adjust_lon":7,"../common/phi2z":18,"../common/tsfnz":25}],58:[function(require,module,exports){ -var e0fn = require('../common/e0fn'); -var e1fn = require('../common/e1fn'); -var e2fn = require('../common/e2fn'); -var e3fn = require('../common/e3fn'); -var adjust_lon = require('../common/adjust_lon'); -var adjust_lat = require('../common/adjust_lat'); -var mlfn = require('../common/mlfn'); -var EPSLN = 1.0e-10; -var gN = require('../common/gN'); -var MAX_ITER = 20; -exports.init = function() { - /* Place parameters in static storage for common use - -------------------------------------------------*/ - this.temp = this.b / this.a; - this.es = 1 - 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 = e0fn(this.es); - this.e1 = e1fn(this.es); - this.e2 = e2fn(this.es); - this.e3 = e3fn(this.es); - this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas -}; - - -/* Polyconic forward equations--mapping lat,long to x,y - ---------------------------------------------------*/ -exports.forward = function(p) { - var lon = p.x; - var lat = p.y; - var x, y, el; - var dlon = adjust_lon(lon - this.long0); - el = dlon * Math.sin(lat); - if (this.sphere) { - if (Math.abs(lat) <= EPSLN) { - x = this.a * dlon; - y = -1 * this.a * this.lat0; - } - else { - x = this.a * Math.sin(el) / Math.tan(lat); - y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat)); - } - } - else { - if (Math.abs(lat) <= EPSLN) { - x = this.a * dlon; - y = -1 * this.ml0; - } - else { - var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat); - x = nl * Math.sin(el); - y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el)); - } - - } - p.x = x + this.x0; - p.y = y + this.y0; - return p; -}; - - -/* Inverse equations - -----------------*/ -exports.inverse = function(p) { - var lon, lat, x, y, i; - var al, bl; - var phi, dphi; - x = p.x - this.x0; - y = p.y - this.y0; - - if (this.sphere) { - if (Math.abs(y + this.a * this.lat0) <= EPSLN) { - lon = adjust_lon(x / this.a + this.long0); - lat = 0; - } - else { - al = this.lat0 + y / this.a; - bl = x * x / this.a / this.a + al * al; - phi = al; - var tanphi; - for (i = MAX_ITER; i; --i) { - tanphi = Math.tan(phi); - dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1); - phi += dphi; - if (Math.abs(dphi) <= EPSLN) { - lat = phi; - break; - } - } - lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat)); - } - } - else { - if (Math.abs(y + this.ml0) <= EPSLN) { - lat = 0; - lon = adjust_lon(this.long0 + x / this.a); - } - else { - - al = (this.ml0 + y) / this.a; - bl = x * x / this.a / this.a + al * al; - phi = al; - var cl, mln, mlnp, ma; - var con; - for (i = MAX_ITER; i; --i) { - con = this.e * Math.sin(phi); - cl = Math.sqrt(1 - con * con) * Math.tan(phi); - mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); - mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi); - ma = mln / this.a; - dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp); - phi -= dphi; - if (Math.abs(dphi) <= EPSLN) { - lat = phi; - break; - } - } - - //lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0); - cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat); - lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat)); - } - } - - p.x = lon; - p.y = lat; - return p; -}; -exports.names = ["Polyconic", "poly"]; -},{"../common/adjust_lat":6,"../common/adjust_lon":7,"../common/e0fn":9,"../common/e1fn":10,"../common/e2fn":11,"../common/e3fn":12,"../common/gN":13,"../common/mlfn":16}],59:[function(require,module,exports){ -var adjust_lon = require('../common/adjust_lon'); -var adjust_lat = require('../common/adjust_lat'); -var pj_enfn = require('../common/pj_enfn'); -var MAX_ITER = 20; -var pj_mlfn = require('../common/pj_mlfn'); -var pj_inv_mlfn = require('../common/pj_inv_mlfn'); -var HALF_PI = Math.PI/2; -var EPSLN = 1.0e-10; -var asinz = require('../common/asinz'); -exports.init = function() { - /* Place parameters in static storage for common use - -------------------------------------------------*/ - - - if (!this.sphere) { - this.en = pj_enfn(this.es); - } - else { - this.n = 1; - this.m = 0; - this.es = 0; - this.C_y = Math.sqrt((this.m + 1) / this.n); - this.C_x = this.C_y / (this.m + 1); - } - -}; - -/* Sinusoidal forward equations--mapping lat,long to x,y - -----------------------------------------------------*/ -exports.forward = function(p) { - var x, y; - var lon = p.x; - var lat = p.y; - /* Forward equations - -----------------*/ - lon = adjust_lon(lon - this.long0); - - if (this.sphere) { - if (!this.m) { - lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat; - } - else { - var k = this.n * Math.sin(lat); - for (var i = MAX_ITER; i; --i) { - var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat)); - lat -= V; - if (Math.abs(V) < EPSLN) { - break; - } - } - } - x = this.a * this.C_x * lon * (this.m + Math.cos(lat)); - y = this.a * this.C_y * lat; - - } - else { - - var s = Math.sin(lat); - var c = Math.cos(lat); - y = this.a * pj_mlfn(lat, s, c, this.en); - x = this.a * lon * c / Math.sqrt(1 - this.es * s * s); - } - - p.x = x; - p.y = y; - return p; -}; - -exports.inverse = function(p) { - var lat, temp, lon, s; - - p.x -= this.x0; - lon = p.x / this.a; - p.y -= this.y0; - lat = p.y / this.a; - - if (this.sphere) { - lat /= this.C_y; - lon = lon / (this.C_x * (this.m + Math.cos(lat))); - if (this.m) { - lat = asinz((this.m * lat + Math.sin(lat)) / this.n); - } - else if (this.n !== 1) { - lat = asinz(Math.sin(lat) / this.n); - } - lon = adjust_lon(lon + this.long0); - lat = adjust_lat(lat); - } - else { - lat = pj_inv_mlfn(p.y / this.a, this.es, this.en); - s = Math.abs(lat); - if (s < HALF_PI) { - s = Math.sin(lat); - temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat)); - //temp = this.long0 + p.x / (this.a * Math.cos(lat)); - lon = adjust_lon(temp); - } - else if ((s - EPSLN) < HALF_PI) { - lon = this.long0; - } - } - p.x = lon; - p.y = lat; - return p; -}; -exports.names = ["Sinusoidal", "sinu"]; -},{"../common/adjust_lat":6,"../common/adjust_lon":7,"../common/asinz":8,"../common/pj_enfn":19,"../common/pj_inv_mlfn":20,"../common/pj_mlfn":21}],60:[function(require,module,exports){ -/* - references: - 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 - */ -exports.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 = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2)); - this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4)); - this.b0 = Math.asin(sinPhy0 / this.alpha); - var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2)); - var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2)); - var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0)); - this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3; -}; - - -exports.forward = function(p) { - var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2)); - var Sa2 = this.e / 2 * 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 * (Math.atan(Math.exp(S)) - Math.PI / 4); - - // 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 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0; - p.x = this.R * rotI + this.x0; - return p; -}; - -exports.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); - - 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; - var phy = b; - var prevPhy = -1000; - var iteration = 0; - while (Math.abs(phy - prevPhy) > 0.0000001) { - if (++iteration > 20) { - //...reportError("omercFwdInfinity"); - return; - } - //S = Math.log(Math.tan(Math.PI / 4 + phy / 2)); - S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2)); - prevPhy = phy; - phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2; - } - - p.x = lambda; - p.y = phy; - return p; -}; - -exports.names = ["somerc"]; - -},{}],61:[function(require,module,exports){ -var HALF_PI = Math.PI/2; -var EPSLN = 1.0e-10; -var sign = require('../common/sign'); -var msfnz = require('../common/msfnz'); -var tsfnz = require('../common/tsfnz'); -var phi2z = require('../common/phi2z'); -var adjust_lon = require('../common/adjust_lon'); -exports.ssfn_ = function(phit, sinphi, eccen) { - sinphi *= eccen; - return (Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen)); -}; - -exports.init = function() { - this.coslat0 = Math.cos(this.lat0); - this.sinlat0 = Math.sin(this.lat0); - if (this.sphere) { - if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { - this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts)); - } - } - else { - if (Math.abs(this.coslat0) <= EPSLN) { - if (this.lat0 > 0) { - //North pole - //trace('stere:north pole'); - this.con = 1; - } - else { - //South pole - //trace('stere:south pole'); - this.con = -1; - } - } - this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e)); - if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { - this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts)); - } - this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0); - this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI; - this.cosX0 = Math.cos(this.X0); - this.sinX0 = Math.sin(this.X0); - } -}; - -// Stereographic forward equations--mapping lat,long to x,y -exports.forward = function(p) { - var lon = p.x; - var lat = p.y; - var sinlat = Math.sin(lat); - var coslat = Math.cos(lat); - var A, X, sinX, cosX, ts, rh; - var dlon = adjust_lon(lon - this.long0); - - if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) { - //case of the origine point - //trace('stere:this is the origin point'); - p.x = NaN; - p.y = NaN; - return p; - } - if (this.sphere) { - //trace('stere:sphere case'); - A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon)); - p.x = this.a * A * coslat * Math.sin(dlon) + this.x0; - p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0; - return p; - } - else { - X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI; - cosX = Math.cos(X); - sinX = Math.sin(X); - if (Math.abs(this.coslat0) <= EPSLN) { - ts = tsfnz(this.e, lat * this.con, this.con * sinlat); - rh = 2 * this.a * this.k0 * ts / this.cons; - p.x = this.x0 + rh * Math.sin(lon - this.long0); - p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0); - //trace(p.toString()); - return p; - } - else if (Math.abs(this.sinlat0) < EPSLN) { - //Eq - //trace('stere:equateur'); - A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon)); - p.y = A * sinX; - } - else { - //other case - //trace('stere:normal case'); - A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon))); - p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0; - } - p.x = A * cosX * Math.sin(dlon) + this.x0; - } - //trace(p.toString()); - return p; -}; - - -//* Stereographic inverse equations--mapping x,y to lat/long -exports.inverse = function(p) { - p.x -= this.x0; - p.y -= this.y0; - var lon, lat, ts, ce, Chi; - var rh = Math.sqrt(p.x * p.x + p.y * p.y); - if (this.sphere) { - var c = 2 * Math.atan(rh / (0.5 * this.a * this.k0)); - lon = this.long0; - lat = this.lat0; - if (rh <= EPSLN) { - p.x = lon; - p.y = lat; - return p; - } - lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh); - if (Math.abs(this.coslat0) < EPSLN) { - if (this.lat0 > 0) { - lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y)); - } - else { - lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); - } - } - else { - lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c))); - } - p.x = lon; - p.y = lat; - return p; - } - else { - if (Math.abs(this.coslat0) <= EPSLN) { - if (rh <= EPSLN) { - lat = this.lat0; - lon = this.long0; - p.x = lon; - p.y = lat; - //trace(p.toString()); - return p; - } - p.x *= this.con; - p.y *= this.con; - ts = rh * this.cons / (2 * this.a * this.k0); - lat = this.con * phi2z(this.e, ts); - lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, - 1 * p.y)); - } - else { - ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1)); - lon = this.long0; - if (rh <= EPSLN) { - Chi = this.X0; - } - else { - Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh); - lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce))); - } - lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi))); - } - } - p.x = lon; - p.y = lat; - - //trace(p.toString()); - return p; - -}; -exports.names = ["stere"]; -},{"../common/adjust_lon":7,"../common/msfnz":17,"../common/phi2z":18,"../common/sign":23,"../common/tsfnz":25}],62:[function(require,module,exports){ -var gauss = require('./gauss'); -var adjust_lon = require('../common/adjust_lon'); -exports.init = function() { - gauss.init.apply(this); - if (!this.rc) { - return; - } - this.sinc0 = Math.sin(this.phic0); - this.cosc0 = Math.cos(this.phic0); - this.R2 = 2 * this.rc; - if (!this.title) { - this.title = "Oblique Stereographic Alternative"; - } -}; - -exports.forward = function(p) { - var sinc, cosc, cosl, k; - p.x = adjust_lon(p.x - this.long0); - 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 + 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; -}; - -exports.inverse = function(p) { - var sinc, cosc, lon, lat, rho; - 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 ((rho = Math.sqrt(p.x * p.x + p.y * p.y))) { - var c = 2 * 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; - gauss.inverse.apply(this, [p]); - p.x = adjust_lon(p.x + this.long0); - return p; -}; - -exports.names = ["Stereographic_North_Pole", "Oblique_Stereographic", "Polar_Stereographic", "sterea","Oblique Stereographic Alternative"]; - -},{"../common/adjust_lon":7,"./gauss":47}],63:[function(require,module,exports){ -var e0fn = require('../common/e0fn'); -var e1fn = require('../common/e1fn'); -var e2fn = require('../common/e2fn'); -var e3fn = require('../common/e3fn'); -var mlfn = require('../common/mlfn'); -var adjust_lon = require('../common/adjust_lon'); -var HALF_PI = Math.PI/2; -var EPSLN = 1.0e-10; -var sign = require('../common/sign'); -var asinz = require('../common/asinz'); - -exports.init = function() { - this.e0 = e0fn(this.es); - this.e1 = e1fn(this.es); - this.e2 = e2fn(this.es); - this.e3 = e3fn(this.es); - this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); -}; - -/** - Transverse Mercator Forward - long/lat to x/y - long/lat in radians - */ -exports.forward = function(p) { - var lon = p.x; - var lat = p.y; - - var delta_lon = adjust_lon(lon - this.long0); - var con; - var x, y; - var sin_phi = Math.sin(lat); - var cos_phi = Math.cos(lat); - - if (this.sphere) { - var b = cos_phi * Math.sin(delta_lon); - if ((Math.abs(Math.abs(b) - 1)) < 0.0000000001) { - return (93); - } - else { - x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)); - con = Math.acos(cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - 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 - this.es * Math.pow(sin_phi, 2); - var n = this.a / Math.sqrt(con); - var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat); - - x = this.k0 * n * al * (1 + als / 6 * (1 - t + c + als / 20 * (5 - 18 * t + Math.pow(t, 2) + 72 * c - 58 * this.ep2))) + this.x0; - y = this.k0 * (ml - this.ml0 + n * tq * (als * (0.5 + als / 24 * (5 - t + 9 * c + 4 * Math.pow(c, 2) + als / 30 * (61 - 58 * t + Math.pow(t, 2) + 600 * c - 330 * this.ep2))))) + this.y0; - - } - p.x = x; - p.y = y; - return p; -}; - -/** - Transverse Mercator Inverse - x/y to long/lat - */ -exports.inverse = function(p) { - var con, phi; - var delta_phi; - var i; - var max_iter = 6; - var lat, lon; - - if (this.sphere) { - var f = Math.exp(p.x / (this.a * this.k0)); - var g = 0.5 * (f - 1 / f); - var temp = this.lat0 + p.y / (this.a * this.k0); - var h = Math.cos(temp); - con = Math.sqrt((1 - h * h) / (1 + g * g)); - lat = asinz(con); - if (temp < 0) { - lat = -lat; - } - if ((g === 0) && (h === 0)) { - lon = this.long0; - } - else { - lon = 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 * phi) - this.e2 * Math.sin(4 * phi) + this.e3 * Math.sin(6 * phi)) / this.e0) - phi; - phi += delta_phi; - if (Math.abs(delta_phi) <= EPSLN) { - break; - } - if (i >= max_iter) { - return (95); - } - } // for() - if (Math.abs(phi) < HALF_PI) { - 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 - this.es * Math.pow(sin_phi, 2); - var n = this.a / Math.sqrt(con); - var r = n * (1 - 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 * (5 + 3 * t + 10 * c - 4 * cs - 9 * this.ep2 - ds / 30 * (61 + 90 * t + 298 * c + 45 * ts - 252 * this.ep2 - 3 * cs))); - lon = adjust_lon(this.long0 + (d * (1 - ds / 6 * (1 + 2 * t + c - ds / 20 * (5 - 2 * c + 28 * t - 3 * cs + 8 * this.ep2 + 24 * ts))) / cos_phi)); - } - else { - lat = HALF_PI * sign(y); - lon = this.long0; - } - } - p.x = lon; - p.y = lat; - return p; -}; -exports.names = ["Transverse_Mercator", "Transverse Mercator", "tmerc"]; - -},{"../common/adjust_lon":7,"../common/asinz":8,"../common/e0fn":9,"../common/e1fn":10,"../common/e2fn":11,"../common/e3fn":12,"../common/mlfn":16,"../common/sign":23}],64:[function(require,module,exports){ -var D2R = 0.01745329251994329577; -var tmerc = require('./tmerc'); -exports.dependsOn = 'tmerc'; -exports.init = function() { - if (!this.zone) { - return; - } - this.lat0 = 0; - this.long0 = ((6 * Math.abs(this.zone)) - 183) * D2R; - this.x0 = 500000; - this.y0 = this.utmSouth ? 10000000 : 0; - this.k0 = 0.9996; - - tmerc.init.apply(this); - this.forward = tmerc.forward; - this.inverse = tmerc.inverse; -}; -exports.names = ["Universal Transverse Mercator System", "utm"]; - -},{"./tmerc":63}],65:[function(require,module,exports){ -var adjust_lon = require('../common/adjust_lon'); -var HALF_PI = Math.PI/2; -var EPSLN = 1.0e-10; -var asinz = require('../common/asinz'); -/* Initialize the Van Der Grinten projection - ----------------------------------------*/ -exports.init = function() { - //this.R = 6370997; //Radius of earth - this.R = this.a; -}; - -exports.forward = function(p) { - - var lon = p.x; - var lat = p.y; - - /* Forward equations - -----------------*/ - var dlon = adjust_lon(lon - this.long0); - var x, y; - - if (Math.abs(lat) <= EPSLN) { - x = this.x0 + this.R * dlon; - y = this.y0; - } - var theta = asinz(2 * Math.abs(lat / Math.PI)); - if ((Math.abs(dlon) <= EPSLN) || (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN)) { - x = this.x0; - if (lat >= 0) { - y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta); - } - else { - y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta); - } - // return(OK); - } - var al = 0.5 * Math.abs((Math.PI / dlon) - (dlon / Math.PI)); - var asq = al * al; - var sinth = Math.sin(theta); - var costh = Math.cos(theta); - - var g = costh / (sinth + costh - 1); - var gsq = g * g; - var m = g * (2 / sinth - 1); - var msq = m * m; - var con = Math.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 / (Math.PI * this.R)); - var q = asq + g; - con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq); - if (lat >= 0) { - //y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); - y = this.y0 + con; - } - else { - //y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); - y = this.y0 - con; - } - p.x = x; - p.y = y; - return p; -}; - -/* Van Der Grinten inverse equations--mapping x,y to lat/long - ---------------------------------------------------------*/ -exports.inverse = function(p) { - var lon, lat; - var xx, yy, xys, c1, c2, c3; - var a1; - var m1; - var con; - var th1; - var d; - - /* inverse equations - -----------------*/ - p.x -= this.x0; - p.y -= this.y0; - con = Math.PI * this.R; - xx = p.x / con; - yy = p.y / con; - xys = xx * xx + yy * yy; - c1 = -Math.abs(yy) * (1 + xys); - c2 = c1 - 2 * yy * yy + xx * xx; - c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys; - d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27; - a1 = (c1 - c2 * c2 / 3 / c3) / c3; - m1 = 2 * Math.sqrt(-a1 / 3); - con = ((3 * d) / a1) / m1; - if (Math.abs(con) > 1) { - if (con >= 0) { - con = 1; - } - else { - con = -1; - } - } - th1 = Math.acos(con) / 3; - if (p.y >= 0) { - lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; - } - else { - lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; - } - - if (Math.abs(xx) < EPSLN) { - lon = this.long0; - } - else { - lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx); - } - - p.x = lon; - p.y = lat; - return p; -}; -exports.names = ["Van_der_Grinten_I", "VanDerGrinten", "vandg"]; -},{"../common/adjust_lon":7,"../common/asinz":8}],66:[function(require,module,exports){ -var D2R = 0.01745329251994329577; -var R2D = 57.29577951308232088; -var PJD_3PARAM = 1; -var PJD_7PARAM = 2; -var datum_transform = require('./datum_transform'); -var adjust_axis = require('./adjust_axis'); -var proj = require('./Proj'); -module.exports = function transform(source, dest, point) { - var wgs84; - - function checkNotWGS(source, dest) { - return ((source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== "WGS84"); - } - - // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 - if (source.datum && dest.datum && (checkNotWGS(source, dest) || checkNotWGS(dest, source))) { - wgs84 = new proj('WGS84'); - transform(source, wgs84, point); - source = wgs84; - } - // DGR, 2010/11/12 - if (source.axis !== "enu") { - adjust_axis(source, false, point); - } - // Transform source points to long/lat, if they aren't already. - if (source.projName === "longlat") { - point.x *= D2R; // convert degrees to radians - point.y *= D2R; - } - else { - if (source.to_meter) { - point.x *= source.to_meter; - point.y *= source.to_meter; - } - source.inverse(point); // Convert Cartesian to longlat - } - // Adjust for the prime meridian if necessary - if (source.from_greenwich) { - point.x += source.from_greenwich; - } - - // Convert datums if needed, and if possible. - point = datum_transform(source.datum, dest.datum, point); - - // Adjust for the prime meridian if necessary - if (dest.from_greenwich) { - point.x -= dest.from_greenwich; - } - - if (dest.projName === "longlat") { - // convert radians to decimal degrees - point.x *= R2D; - point.y *= R2D; - } - else { // else project - dest.forward(point); - if (dest.to_meter) { - point.x /= dest.to_meter; - point.y /= dest.to_meter; - } - } - - // DGR, 2010/11/12 - if (dest.axis !== "enu") { - adjust_axis(dest, true, point); - } - - return point; -}; -},{"./Proj":4,"./adjust_axis":5,"./datum_transform":31}],67:[function(require,module,exports){ -module.exports = '2.1.0'; -},{}],68:[function(require,module,exports){ -var D2R = 0.01745329251994329577; -var extend = require('./extend'); - -function mapit(obj, key, v) { - obj[key] = v.map(function(aa) { - var o = {}; - sExpr(aa, o); - return o; - }).reduce(function(a, b) { - return extend(a, b); - }, {}); -} - -function sExpr(v, obj) { - var key; - if (!Array.isArray(v)) { - obj[v] = true; - return; - } - else { - key = v.shift(); - if (key === 'PARAMETER') { - key = v.shift(); - } - if (v.length === 1) { - if (Array.isArray(v[0])) { - obj[key] = {}; - sExpr(v[0], obj[key]); - } - else { - obj[key] = v[0]; - } - } - else if (!v.length) { - obj[key] = true; - } - else if (key === 'TOWGS84') { - obj[key] = v; - } - else { - obj[key] = {}; - if (['UNIT', 'PRIMEM', 'VERT_DATUM'].indexOf(key) > -1) { - obj[key] = { - name: v[0].toLowerCase(), - convert: v[1] - }; - if (v.length === 3) { - obj[key].auth = v[2]; - } - } - else if (key === 'SPHEROID') { - obj[key] = { - name: v[0], - a: v[1], - rf: v[2] - }; - if (v.length === 4) { - obj[key].auth = v[3]; - } - } - else if (['GEOGCS', 'GEOCCS', 'DATUM', 'VERT_CS', 'COMPD_CS', 'LOCAL_CS', 'FITTED_CS', 'LOCAL_DATUM'].indexOf(key) > -1) { - v[0] = ['name', v[0]]; - mapit(obj, key, v); - } - else if (v.every(function(aa) { - return Array.isArray(aa); - })) { - mapit(obj, key, v); - } - else { - sExpr(v, obj[key]); - } - } - } -} - -function rename(obj, params) { - var outName = params[0]; - var inName = params[1]; - if (!(outName in obj) && (inName in obj)) { - obj[outName] = obj[inName]; - if (params.length === 3) { - obj[outName] = params[2](obj[outName]); - } - } -} - -function d2r(input) { - return input * D2R; -} - -function cleanWKT(wkt) { - if (wkt.type === 'GEOGCS') { - wkt.projName = 'longlat'; - } - else if (wkt.type === 'LOCAL_CS') { - wkt.projName = 'identity'; - wkt.local = true; - } - else { - if (typeof wkt.PROJECTION === "object") { - wkt.projName = Object.keys(wkt.PROJECTION)[0]; - } - else { - wkt.projName = wkt.PROJECTION; - } - } - if (wkt.UNIT) { - wkt.units = wkt.UNIT.name.toLowerCase(); - if (wkt.units === 'metre') { - wkt.units = 'meter'; - } - if (wkt.UNIT.convert) { - wkt.to_meter = parseFloat(wkt.UNIT.convert, 10); - } - } - - if (wkt.GEOGCS) { - //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){ - // wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R; - //} - if (wkt.GEOGCS.DATUM) { - wkt.datumCode = wkt.GEOGCS.DATUM.name.toLowerCase(); - } - else { - wkt.datumCode = wkt.GEOGCS.name.toLowerCase(); - } - if (wkt.datumCode.slice(0, 2) === 'd_') { - wkt.datumCode = wkt.datumCode.slice(2); - } - if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') { - wkt.datumCode = 'nzgd49'; - } - if (wkt.datumCode === "wgs_1984") { - if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') { - wkt.sphere = true; - } - wkt.datumCode = 'wgs84'; - } - if (wkt.datumCode.slice(-6) === '_ferro') { - wkt.datumCode = wkt.datumCode.slice(0, - 6); - } - if (wkt.datumCode.slice(-8) === '_jakarta') { - wkt.datumCode = wkt.datumCode.slice(0, - 8); - } - if (wkt.GEOGCS.DATUM && wkt.GEOGCS.DATUM.SPHEROID) { - wkt.ellps = wkt.GEOGCS.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk'); - if (wkt.ellps.toLowerCase().slice(0, 13) === "international") { - wkt.ellps = 'intl'; - } - - wkt.a = wkt.GEOGCS.DATUM.SPHEROID.a; - wkt.rf = parseFloat(wkt.GEOGCS.DATUM.SPHEROID.rf, 10); - } - } - if (wkt.b && !isFinite(wkt.b)) { - wkt.b = wkt.a; - } - - function toMeter(input) { - var ratio = wkt.to_meter || 1; - return parseFloat(input, 10) * ratio; - } - var renamer = function(a) { - return rename(wkt, a); - }; - var list = [ - ['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'], - ['scale_factor', 'Scale_Factor'], - ['k0', 'scale_factor'], - ['latitude_of_center', 'Latitude_of_center'], - ['lat0', 'latitude_of_center', d2r], - ['longitude_of_center', 'Longitude_Of_Center'], - ['longc', 'longitude_of_center', d2r], - ['x0', 'false_easting', toMeter], - ['y0', 'false_northing', toMeter], - ['long0', 'central_meridian', d2r], - ['lat0', 'latitude_of_origin', d2r], - ['lat0', 'standard_parallel_1', d2r], - ['lat1', 'standard_parallel_1', d2r], - ['lat2', 'standard_parallel_2', d2r], - ['alpha', 'azimuth', d2r], - ['srsCode', 'name'] - ]; - list.forEach(renamer); - if (!wkt.long0 && wkt.longc && (wkt.PROJECTION === 'Albers_Conic_Equal_Area' || wkt.PROJECTION === "Lambert_Azimuthal_Equal_Area")) { - wkt.long0 = wkt.longc; - } -} -module.exports = function(wkt, self) { - var lisp = JSON.parse(("," + wkt).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g, ',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g, ',"$1"]')); - var type = lisp.shift(); - var name = lisp.shift(); - lisp.unshift(['name', name]); - lisp.unshift(['type', type]); - lisp.unshift('output'); - var obj = {}; - sExpr(lisp, obj); - cleanWKT(obj.output); - return extend(self, obj.output); -}; - -},{"./extend":34}],69:[function(require,module,exports){ - - - -/** - * UTM zones are grouped, and assigned to one of a group of 6 - * sets. - * - * {int} @private - */ -var NUM_100K_SETS = 6; - -/** - * The column letters (for easting) of the lower left value, per - * set. - * - * {string} @private - */ -var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS'; - -/** - * The row letters (for northing) of the lower left value, per - * set. - * - * {string} @private - */ -var SET_ORIGIN_ROW_LETTERS = 'AFAFAF'; - -var A = 65; // A -var I = 73; // I -var O = 79; // O -var V = 86; // V -var Z = 90; // Z - -/** - * Conversion of lat/lon to MGRS. - * - * @param {object} ll Object literal with lat and lon properties on a - * WGS84 ellipsoid. - * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for - * 100 m, 4 for 1000 m or 5 for 10000 m). Optional, default is 5. - * @return {string} the MGRS string for the given location and accuracy. - */ -exports.forward = function(ll, accuracy) { - accuracy = accuracy || 5; // default accuracy 1m - return encode(LLtoUTM({ - lat: ll[1], - lon: ll[0] - }), accuracy); -}; - -/** - * Conversion of MGRS to lat/lon. - * - * @param {string} mgrs MGRS string. - * @return {array} An array with left (longitude), bottom (latitude), right - * (longitude) and top (latitude) values in WGS84, representing the - * bounding box for the provided MGRS reference. - */ -exports.inverse = function(mgrs) { - var bbox = UTMtoLL(decode(mgrs.toUpperCase())); - return [bbox.left, bbox.bottom, bbox.right, bbox.top]; -}; - -exports.toPoint = function(mgrsStr) { - var llbbox = exports.inverse(mgrsStr); - return [(llbbox[2] + llbbox[0]) / 2, (llbbox[3] + llbbox[1]) / 2]; -}; -/** - * Conversion from degrees to radians. - * - * @private - * @param {number} deg the angle in degrees. - * @return {number} the angle in radians. - */ -function degToRad(deg) { - return (deg * (Math.PI / 180.0)); -} - -/** - * Conversion from radians to degrees. - * - * @private - * @param {number} rad the angle in radians. - * @return {number} the angle in degrees. - */ -function radToDeg(rad) { - return (180.0 * (rad / Math.PI)); -} - -/** - * Converts a set of Longitude and Latitude co-ordinates to UTM - * using the WGS84 ellipsoid. - * - * @private - * @param {object} ll Object literal with lat and lon properties - * representing the WGS84 coordinate to be converted. - * @return {object} Object literal containing the UTM value with easting, - * northing, zoneNumber and zoneLetter properties, and an optional - * accuracy property in digits. Returns null if the conversion failed. - */ -function LLtoUTM(ll) { - var Lat = ll.lat; - var Long = ll.lon; - var a = 6378137.0; //ellip.radius; - var eccSquared = 0.00669438; //ellip.eccsq; - var k0 = 0.9996; - var LongOrigin; - var eccPrimeSquared; - var N, T, C, A, M; - var LatRad = degToRad(Lat); - var LongRad = degToRad(Long); - var LongOriginRad; - var ZoneNumber; - // (int) - ZoneNumber = Math.floor((Long + 180) / 6) + 1; - - //Make sure the longitude 180.00 is in Zone 60 - if (Long === 180) { - ZoneNumber = 60; - } - - // Special zone for Norway - if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) { - ZoneNumber = 32; - } - - // Special zones for Svalbard - if (Lat >= 72.0 && Lat < 84.0) { - if (Long >= 0.0 && Long < 9.0) { - ZoneNumber = 31; - } - else if (Long >= 9.0 && Long < 21.0) { - ZoneNumber = 33; - } - else if (Long >= 21.0 && Long < 33.0) { - ZoneNumber = 35; - } - else if (Long >= 33.0 && Long < 42.0) { - ZoneNumber = 37; - } - } - - LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin - // in middle of - // zone - LongOriginRad = degToRad(LongOrigin); - - eccPrimeSquared = (eccSquared) / (1 - eccSquared); - - N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad)); - T = Math.tan(LatRad) * Math.tan(LatRad); - C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad); - A = Math.cos(LatRad) * (LongRad - LongOriginRad); - - M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared * eccSquared / 3072) * Math.sin(6 * LatRad)); - - var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0); - - var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0))); - if (Lat < 0.0) { - UTMNorthing += 10000000.0; //10000000 meter offset for - // southern hemisphere - } - - return { - northing: Math.round(UTMNorthing), - easting: Math.round(UTMEasting), - zoneNumber: ZoneNumber, - zoneLetter: getLetterDesignator(Lat) - }; -} - -/** - * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience - * class where the Zone can be specified as a single string eg."60N" which - * is then broken down into the ZoneNumber and ZoneLetter. - * - * @private - * @param {object} utm An object literal with northing, easting, zoneNumber - * and zoneLetter properties. If an optional accuracy property is - * provided (in meters), a bounding box will be returned instead of - * latitude and longitude. - * @return {object} An object literal containing either lat and lon values - * (if no accuracy was provided), or top, right, bottom and left values - * for the bounding box calculated according to the provided accuracy. - * Returns null if the conversion failed. - */ -function UTMtoLL(utm) { - - var UTMNorthing = utm.northing; - var UTMEasting = utm.easting; - var zoneLetter = utm.zoneLetter; - var zoneNumber = utm.zoneNumber; - // check the ZoneNummber is valid - if (zoneNumber < 0 || zoneNumber > 60) { - return null; - } - - var k0 = 0.9996; - var a = 6378137.0; //ellip.radius; - var eccSquared = 0.00669438; //ellip.eccsq; - var eccPrimeSquared; - var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared)); - var N1, T1, C1, R1, D, M; - var LongOrigin; - var mu, phi1Rad; - - // remove 500,000 meter offset for longitude - var x = UTMEasting - 500000.0; - var y = UTMNorthing; - - // We must know somehow if we are in the Northern or Southern - // hemisphere, this is the only time we use the letter So even - // if the Zone letter isn't exactly correct it should indicate - // the hemisphere correctly - if (zoneLetter < 'N') { - y -= 10000000.0; // remove 10,000,000 meter offset used - // for southern hemisphere - } - - // There are 60 zones with zone 1 being at West -180 to -174 - LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin - // in middle of - // zone - - eccPrimeSquared = (eccSquared) / (1 - eccSquared); - - M = y / k0; - mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256)); - - phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu); - // double phi1 = ProjMath.radToDeg(phi1Rad); - - N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad)); - T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad); - C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad); - R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5); - D = x / (N1 * k0); - - var lat = phi1Rad - (N1 * Math.tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720); - lat = radToDeg(lat); - - var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad); - lon = LongOrigin + radToDeg(lon); - - var result; - if (utm.accuracy) { - var topRight = UTMtoLL({ - northing: utm.northing + utm.accuracy, - easting: utm.easting + utm.accuracy, - zoneLetter: utm.zoneLetter, - zoneNumber: utm.zoneNumber - }); - result = { - top: topRight.lat, - right: topRight.lon, - bottom: lat, - left: lon - }; - } - else { - result = { - lat: lat, - lon: lon - }; - } - return result; -} - -/** - * Calculates the MGRS letter designator for the given latitude. - * - * @private - * @param {number} lat The latitude in WGS84 to get the letter designator - * for. - * @return {char} The letter designator. - */ -function getLetterDesignator(lat) { - //This is here as an error flag to show that the Latitude is - //outside MGRS limits - var LetterDesignator = 'Z'; - - if ((84 >= lat) && (lat >= 72)) { - LetterDesignator = 'X'; - } - else if ((72 > lat) && (lat >= 64)) { - LetterDesignator = 'W'; - } - else if ((64 > lat) && (lat >= 56)) { - LetterDesignator = 'V'; - } - else if ((56 > lat) && (lat >= 48)) { - LetterDesignator = 'U'; - } - else if ((48 > lat) && (lat >= 40)) { - LetterDesignator = 'T'; - } - else if ((40 > lat) && (lat >= 32)) { - LetterDesignator = 'S'; - } - else if ((32 > lat) && (lat >= 24)) { - LetterDesignator = 'R'; - } - else if ((24 > lat) && (lat >= 16)) { - LetterDesignator = 'Q'; - } - else if ((16 > lat) && (lat >= 8)) { - LetterDesignator = 'P'; - } - else if ((8 > lat) && (lat >= 0)) { - LetterDesignator = 'N'; - } - else if ((0 > lat) && (lat >= -8)) { - LetterDesignator = 'M'; - } - else if ((-8 > lat) && (lat >= -16)) { - LetterDesignator = 'L'; - } - else if ((-16 > lat) && (lat >= -24)) { - LetterDesignator = 'K'; - } - else if ((-24 > lat) && (lat >= -32)) { - LetterDesignator = 'J'; - } - else if ((-32 > lat) && (lat >= -40)) { - LetterDesignator = 'H'; - } - else if ((-40 > lat) && (lat >= -48)) { - LetterDesignator = 'G'; - } - else if ((-48 > lat) && (lat >= -56)) { - LetterDesignator = 'F'; - } - else if ((-56 > lat) && (lat >= -64)) { - LetterDesignator = 'E'; - } - else if ((-64 > lat) && (lat >= -72)) { - LetterDesignator = 'D'; - } - else if ((-72 > lat) && (lat >= -80)) { - LetterDesignator = 'C'; - } - return LetterDesignator; -} - -/** - * Encodes a UTM location as MGRS string. - * - * @private - * @param {object} utm An object literal with easting, northing, - * zoneLetter, zoneNumber - * @param {number} accuracy Accuracy in digits (1-5). - * @return {string} MGRS string for the given UTM location. - */ -function encode(utm, accuracy) { - var seasting = "" + utm.easting, - snorthing = "" + utm.northing; - - return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy); -} - -/** - * Get the two letter 100k designator for a given UTM easting, - * northing and zone number value. - * - * @private - * @param {number} easting - * @param {number} northing - * @param {number} zoneNumber - * @return the two letter 100k designator for the given UTM location. - */ -function get100kID(easting, northing, zoneNumber) { - var setParm = get100kSetForZone(zoneNumber); - var setColumn = Math.floor(easting / 100000); - var setRow = Math.floor(northing / 100000) % 20; - return getLetter100kID(setColumn, setRow, setParm); -} - -/** - * Given a UTM zone number, figure out the MGRS 100K set it is in. - * - * @private - * @param {number} i An UTM zone number. - * @return {number} the 100k set the UTM zone is in. - */ -function get100kSetForZone(i) { - var setParm = i % NUM_100K_SETS; - if (setParm === 0) { - setParm = NUM_100K_SETS; - } - - return setParm; -} - -/** - * Get the two-letter MGRS 100k designator given information - * translated from the UTM northing, easting and zone number. - * - * @private - * @param {number} column the column index as it relates to the MGRS - * 100k set spreadsheet, created from the UTM easting. - * Values are 1-8. - * @param {number} row the row index as it relates to the MGRS 100k set - * spreadsheet, created from the UTM northing value. Values - * are from 0-19. - * @param {number} parm the set block, as it relates to the MGRS 100k set - * spreadsheet, created from the UTM zone. Values are from - * 1-60. - * @return two letter MGRS 100k code. - */ -function getLetter100kID(column, row, parm) { - // colOrigin and rowOrigin are the letters at the origin of the set - var index = parm - 1; - var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index); - var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index); - - // colInt and rowInt are the letters to build to return - var colInt = colOrigin + column - 1; - var rowInt = rowOrigin + row; - var rollover = false; - - if (colInt > Z) { - colInt = colInt - Z + A - 1; - rollover = true; - } - - if (colInt === I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) { - colInt++; - } - - if (colInt === O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) { - colInt++; - - if (colInt === I) { - colInt++; - } - } - - if (colInt > Z) { - colInt = colInt - Z + A - 1; - } - - if (rowInt > V) { - rowInt = rowInt - V + A - 1; - rollover = true; - } - else { - rollover = false; - } - - if (((rowInt === I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I) || (rowOrigin < I)) && rollover)) { - rowInt++; - } - - if (((rowInt === O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O) || (rowOrigin < O)) && rollover)) { - rowInt++; - - if (rowInt === I) { - rowInt++; - } - } - - if (rowInt > V) { - rowInt = rowInt - V + A - 1; - } - - var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt); - return twoLetter; -} - -/** - * Decode the UTM parameters from a MGRS string. - * - * @private - * @param {string} mgrsString an UPPERCASE coordinate string is expected. - * @return {object} An object literal with easting, northing, zoneLetter, - * zoneNumber and accuracy (in meters) properties. - */ -function decode(mgrsString) { - - if (mgrsString && mgrsString.length === 0) { - throw ("MGRSPoint coverting from nothing"); - } - - var length = mgrsString.length; - - var hunK = null; - var sb = ""; - var testChar; - var i = 0; - - // get Zone number - while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) { - if (i >= 2) { - throw ("MGRSPoint bad conversion from: " + mgrsString); - } - sb += testChar; - i++; - } - - var zoneNumber = parseInt(sb, 10); - - if (i === 0 || i + 3 > length) { - // A good MGRS string has to be 4-5 digits long, - // ##AAA/#AAA at least. - throw ("MGRSPoint bad conversion from: " + mgrsString); - } - - var zoneLetter = mgrsString.charAt(i++); - - // Should we check the zone letter here? Why not. - if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') { - throw ("MGRSPoint zone letter " + zoneLetter + " not handled: " + mgrsString); - } - - hunK = mgrsString.substring(i, i += 2); - - var set = get100kSetForZone(zoneNumber); - - var east100k = getEastingFromChar(hunK.charAt(0), set); - var north100k = getNorthingFromChar(hunK.charAt(1), set); - - // We have a bug where the northing may be 2000000 too low. - // How - // do we know when to roll over? - - while (north100k < getMinNorthing(zoneLetter)) { - north100k += 2000000; - } - - // calculate the char index for easting/northing separator - var remainder = length - i; - - if (remainder % 2 !== 0) { - throw ("MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + mgrsString); - } - - var sep = remainder / 2; - - var sepEasting = 0.0; - var sepNorthing = 0.0; - var accuracyBonus, sepEastingString, sepNorthingString, easting, northing; - if (sep > 0) { - accuracyBonus = 100000.0 / Math.pow(10, sep); - sepEastingString = mgrsString.substring(i, i + sep); - sepEasting = parseFloat(sepEastingString) * accuracyBonus; - sepNorthingString = mgrsString.substring(i + sep); - sepNorthing = parseFloat(sepNorthingString) * accuracyBonus; - } - - easting = sepEasting + east100k; - northing = sepNorthing + north100k; - - return { - easting: easting, - northing: northing, - zoneLetter: zoneLetter, - zoneNumber: zoneNumber, - accuracy: accuracyBonus - }; -} - -/** - * Given the first letter from a two-letter MGRS 100k zone, and given the - * MGRS table set for the zone number, figure out the easting value that - * should be added to the other, secondary easting value. - * - * @private - * @param {char} e The first letter from a two-letter MGRS 100´k zone. - * @param {number} set The MGRS table set for the zone number. - * @return {number} The easting value for the given letter and set. - */ -function getEastingFromChar(e, set) { - // colOrigin is the letter at the origin of the set for the - // column - var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1); - var eastingValue = 100000.0; - var rewindMarker = false; - - while (curCol !== e.charCodeAt(0)) { - curCol++; - if (curCol === I) { - curCol++; - } - if (curCol === O) { - curCol++; - } - if (curCol > Z) { - if (rewindMarker) { - throw ("Bad character: " + e); - } - curCol = A; - rewindMarker = true; - } - eastingValue += 100000.0; - } - - return eastingValue; -} - -/** - * Given the second letter from a two-letter MGRS 100k zone, and given the - * MGRS table set for the zone number, figure out the northing value that - * should be added to the other, secondary northing value. You have to - * remember that Northings are determined from the equator, and the vertical - * cycle of letters mean a 2000000 additional northing meters. This happens - * approx. every 18 degrees of latitude. This method does *NOT* count any - * additional northings. You have to figure out how many 2000000 meters need - * to be added for the zone letter of the MGRS coordinate. - * - * @private - * @param {char} n Second letter of the MGRS 100k zone - * @param {number} set The MGRS table set number, which is dependent on the - * UTM zone number. - * @return {number} The northing value for the given letter and set. - */ -function getNorthingFromChar(n, set) { - - if (n > 'V') { - throw ("MGRSPoint given invalid Northing " + n); - } - - // rowOrigin is the letter at the origin of the set for the - // column - var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1); - var northingValue = 0.0; - var rewindMarker = false; - - while (curRow !== n.charCodeAt(0)) { - curRow++; - if (curRow === I) { - curRow++; - } - if (curRow === O) { - curRow++; - } - // fixing a bug making whole application hang in this loop - // when 'n' is a wrong character - if (curRow > V) { - if (rewindMarker) { // making sure that this loop ends - throw ("Bad character: " + n); - } - curRow = A; - rewindMarker = true; - } - northingValue += 100000.0; - } - - return northingValue; -} - -/** - * The function getMinNorthing returns the minimum northing value of a MGRS - * zone. - * - * Ported from Geotrans' c Lattitude_Band_Value structure table. - * - * @private - * @param {char} zoneLetter The MGRS zone to get the min northing for. - * @return {number} - */ -function getMinNorthing(zoneLetter) { - var northing; - switch (zoneLetter) { - case 'C': - northing = 1100000.0; - break; - case 'D': - northing = 2000000.0; - break; - case 'E': - northing = 2800000.0; - break; - case 'F': - northing = 3700000.0; - break; - case 'G': - northing = 4600000.0; - break; - case 'H': - northing = 5500000.0; - break; - case 'J': - northing = 6400000.0; - break; - case 'K': - northing = 7300000.0; - break; - case 'L': - northing = 8200000.0; - break; - case 'M': - northing = 9100000.0; - break; - case 'N': - northing = 0.0; - break; - case 'P': - northing = 800000.0; - break; - case 'Q': - northing = 1700000.0; - break; - case 'R': - northing = 2600000.0; - break; - case 'S': - northing = 3500000.0; - break; - case 'T': - northing = 4400000.0; - break; - case 'U': - northing = 5300000.0; - break; - case 'V': - northing = 6200000.0; - break; - case 'W': - northing = 7000000.0; - break; - case 'X': - northing = 7900000.0; - break; - default: - northing = -1.0; - } - if (northing >= 0.0) { - return northing; - } - else { - throw ("Invalid zone letter: " + zoneLetter); - } - -} - -},{}],70:[function(require,module,exports){ -"use strict"; - -var proj4 = require('proj4'); -// Checks if `list` looks like a `[x, y]`. -function isXY(list) { - return list.length === 2 && - typeof list[0] === 'number' && - typeof list[1] === 'number'; -} - -function traverseCoords(coordinates, callback) { - if (isXY(coordinates)) return callback(coordinates); - return coordinates.map(function(coord){return traverseCoords(coord, callback);}); -} - -// Simplistic shallow clone that will work for a normal GeoJSON object. -function clone(obj) { - if (null == obj || "object" != typeof obj) return obj; - var copy = obj.constructor(); - for (var attr in obj) { - if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; - } - return copy; -} - -function traverseGeoJson(geojson, callback) { - var r = clone(geojson); - if (geojson.type == 'Feature') { - r.geometry = traverseGeoJson(geojson.geometry, callback); - } else if (geojson.type == 'FeatureCollection') { - r.features = r.features.map(function(gj) { return traverseGeoJson(gj, callback); }); - } else if (geojson.type == 'GeometryCollection') { - r.geometries = r.geometries.map(function(gj) { return traverseGeoJson(gj, callback); }); - } else { - callback(r); - } - - return r; -} - -function detectCrs(geojson, projs) { - var crsInfo = geojson['crs'], - name, - crs; - - if (crsInfo === undefined) { - throw new Error("Unable to detect CRS, GeoJSON has no \"crs\" property."); - } - - if (crsInfo.type == 'name') { - crs = projs[crsInfo.properties.name]; - } else if (crsInfo.type == 'EPSG') { - crs = projs["EPSG:" + crsInfo.properties.code]; - } - - if (!crs) { - throw new Error("CRS defined in crs section could not be identified: " + JSON.stringify(crsInfo)); - } - - return crs; -} - -function determineCrs(crs, projs) { - if (typeof crs == 'string' || crs instanceof String) { - return projs[crs]; - } - - return crs; -} - -function reproject(geojson, from, to, projs) { - if (!from) { - from = detectCrs(geojson, projs); - } else { - from = determineCrs(from, projs); - } - - to = determineCrs(to, projs); - var transform = proj4(from, to); - - return traverseGeoJson(geojson, function(gj) { - // No easy way to put correct CRS info into the GeoJSON, - // and definitely wrong to keep the old, so delete it. - if (gj.crs) { - delete gj.crs; - } - gj.coordinates = traverseCoords(gj.coordinates, function(xy) { - return transform.forward(xy); - }); - }); -} - -module.exports = { - detectCrs: detectCrs, - - reproject: reproject, - - reverse: function(geojson) { - return traverseGeoJson(geojson, function(gj) { - gj.coordinates = traverseCoords(gj.coordinates, function(xy) { - return [ xy[1], xy[0] ]; - }); - }); - }, - - toWgs84: function(geojson, from) { - return reproject(geojson, from, proj4.WGS84); - } -} - -},{"proj4":71}],71:[function(require,module,exports){ -!function(t,s){"function"==typeof define&&define.amd?define(s):"undefined"!=typeof module?module.exports=s():t.proj4=s()}(this,function(){var t,s,i;return function(a){function h(t,s){return x.call(t,s)}function e(t,s){var i,a,h,e,n,r,o,l,u,p,c=s&&s.split("/"),m=y.map,M=m&&m["*"]||{};if(t&&"."===t.charAt(0))if(s){for(c=c.slice(0,c.length-1),t=c.concat(t.split("/")),l=0;l0&&(t.splice(l-1,2),l-=2)}t=t.join("/")}else 0===t.indexOf("./")&&(t=t.substring(2));if((c||M)&&m){for(i=t.split("/"),l=i.length;l>0;l-=1){if(a=i.slice(0,l).join("/"),c)for(u=c.length;u>0;u-=1)if(h=m[c.slice(0,u).join("/")],h&&(h=h[a])){e=h,n=l;break}if(e)break;!r&&M&&M[a]&&(r=M[a],o=l)}!e&&r&&(e=r,n=o),e&&(i.splice(0,n,e),t=i.join("/"))}return t}function n(t,s){return function(){return m.apply(a,g.call(arguments,0).concat([t,s]))}}function r(t){return function(s){return e(s,t)}}function o(t){return function(s){d[t]=s}}function l(t){if(h(_,t)){var s=_[t];delete _[t],j[t]=!0,c.apply(a,s)}if(!h(d,t)&&!h(j,t))throw new Error("No "+t);return d[t]}function u(t){var s,i=t?t.indexOf("!"):-1;return i>-1&&(s=t.substring(0,i),t=t.substring(i+1,t.length)),[s,t]}function p(t){return function(){return y&&y.config&&y.config[t]||{}}}var c,m,M,f,d={},_={},y={},j={},x=Object.prototype.hasOwnProperty,g=[].slice;M=function(t,s){var i,a=u(t),h=a[0];return t=a[1],h&&(h=e(h,s),i=l(h)),h?t=i&&i.normalize?i.normalize(t,r(s)):e(t,s):(t=e(t,s),a=u(t),h=a[0],t=a[1],h&&(i=l(h))),{f:h?h+"!"+t:t,n:t,pr:h,p:i}},f={require:function(t){return n(t)},exports:function(t){var s=d[t];return"undefined"!=typeof s?s:d[t]={}},module:function(t){return{id:t,uri:"",exports:d[t],config:p(t)}}},c=function(t,s,i,e){var r,u,p,c,m,y,x=[];if(e=e||t,"function"==typeof i){for(s=!s.length&&i.length?["require","exports","module"]:s,m=0;m=56&&64>c&&m>=3&&12>m&&(p=32),c>=72&&84>c&&(m>=0&&9>m?p=31:m>=9&&21>m?p=33:m>=21&&33>m?p=35:m>=33&&42>m&&(p=37)),s=6*(p-1)-180+3,u=i(s),a=f/(1-f),h=M/Math.sqrt(1-f*Math.sin(_)*Math.sin(_)),e=Math.tan(_)*Math.tan(_),r=a*Math.cos(_)*Math.cos(_),o=Math.cos(_)*(y-u),l=M*((1-f/4-3*f*f/64-5*f*f*f/256)*_-(3*f/8+3*f*f/32+45*f*f*f/1024)*Math.sin(2*_)+(15*f*f/256+45*f*f*f/1024)*Math.sin(4*_)-35*f*f*f/3072*Math.sin(6*_));var j=d*h*(o+(1-e+r)*o*o*o/6+(5-18*e+e*e+72*r-58*a)*o*o*o*o*o/120)+5e5,x=d*(l+h*Math.tan(_)*(o*o/2+(5-e+9*r+4*r*r)*o*o*o*o/24+(61-58*e+e*e+600*r-330*a)*o*o*o*o*o*o/720));return 0>c&&(x+=1e7),{northing:Math.round(x),easting:Math.round(j),zoneNumber:p,zoneLetter:n(c)}}function e(t){var s=t.northing,i=t.easting,h=t.zoneLetter,n=t.zoneNumber;if(0>n||n>60)return null;var r,o,l,u,p,c,m,M,f,d,_=.9996,y=6378137,j=.00669438,x=(1-Math.sqrt(1-j))/(1+Math.sqrt(1-j)),g=i-5e5,v=s;"N">h&&(v-=1e7),M=6*(n-1)-180+3,r=j/(1-j),m=v/_,f=m/(y*(1-j/4-3*j*j/64-5*j*j*j/256)),d=f+(3*x/2-27*x*x*x/32)*Math.sin(2*f)+(21*x*x/16-55*x*x*x*x/32)*Math.sin(4*f)+151*x*x*x/96*Math.sin(6*f),o=y/Math.sqrt(1-j*Math.sin(d)*Math.sin(d)),l=Math.tan(d)*Math.tan(d),u=r*Math.cos(d)*Math.cos(d),p=y*(1-j)/Math.pow(1-j*Math.sin(d)*Math.sin(d),1.5),c=g/(o*_);var P=d-o*Math.tan(d)/p*(c*c/2-(5+3*l+10*u-4*u*u-9*r)*c*c*c*c/24+(61+90*l+298*u+45*l*l-252*r-3*u*u)*c*c*c*c*c*c/720);P=a(P);var b=(c-(1+2*l+u)*c*c*c/6+(5-2*u+28*l-3*u*u+8*r+24*l*l)*c*c*c*c*c/120)/Math.cos(d);b=M+a(b);var C;if(t.accuracy){var S=e({northing:t.northing+t.accuracy,easting:t.easting+t.accuracy,zoneLetter:t.zoneLetter,zoneNumber:t.zoneNumber});C={top:S.lat,right:S.lon,bottom:P,left:b}}else C={lat:P,lon:b};return C}function n(t){var s="Z";return 84>=t&&t>=72?s="X":72>t&&t>=64?s="W":64>t&&t>=56?s="V":56>t&&t>=48?s="U":48>t&&t>=40?s="T":40>t&&t>=32?s="S":32>t&&t>=24?s="R":24>t&&t>=16?s="Q":16>t&&t>=8?s="P":8>t&&t>=0?s="N":0>t&&t>=-8?s="M":-8>t&&t>=-16?s="L":-16>t&&t>=-24?s="K":-24>t&&t>=-32?s="J":-32>t&&t>=-40?s="H":-40>t&&t>=-48?s="G":-48>t&&t>=-56?s="F":-56>t&&t>=-64?s="E":-64>t&&t>=-72?s="D":-72>t&&t>=-80&&(s="C"),s}function r(t,s){var i=""+t.easting,a=""+t.northing;return t.zoneNumber+t.zoneLetter+o(t.easting,t.northing,t.zoneNumber)+i.substr(i.length-5,s)+a.substr(a.length-5,s)}function o(t,s,i){var a=l(i),h=Math.floor(t/1e5),e=Math.floor(s/1e5)%20;return u(h,e,a)}function l(t){var s=t%f;return 0===s&&(s=f),s}function u(t,s,i){var a=i-1,h=d.charCodeAt(a),e=_.charCodeAt(a),n=h+t-1,r=e+s,o=!1;n>v&&(n=n-v+y-1,o=!0),(n===j||j>h&&n>j||(n>j||j>h)&&o)&&n++,(n===x||x>h&&n>x||(n>x||x>h)&&o)&&(n++,n===j&&n++),n>v&&(n=n-v+y-1),r>g?(r=r-g+y-1,o=!0):o=!1,(r===j||j>e&&r>j||(r>j||j>e)&&o)&&r++,(r===x||x>e&&r>x||(r>x||x>e)&&o)&&(r++,r===j&&r++),r>g&&(r=r-g+y-1);var l=String.fromCharCode(n)+String.fromCharCode(r);return l}function p(t){if(t&&0===t.length)throw"MGRSPoint coverting from nothing";for(var s,i=t.length,a=null,h="",e=0;!/[A-Z]/.test(s=t.charAt(e));){if(e>=2)throw"MGRSPoint bad conversion from: "+t;h+=s,e++}var n=parseInt(h,10);if(0===e||e+3>i)throw"MGRSPoint bad conversion from: "+t;var r=t.charAt(e++);if("A">=r||"B"===r||"Y"===r||r>="Z"||"I"===r||"O"===r)throw"MGRSPoint zone letter "+r+" not handled: "+t;a=t.substring(e,e+=2);for(var o=l(n),u=c(a.charAt(0),o),p=m(a.charAt(1),o);p0&&(d=1e5/Math.pow(10,g),_=t.substring(e,e+g),v=parseFloat(_)*d,y=t.substring(e+g),P=parseFloat(y)*d),j=v+u,x=P+p,{easting:j,northing:x,zoneLetter:r,zoneNumber:n,accuracy:d}}function c(t,s){for(var i=d.charCodeAt(s-1),a=1e5,h=!1;i!==t.charCodeAt(0);){if(i++,i===j&&i++,i===x&&i++,i>v){if(h)throw"Bad character: "+t;i=y,h=!0}a+=1e5}return a}function m(t,s){if(t>"V")throw"MGRSPoint given invalid Northing "+t;for(var i=_.charCodeAt(s-1),a=0,h=!1;i!==t.charCodeAt(0);){if(i++,i===j&&i++,i===x&&i++,i>g){if(h)throw"Bad character: "+t;i=y,h=!0}a+=1e5}return a}function M(t){var s;switch(t){case"C":s=11e5;break;case"D":s=2e6;break;case"E":s=28e5;break;case"F":s=37e5;break;case"G":s=46e5;break;case"H":s=55e5;break;case"J":s=64e5;break;case"K":s=73e5;break;case"L":s=82e5;break;case"M":s=91e5;break;case"N":s=0;break;case"P":s=8e5;break;case"Q":s=17e5;break;case"R":s=26e5;break;case"S":s=35e5;break;case"T":s=44e5;break;case"U":s=53e5;break;case"V":s=62e5;break;case"W":s=7e6;break;case"X":s=79e5;break;default:s=-1}if(s>=0)return s;throw"Invalid zone letter: "+t}var f=6,d="AJSAJS",_="AFAFAF",y=65,j=73,x=79,g=86,v=90;s.forward=function(t,s){return s=s||5,r(h({lat:t.lat,lon:t.lon}),s)},s.inverse=function(t){var s=e(p(t.toUpperCase()));return[s.left,s.bottom,s.right,s.top]}}),i("proj4/Point",["require","proj4/mgrs"],function(t){function s(t,i,a){if(!(this instanceof s))return new s(t,i,a);if("object"==typeof t)this.x=t[0],this.y=t[1],this.z=t[2]||0;else if("string"==typeof t&&"undefined"==typeof i){var h=t.split(",");this.x=parseFloat(h[0]),this.y=parseFloat(h[1]),this.z=parseFloat(h[2])||0}else this.x=t,this.y=i,this.z=a||0;this.clone=function(){return new s(this.x,this.y,this.z)},this.toString=function(){return"x="+this.x+",y="+this.y},this.toShortString=function(){return this.x+", "+this.y}}var i=t("proj4/mgrs");return s.fromMGRS=function(t){var a=i.inverse(t);return new s((a[2]+a[0])/2,(a[3]+a[1])/2)},s.prototype.toMGRS=function(t){return i.forward({lon:this.x,lat:this.y},t)},s}),i("proj4/extend",[],function(){return function(t,s){t=t||{};var i,a;if(!s)return t;for(a in s)i=s[a],void 0!==i&&(t[a]=i);return t}}),i("proj4/common",[],function(){var t={PI:3.141592653589793,HALF_PI:1.5707963267948966,TWO_PI:6.283185307179586,FORTPI:.7853981633974483,R2D:57.29577951308232,D2R:.017453292519943295,SEC_TO_RAD:484813681109536e-20,EPSLN:1e-10,MAX_ITER:20,COS_67P5:.3826834323650898,AD_C:1.0026,PJD_UNKNOWN:0,PJD_3PARAM:1,PJD_7PARAM:2,PJD_GRIDSHIFT:3,PJD_WGS84:4,PJD_NODATUM:5,SRS_WGS84_SEMIMAJOR:6378137,SRS_WGS84_ESQUARED:.006694379990141316,SIXTH:.16666666666666666,RA4:.04722222222222222,RA6:.022156084656084655,RV4:.06944444444444445,RV6:.04243827160493827,msfnz:function(t,s,i){var a=t*s;return i/Math.sqrt(1-a*a)},tsfnz:function(t,s,i){var a=t*i,h=.5*t;return a=Math.pow((1-a)/(1+a),h),Math.tan(.5*(this.HALF_PI-s))/a},phi2z:function(t,s){for(var i,a,h=.5*t,e=this.HALF_PI-2*Math.atan(s),n=0;15>=n;n++)if(i=t*Math.sin(e),a=this.HALF_PI-2*Math.atan(s*Math.pow((1-i)/(1+i),h))-e,e+=a,Math.abs(a)<=1e-10)return e;return-9999},qsfnz:function(t,s){var i;return t>1e-7?(i=t*s,(1-t*t)*(s/(1-i*i)-.5/t*Math.log((1-i)/(1+i)))):2*s},iqsfnz:function(s,i){var a=1-(1-s*s)/(2*s)*Math.log((1-s)/(1+s));if(Math.abs(Math.abs(i)-a)<1e-6)return 0>i?-1*t.HALF_PI:t.HALF_PI;for(var h,e,n,r,o=Math.asin(.5*i),l=0;30>l;l++)if(e=Math.sin(o),n=Math.cos(o),r=s*e,h=Math.pow(1-r*r,2)/(2*n)*(i/(1-s*s)-e/(1-r*r)+.5/s*Math.log((1-r)/(1+r))),o+=h,Math.abs(h)<=1e-10)return o;return 0/0},asinz:function(t){return Math.abs(t)>1&&(t=t>1?1:-1),Math.asin(t)},e0fn:function(t){return 1-.25*t*(1+t/16*(3+1.25*t))},e1fn:function(t){return.375*t*(1+.25*t*(1+.46875*t))},e2fn:function(t){return.05859375*t*t*(1+.75*t)},e3fn:function(t){return t*t*t*(35/3072)},mlfn:function(t,s,i,a,h){return t*h-s*Math.sin(2*h)+i*Math.sin(4*h)-a*Math.sin(6*h)},imlfn:function(t,s,i,a,h){var e,n;e=t/s;for(var r=0;15>r;r++)if(n=(t-(s*e-i*Math.sin(2*e)+a*Math.sin(4*e)-h*Math.sin(6*e)))/(s-2*i*Math.cos(2*e)+4*a*Math.cos(4*e)-6*h*Math.cos(6*e)),e+=n,Math.abs(n)<=1e-10)return e;return 0/0},srat:function(t,s){return Math.pow((1-t)/(1+t),s)},sign:function(t){return 0>t?-1:1},adjust_lon:function(t){return t=Math.abs(t)this.HALF_PI)return Number.NaN;if(s===this.HALF_PI)return Number.POSITIVE_INFINITY;if(s===-1*this.HALF_PI)return Number.NEGATIVE_INFINITY;var a=t*i;return Math.log(Math.tan((this.HALF_PI+s)/2))+t*Math.log((1-a)/(1+a))/2},fL:function(t,s){return 2*Math.atan(t*Math.exp(s))-this.HALF_PI},invlatiso:function(t,s){var i=this.fL(1,s),a=0,h=0;do a=i,h=t*Math.sin(a),i=this.fL(Math.exp(t*Math.log((1+h)/(1-h))/2),s);while(Math.abs(i-a)>1e-12);return i},sinh:function(t){var s=Math.exp(t);return s=(s-1/s)/2},cosh:function(t){var s=Math.exp(t);return s=(s+1/s)/2},tanh:function(t){var s=Math.exp(t);return s=(s-1/s)/(s+1/s)},asinh:function(t){var s=t>=0?1:-1;return s*Math.log(Math.abs(t)+Math.sqrt(t*t+1))},acosh:function(t){return 2*Math.log(Math.sqrt((t+1)/2)+Math.sqrt((t-1)/2))},atanh:function(t){return Math.log((t-1)/(t+1))/2},gN:function(t,s,i){var a=s*i;return t/Math.sqrt(1-a*a)},pj_enfn:function(t){var s=[];s[0]=this.C00-t*(this.C02+t*(this.C04+t*(this.C06+t*this.C08))),s[1]=t*(this.C22-t*(this.C04+t*(this.C06+t*this.C08)));var i=t*t;return s[2]=i*(this.C44-t*(this.C46+t*this.C48)),i*=t,s[3]=i*(this.C66-t*this.C68),s[4]=i*t*this.C88,s},pj_mlfn:function(t,s,i,a){return i*=s,s*=s,a[0]*t-i*(a[1]+s*(a[2]+s*(a[3]+s*a[4])))},pj_inv_mlfn:function(s,i,a){for(var h=1/(1-i),e=s,n=t.MAX_ITER;n;--n){var r=Math.sin(e),o=1-i*r*r;if(o=(this.pj_mlfn(e,r,Math.cos(e),a)-s)*o*Math.sqrt(o)*h,e-=o,Math.abs(o).99999999999))return n;h.x++,e.x=0}else if(i=h.x+1,i>=s.lim[0]){if(!(i===s.lim[0]&&e.x<1e-11))return n;h.x--,e.x=1}if(h.y<0){if(!(-1===h.y&&e.y>.99999999999))return n;h.y++,e.y=0}else if(i=h.y+1,i>=s.lim[1]){if(!(i===s.lim[1]&&e.y<1e-11))return n;h.y++,e.y=1}i=h.y*s.lim[0]+h.x;var r={x:s.cvs[i][0],y:s.cvs[i][1]};i++;var o={x:s.cvs[i][0],y:s.cvs[i][1]};i+=s.lim[0];var l={x:s.cvs[i][0],y:s.cvs[i][1]};i--;var u={x:s.cvs[i][0],y:s.cvs[i][1]},p=e.x*e.y,c=e.x*(1-e.y),m=(1-e.x)*(1-e.y),M=(1-e.x)*e.y;return n.x=m*r.x+c*o.x+M*u.x+p*l.x,n.y=m*r.y+c*o.y+M*u.y+p*l.y,n},nad_cvt:function(s,i,a){var h={x:Number.NaN,y:Number.NaN};if(isNaN(s.x))return h;var e={x:s.x,y:s.y};e.x-=a.ll[0],e.y-=a.ll[1],e.x=t.adjust_lon(e.x-t.PI)+t.PI;var n=t.nad_intr(e,a);if(i){if(isNaN(n.x))return h;n.x=e.x+n.x,n.y=e.y-n.y;var r,o,l=9,u=1e-12;do{if(o=t.nad_intr(n,a),isNaN(o.x)){this.reportError("Inverse grid shift iteration failed, presumably at grid edge. Using first approximation.");break}r={x:n.x-o.x-e.x,y:n.y+o.y-e.y},n.x-=r.x,n.y-=r.y}while(l--&&Math.abs(r.x)>u&&Math.abs(r.y)>u);if(0>l)return this.reportError("Inverse grid shift iterator failed to converge."),h;h.x=t.adjust_lon(n.x+a.ll[0]),h.y=n.y+a.ll[1]}else isNaN(n.x)||(h.x=s.x-n.x,h.y=s.y+n.y);return h},C00:1,C02:.25,C04:.046875,C06:.01953125,C08:.01068115234375,C22:.75,C44:.46875,C46:.013020833333333334,C48:.007120768229166667,C66:.3645833333333333,C68:.005696614583333333,C88:.3076171875};return t}),i("proj4/global",[],function(){return function(t){t("WGS84","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),t("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),t("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),t("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"),t["EPSG:3785"]=t["EPSG:3857"],t.GOOGLE=t["EPSG:3857"],t["EPSG:900913"]=t["EPSG:3857"],t["EPSG:102113"]=t["EPSG:3857"]}}),i("proj4/constants/PrimeMeridian",{greenwich:0,lisbon:-9.131906111111,paris:2.337229166667,bogota:-74.080916666667,madrid:-3.687938888889,rome:12.452333333333,bern:7.439583333333,jakarta:106.807719444444,ferro:-17.666666666667,brussels:4.367975,stockholm:18.058277777778,athens:23.7163375,oslo:10.722916666667}),i("proj4/constants/Ellipsoid",{MERIT:{a:6378137,rf:298.257,ellipseName:"MERIT 1983"},SGS85:{a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},GRS80:{a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},IAU76:{a:6378140,rf:298.257,ellipseName:"IAU 1976"},airy:{a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},"APL4.":{a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},NWL9D:{a:6378145,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,ellipseName:"Andrae 1876 (Den., Iclnd.)"},aust_SA:{a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},GRS67:{a:6378160,rf:298.247167427,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."},clrk58:{a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},CPM:{a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},delmbr:{a:6376428,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,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},fschr60m:{a:6378155,rf:298.3,ellipseName:"Fischer 1960"},fschr68:{a:6378150,rf:298.3,ellipseName:"Fischer 1968"},helmert:{a:6378200,rf:298.3,ellipseName:"Helmert 1906"},hough:{a:6378270,rf:297,ellipseName:"Hough"},intl:{a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},kaula:{a:6378163,rf:298.24,ellipseName:"Kaula 1961"},lerch:{a:6378139,rf:298.257,ellipseName:"Lerch 1979"},mprts:{a:6397300,rf:191,ellipseName:"Maupertius 1738"},new_intl:{a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},plessis:{a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},krass:{a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},SEasia:{a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},walbeck:{a:6376896,b:6355834.8467,ellipseName:"Walbeck"},WGS60:{a:6378165,rf:298.3,ellipseName:"WGS 60"},WGS66:{a:6378145,rf:298.25,ellipseName:"WGS 66"},WGS72:{a:6378135,rf:298.26,ellipseName:"WGS 72"},WGS84:{a:6378137,rf:298.257223563,ellipseName:"WGS 84"},sphere:{a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"}}),i("proj4/constants/Datum",{wgs84:{towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},ch1903:{towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},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"},rassadiran:{towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},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"},s_jtsk:{towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},beduaram:{towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},gunung_segara:{towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"}}),i("proj4/constants/grids",{"null":{ll:[-3.14159265,-1.57079633],del:[3.14159265,1.57079633],lim:[3,3],count:9,cvs:[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}}),i("proj4/constants",["require","exports","module","proj4/constants/PrimeMeridian","proj4/constants/Ellipsoid","proj4/constants/Datum","proj4/constants/grids"],function(t,s){s.PrimeMeridian=t("proj4/constants/PrimeMeridian"),s.Ellipsoid=t("proj4/constants/Ellipsoid"),s.Datum=t("proj4/constants/Datum"),s.Datum.OSB36=s.Datum.OSGB36,s.grids=t("proj4/constants/grids")}),i("proj4/projString",["require","proj4/common","proj4/constants"],function(t){var s=t("proj4/common"),i=t("proj4/constants");return function(t){var a={},h={};t.split("+").map(function(t){return t.trim()}).filter(function(t){return t}).forEach(function(t){var s=t.split("=");s.push(!0),h[s[0].toLowerCase()]=s[1]});var e,n,r,o={proj:"projName",datum:"datumCode",rf:function(t){a.rf=parseFloat(t,10)},lat_0:function(t){a.lat0=t*s.D2R},lat_1:function(t){a.lat1=t*s.D2R},lat_2:function(t){a.lat2=t*s.D2R},lat_ts:function(t){a.lat_ts=t*s.D2R},lon_0:function(t){a.long0=t*s.D2R},lon_1:function(t){a.long1=t*s.D2R},lon_2:function(t){a.long2=t*s.D2R},alpha:function(t){a.alpha=parseFloat(t)*s.D2R},lonc:function(t){a.longc=t*s.D2R},x_0:function(t){a.x0=parseFloat(t,10)},y_0:function(t){a.y0=parseFloat(t,10)},k_0:function(t){a.k0=parseFloat(t,10)},k:function(t){a.k0=parseFloat(t,10)},r_a:function(){a.R_A=!0},zone:function(t){a.zone=parseInt(t,10)},south:function(){a.utmSouth=!0},towgs84:function(t){a.datum_params=t.split(",").map(function(t){return parseFloat(t,10)})},to_meter:function(t){a.to_meter=parseFloat(t,10)},from_greenwich:function(t){a.from_greenwich=t*s.D2R},pm:function(t){a.from_greenwich=(i.PrimeMeridian[t]?i.PrimeMeridian[t]:parseFloat(t,10))*s.D2R},nadgrids:function(t){"@null"===t?a.datumCode="none":a.nadgrids=t},axis:function(t){var s="ewnsud";3===t.length&&-1!==s.indexOf(t.substr(0,1))&&-1!==s.indexOf(t.substr(1,1))&&-1!==s.indexOf(t.substr(2,1))&&(a.axis=t)}};for(e in h)n=h[e],e in o?(r=o[e],"function"==typeof r?r(n):a[r]=n):a[e]=n;return a}}),i("proj4/wkt",["require","proj4/common","proj4/extend"],function(t){function s(t,s,a){t[s]=a.map(function(t){var s={};return i(t,s),s}).reduce(function(t,s){return r(t,s)},{})}function i(t,a){var h;return Array.isArray(t)?(h=t.shift(),"PARAMETER"===h&&(h=t.shift()),1===t.length?Array.isArray(t[0])?(a[h]={},i(t[0],a[h])):a[h]=t[0]:t.length?"TOWGS84"===h?a[h]=t:(a[h]={},["UNIT","PRIMEM","VERT_DATUM"].indexOf(h)>-1?(a[h]={name:t[0].toLowerCase(),convert:t[1]},3===t.length&&(a[h].auth=t[2])):"SPHEROID"===h?(a[h]={name:t[0],a:t[1],rf:t[2]},4===t.length&&(a[h].auth=t[3])):["GEOGCS","GEOCCS","DATUM","VERT_CS","COMPD_CS","LOCAL_CS","FITTED_CS","LOCAL_DATUM"].indexOf(h)>-1?(t[0]=["name",t[0]],s(a,h,t)):t.every(function(t){return Array.isArray(t)})?s(a,h,t):i(t,a[h])):a[h]=!0,void 0):(a[t]=!0,void 0)}function a(t,s){var i=s[0],a=s[1];!(i in t)&&a in t&&(t[i]=t[a],3===s.length&&(t[i]=s[2](t[i])))}function h(t){return t*n.D2R}function e(t){function s(s){var i=t.to_meter||1;return parseFloat(s,10)*i}"GEOGCS"===t.type?t.projName="longlat":"LOCAL_CS"===t.type?(t.projName="identity",t.local=!0):t.projName="object"==typeof t.PROJECTION?Object.keys(t.PROJECTION)[0]:t.PROJECTION,t.UNIT&&(t.units=t.UNIT.name.toLowerCase(),"metre"===t.units&&(t.units="meter"),t.UNIT.convert&&(t.to_meter=parseFloat(t.UNIT.convert,10))),t.GEOGCS&&(t.datumCode=t.GEOGCS.DATUM?t.GEOGCS.DATUM.name.toLowerCase():t.GEOGCS.name.toLowerCase(),"d_"===t.datumCode.slice(0,2)&&(t.datumCode=t.datumCode.slice(2)),("new_zealand_geodetic_datum_1949"===t.datumCode||"new_zealand_1949"===t.datumCode)&&(t.datumCode="nzgd49"),"wgs_1984"===t.datumCode&&("Mercator_Auxiliary_Sphere"===t.PROJECTION&&(t.sphere=!0),t.datumCode="wgs84"),"_ferro"===t.datumCode.slice(-6)&&(t.datumCode=t.datumCode.slice(0,-6)),"_jakarta"===t.datumCode.slice(-8)&&(t.datumCode=t.datumCode.slice(0,-8)),t.GEOGCS.DATUM&&t.GEOGCS.DATUM.SPHEROID&&(t.ellps=t.GEOGCS.DATUM.SPHEROID.name.replace("_19","").replace(/[Cc]larke\_18/,"clrk"),"international"===t.ellps.toLowerCase().slice(0,13)&&(t.ellps="intl"),t.a=t.GEOGCS.DATUM.SPHEROID.a,t.rf=parseFloat(t.GEOGCS.DATUM.SPHEROID.rf,10))),t.b&&!isFinite(t.b)&&(t.b=t.a);var i=function(s){return a(t,s)},e=[["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"],["scale_factor","Scale_Factor"],["k0","scale_factor"],["latitude_of_center","Latitude_of_center"],["lat0","latitude_of_center",h],["longitude_of_center","Longitude_Of_Center"],["longc","longitude_of_center",h],["x0","false_easting",s],["y0","false_northing",s],["long0","central_meridian",h],["lat0","latitude_of_origin",h],["lat0","standard_parallel_1",h],["lat1","standard_parallel_1",h],["lat2","standard_parallel_2",h],["alpha","azimuth",h],["srsCode","name"]];e.forEach(i),t.long0||!t.longc||"Albers_Conic_Equal_Area"!==t.PROJECTION&&"Lambert_Azimuthal_Equal_Area"!==t.PROJECTION||(t.long0=t.longc)}var n=t("proj4/common"),r=t("proj4/extend");return function(t,s){var a=JSON.parse((","+t).replace(/\s*\,\s*([A-Z_0-9]+?)(\[)/g,',["$1",').slice(1).replace(/\s*\,\s*([A-Z_0-9]+?)\]/g,',"$1"]')),h=a.shift(),n=a.shift();a.unshift(["name",n]),a.unshift(["type",h]),a.unshift("output");var o={};return i(a,o),e(o.output),r(s,o.output)}}),i("proj4/defs",["require","proj4/global","proj4/projString","proj4/wkt"],function(t){function s(t){var i=this;if(2===arguments.length)s[t]="+"===arguments[1][0]?a(arguments[1]):h(arguments[1]);else if(1===arguments.length)return Array.isArray(t)?t.map(function(t){Array.isArray(t)?s.apply(i,t):s(t)}):("string"==typeof t||("EPSG"in t?s["EPSG:"+t.EPSG]=t:"ESRI"in t?s["ESRI:"+t.ESRI]=t:"IAU2000"in t?s["IAU2000:"+t.IAU2000]=t:console.log(t)),void 0)}var i=t("proj4/global"),a=t("proj4/projString"),h=t("proj4/wkt");return i(s),s}),i("proj4/datum",["require","proj4/common"],function(t){var s=t("proj4/common"),i=function(t){if(!(this instanceof i))return new i(t);if(this.datum_type=s.PJD_WGS84,t){if(t.datumCode&&"none"===t.datumCode&&(this.datum_type=s.PJD_NODATUM),t.datum_params){for(var a=0;a3&&(0!==t.datum_params[3]||0!==t.datum_params[4]||0!==t.datum_params[5]||0!==t.datum_params[6])&&(this.datum_type=s.PJD_7PARAM,t.datum_params[3]*=s.SEC_TO_RAD,t.datum_params[4]*=s.SEC_TO_RAD,t.datum_params[5]*=s.SEC_TO_RAD,t.datum_params[6]=t.datum_params[6]/1e6+1)}this.datum_type=t.grids?s.PJD_GRIDSHIFT:this.datum_type,this.a=t.a,this.b=t.b,this.es=t.es,this.ep2=t.ep2,this.datum_params=t.datum_params,this.datum_type===s.PJD_GRIDSHIFT&&(this.grids=t.grids)}};return i.prototype={compare_datums:function(t){return this.datum_type!==t.datum_type?!1:this.a!==t.a||Math.abs(this.es-t.es)>5e-11?!1:this.datum_type===s.PJD_3PARAM?this.datum_params[0]===t.datum_params[0]&&this.datum_params[1]===t.datum_params[1]&&this.datum_params[2]===t.datum_params[2]:this.datum_type===s.PJD_7PARAM?this.datum_params[0]===t.datum_params[0]&&this.datum_params[1]===t.datum_params[1]&&this.datum_params[2]===t.datum_params[2]&&this.datum_params[3]===t.datum_params[3]&&this.datum_params[4]===t.datum_params[4]&&this.datum_params[5]===t.datum_params[5]&&this.datum_params[6]===t.datum_params[6]:this.datum_type===s.PJD_GRIDSHIFT||t.datum_type===s.PJD_GRIDSHIFT?this.nadgrids===t.nadgrids:!0},geodetic_to_geocentric:function(t){var i,a,h,e,n,r,o,l=t.x,u=t.y,p=t.z?t.z:0,c=0;if(u<-s.HALF_PI&&u>-1.001*s.HALF_PI)u=-s.HALF_PI;else if(u>s.HALF_PI&&u<1.001*s.HALF_PI)u=s.HALF_PI;else if(u<-s.HALF_PI||u>s.HALF_PI)return null;return l>s.PI&&(l-=2*s.PI),n=Math.sin(u),o=Math.cos(u),r=n*n,e=this.a/Math.sqrt(1-this.es*r),i=(e+p)*o*Math.cos(l),a=(e+p)*o*Math.sin(l),h=(e*(1-this.es)+p)*n,t.x=i,t.y=a,t.z=h,c},geocentric_to_geodetic:function(t){var i,a,h,e,n,r,o,l,u,p,c,m,M,f,d,_,y,j=1e-12,x=j*j,g=30,v=t.x,P=t.y,b=t.z?t.z:0;if(M=!1,i=Math.sqrt(v*v+P*P),a=Math.sqrt(v*v+P*P+b*b),i/this.ax&&g>f);return _=Math.atan(c/Math.abs(p)),t.x=d,t.y=_,t.z=y,t},geocentric_to_geodetic_noniter:function(t){var i,a,h,e,n,r,o,l,u,p,c,m,M,f,d,_,y,j=t.x,x=t.y,g=t.z?t.z:0;if(j=parseFloat(j),x=parseFloat(x),g=parseFloat(g),y=!1,0!==j)i=Math.atan2(x,j);else if(x>0)i=s.HALF_PI;else if(0>x)i=-s.HALF_PI;else if(y=!0,i=0,g>0)a=s.HALF_PI;else{if(!(0>g))return a=s.HALF_PI,h=-this.b,void 0;a=-s.HALF_PI}return n=j*j+x*x,e=Math.sqrt(n),r=g*s.AD_C,l=Math.sqrt(r*r+n),p=r/l,m=e/l,c=p*p*p,o=g+this.b*this.ep2*c,_=e-this.a*this.es*m*m*m,u=Math.sqrt(o*o+_*_),M=o/u,f=_/u,d=this.a/Math.sqrt(1-this.es*M*M),h=f>=s.COS_67P5?e/f-d:f<=-s.COS_67P5?e/-f-d:g/M+d*(this.es-1),y===!1&&(a=Math.atan(M/f)),t.x=i,t.y=a,t.z=h,t},geocentric_to_wgs84:function(t){if(this.datum_type===s.PJD_3PARAM)t.x+=this.datum_params[0],t.y+=this.datum_params[1],t.z+=this.datum_params[2];else if(this.datum_type===s.PJD_7PARAM){var i=this.datum_params[0],a=this.datum_params[1],h=this.datum_params[2],e=this.datum_params[3],n=this.datum_params[4],r=this.datum_params[5],o=this.datum_params[6],l=o*(t.x-r*t.y+n*t.z)+i,u=o*(r*t.x+t.y-e*t.z)+a,p=o*(-n*t.x+e*t.y+t.z)+h;t.x=l,t.y=u,t.z=p}},geocentric_from_wgs84:function(t){if(this.datum_type===s.PJD_3PARAM)t.x-=this.datum_params[0],t.y-=this.datum_params[1],t.z-=this.datum_params[2];else if(this.datum_type===s.PJD_7PARAM){var i=this.datum_params[0],a=this.datum_params[1],h=this.datum_params[2],e=this.datum_params[3],n=this.datum_params[4],r=this.datum_params[5],o=this.datum_params[6],l=(t.x-i)/o,u=(t.y-a)/o,p=(t.z-h)/o;t.x=l+r*u-n*p,t.y=-r*l+u+e*p,t.z=n*l-e*u+p}}},i}),i("proj4/projCode/tmerc",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){this.e0=i.e0fn(this.es),this.e1=i.e1fn(this.es),this.e2=i.e2fn(this.es),this.e3=i.e3fn(this.es),this.ml0=this.a*i.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat0)},s.forward=function(t){var s,a,h,e=t.x,n=t.y,r=i.adjust_lon(e-this.long0),o=Math.sin(n),l=Math.cos(n);if(this.sphere){var u=l*Math.sin(r);if(Math.abs(Math.abs(u)-1)<1e-10)return 93;a=.5*this.a*this.k0*Math.log((1+u)/(1-u)),s=Math.acos(l*Math.cos(r)/Math.sqrt(1-u*u)),0>n&&(s=-s),h=this.a*this.k0*(s-this.lat0)}else{var p=l*r,c=Math.pow(p,2),m=this.ep2*Math.pow(l,2),M=Math.tan(n),f=Math.pow(M,2);s=1-this.es*Math.pow(o,2);var d=this.a/Math.sqrt(s),_=this.a*i.mlfn(this.e0,this.e1,this.e2,this.e3,n);a=this.k0*d*p*(1+c/6*(1-f+m+c/20*(5-18*f+Math.pow(f,2)+72*m-58*this.ep2)))+this.x0,h=this.k0*(_-this.ml0+d*M*c*(.5+c/24*(5-f+9*m+4*Math.pow(m,2)+c/30*(61-58*f+Math.pow(f,2)+600*m-330*this.ep2))))+this.y0}return t.x=a,t.y=h,t},s.inverse=function(t){var s,a,h,e,n,r,o=6;if(this.sphere){var l=Math.exp(t.x/(this.a*this.k0)),u=.5*(l-1/l),p=this.lat0+t.y/(this.a*this.k0),c=Math.cos(p);s=Math.sqrt((1-c*c)/(1+u*u)),n=i.asinz(s),0>p&&(n=-n),r=0===u&&0===c?this.long0:i.adjust_lon(Math.atan2(u,c)+this.long0)}else{var m=t.x-this.x0,M=t.y-this.y0;for(s=(this.ml0+M/this.k0)/this.a,a=s,e=0;!0&&(h=(s+this.e1*Math.sin(2*a)-this.e2*Math.sin(4*a)+this.e3*Math.sin(6*a))/this.e0-a,a+=h,!(Math.abs(h)<=i.EPSLN));e++)if(e>=o)return 95;if(Math.abs(a)0&&(h=2*Math.atan(e*i.srat(this.e*Math.sin(t.y),-.5*this.e))-i.HALF_PI,!(Math.abs(h-t.y)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)<=i.EPSLN&&(this.k0=.5*this.cons*i.msfnz(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/i.tsfnz(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=i.msfnz(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-i.HALF_PI,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},s.forward=function(t){var s,a,h,e,n,r,o=t.x,l=t.y,u=Math.sin(l),p=Math.cos(l),c=i.adjust_lon(o-this.long0);return Math.abs(Math.abs(o-this.long0)-i.PI)<=i.EPSLN&&Math.abs(l+this.lat0)<=i.EPSLN?(t.x=0/0,t.y=0/0,t):this.sphere?(s=2*this.k0/(1+this.sinlat0*u+this.coslat0*p*Math.cos(c)),t.x=this.a*s*p*Math.sin(c)+this.x0,t.y=this.a*s*(this.coslat0*u-this.sinlat0*p*Math.cos(c))+this.y0,t):(a=2*Math.atan(this.ssfn_(l,u,this.e))-i.HALF_PI,e=Math.cos(a),h=Math.sin(a),Math.abs(this.coslat0)<=i.EPSLN?(n=i.tsfnz(this.e,l*this.con,this.con*u),r=2*this.a*this.k0*n/this.cons,t.x=this.x0+r*Math.sin(o-this.long0),t.y=this.y0-this.con*r*Math.cos(o-this.long0),t):(Math.abs(this.sinlat0)0?i.adjust_lon(this.long0+Math.atan2(t.x,-1*t.y)):i.adjust_lon(this.long0+Math.atan2(t.x,t.y)):i.adjust_lon(this.long0+Math.atan2(t.x*Math.sin(o),r*this.coslat0*Math.cos(o)-t.y*this.sinlat0*Math.sin(o))),t.x=s,t.y=a,t)}if(Math.abs(this.coslat0)<=i.EPSLN){if(r<=i.EPSLN)return a=this.lat0,s=this.long0,t.x=s,t.y=a,t;t.x*=this.con,t.y*=this.con,h=r*this.cons/(2*this.a*this.k0),a=this.con*i.phi2z(this.e,h),s=this.con*i.adjust_lon(this.con*this.long0+Math.atan2(t.x,-1*t.y))}else e=2*Math.atan(r*this.cosX0/(2*this.a*this.k0*this.ms1)),s=this.long0,r<=i.EPSLN?n=this.X0:(n=Math.asin(Math.cos(e)*this.sinX0+t.y*Math.sin(e)*this.cosX0/r),s=i.adjust_lon(this.long0+Math.atan2(t.x*Math.sin(e),r*this.cosX0*Math.cos(e)-t.y*this.sinX0*Math.sin(e)))),a=-1*i.phi2z(this.e,Math.tan(.5*(i.HALF_PI+n)));return t.x=s,t.y=a,t},s.names=["stere"]}),i("proj4/projCode/somerc",["require","exports","module"],function(t,s){s.init=function(){var t=this.lat0;this.lambda0=this.long0;var s=Math.sin(t),i=this.a,a=this.rf,h=1/a,e=2*h-Math.pow(h,2),n=this.e=Math.sqrt(e);this.R=this.k0*i*Math.sqrt(1-e)/(1-e*Math.pow(s,2)),this.alpha=Math.sqrt(1+e/(1-e)*Math.pow(Math.cos(t),4)),this.b0=Math.asin(s/this.alpha);var r=Math.log(Math.tan(Math.PI/4+this.b0/2)),o=Math.log(Math.tan(Math.PI/4+t/2)),l=Math.log((1+n*s)/(1-n*s));this.K=r-this.alpha*o+this.alpha*n/2*l},s.forward=function(t){var s=Math.log(Math.tan(Math.PI/4-t.y/2)),i=this.e/2*Math.log((1+this.e*Math.sin(t.y))/(1-this.e*Math.sin(t.y))),a=-this.alpha*(s+i)+this.K,h=2*(Math.atan(Math.exp(a))-Math.PI/4),e=this.alpha*(t.x-this.lambda0),n=Math.atan(Math.sin(e)/(Math.sin(this.b0)*Math.tan(h)+Math.cos(this.b0)*Math.cos(e))),r=Math.asin(Math.cos(this.b0)*Math.sin(h)-Math.sin(this.b0)*Math.cos(h)*Math.cos(e));return t.y=this.R/2*Math.log((1+Math.sin(r))/(1-Math.sin(r)))+this.y0,t.x=this.R*n+this.x0,t},s.inverse=function(t){for(var s=t.x-this.x0,i=t.y-this.y0,a=s/this.R,h=2*(Math.atan(Math.exp(i/this.R))-Math.PI/4),e=Math.asin(Math.cos(this.b0)*Math.sin(h)+Math.sin(this.b0)*Math.cos(h)*Math.cos(a)),n=Math.atan(Math.sin(a)/(Math.cos(this.b0)*Math.cos(a)-Math.sin(this.b0)*Math.tan(h))),r=this.lambda0+n/this.alpha,o=0,l=e,u=-1e3,p=0;Math.abs(l-u)>1e-7;){if(++p>20)return;o=1/this.alpha*(Math.log(Math.tan(Math.PI/4+e/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(l))/2)),u=l,l=2*Math.atan(Math.exp(o))-Math.PI/2}return t.x=r,t.y=l,t},s.names=["somerc"]}),i("proj4/projCode/omerc",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var t=Math.sin(this.lat0),s=Math.cos(this.lat0),a=this.e*t;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(s,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-a*a);var h=i.tsfnz(this.e,this.lat0,t),e=this.bl/s*Math.sqrt((1-this.es)/(1-a*a));1>e*e&&(e=1);var n,r;if(isNaN(this.longc)){var o=i.tsfnz(this.e,this.lat1,Math.sin(this.lat1)),l=i.tsfnz(this.e,this.lat2,Math.sin(this.lat2));this.el=this.lat0>=0?(e+Math.sqrt(e*e-1))*Math.pow(h,this.bl):(e-Math.sqrt(e*e-1))*Math.pow(h,this.bl);var u=Math.pow(o,this.bl),p=Math.pow(l,this.bl);n=this.el/u,r=.5*(n-1/n);var c=(this.el*this.el-p*u)/(this.el*this.el+p*u),m=(p-u)/(p+u),M=i.adjust_lon(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(c*Math.tan(.5*this.bl*M)/m)/this.bl,this.long0=i.adjust_lon(this.long0);var f=i.adjust_lon(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*f)/r),this.alpha=Math.asin(e*Math.sin(this.gamma0))}else n=this.lat0>=0?e+Math.sqrt(e*e-1):e-Math.sqrt(e*e-1),this.el=n*Math.pow(h,this.bl),r=.5*(n-1/n),this.gamma0=Math.asin(Math.sin(this.alpha)/e),this.long0=this.longc-Math.asin(r*Math.tan(this.gamma0))/this.bl;this.uc=this.no_off?0:this.lat0>=0?this.al/this.bl*Math.atan2(Math.sqrt(e*e-1),Math.cos(this.alpha)):-1*this.al/this.bl*Math.atan2(Math.sqrt(e*e-1),Math.cos(this.alpha))},s.forward=function(t){var s,a,h,e=t.x,n=t.y,r=i.adjust_lon(e-this.long0);if(Math.abs(Math.abs(n)-i.HALF_PI)<=i.EPSLN)h=n>0?-1:1,a=this.al/this.bl*Math.log(Math.tan(i.FORTPI+.5*h*this.gamma0)),s=-1*h*i.HALF_PI*this.al/this.bl;else{var o=i.tsfnz(this.e,n,Math.sin(n)),l=this.el/Math.pow(o,this.bl),u=.5*(l-1/l),p=.5*(l+1/l),c=Math.sin(this.bl*r),m=(u*Math.sin(this.gamma0)-c*Math.cos(this.gamma0))/p;a=Math.abs(Math.abs(m)-1)<=i.EPSLN?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-m)/(1+m))/this.bl,s=Math.abs(Math.cos(this.bl*r))<=i.EPSLN?this.al*this.bl*r:this.al*Math.atan2(u*Math.cos(this.gamma0)+c*Math.sin(this.gamma0),Math.cos(this.bl*r))/this.bl}return this.no_rot?(t.x=this.x0+s,t.y=this.y0+a):(s-=this.uc,t.x=this.x0+a*Math.cos(this.alpha)+s*Math.sin(this.alpha),t.y=this.y0+s*Math.cos(this.alpha)-a*Math.sin(this.alpha)),t},s.inverse=function(t){var s,a;this.no_rot?(a=t.y-this.y0,s=t.x-this.x0):(a=(t.x-this.x0)*Math.cos(this.alpha)-(t.y-this.y0)*Math.sin(this.alpha),s=(t.y-this.y0)*Math.cos(this.alpha)+(t.x-this.x0)*Math.sin(this.alpha),s+=this.uc);var h=Math.exp(-1*this.bl*a/this.al),e=.5*(h-1/h),n=.5*(h+1/h),r=Math.sin(this.bl*s/this.al),o=(r*Math.cos(this.gamma0)+e*Math.sin(this.gamma0))/n,l=Math.pow(this.el/Math.sqrt((1+o)/(1-o)),1/this.bl);return Math.abs(o-1)i.EPSLN?Math.log(h/o)/Math.log(e/l):s,isNaN(this.ns)&&(this.ns=s),this.f0=h/(this.ns*Math.pow(e,this.ns)),this.rh=this.a*this.f0*Math.pow(u,this.ns),this.title||(this.title="Lambert Conformal Conic")}},s.forward=function(t){var s=t.x,a=t.y;Math.abs(2*Math.abs(a)-i.PI)<=i.EPSLN&&(a=i.sign(a)*(i.HALF_PI-2*i.EPSLN));var h,e,n=Math.abs(Math.abs(a)-i.HALF_PI);if(n>i.EPSLN)h=i.tsfnz(this.e,a,Math.sin(a)),e=this.a*this.f0*Math.pow(h,this.ns);else{if(n=a*this.ns,0>=n)return null;e=0}var r=this.ns*i.adjust_lon(s-this.long0);return t.x=this.k0*e*Math.sin(r)+this.x0,t.y=this.k0*(this.rh-e*Math.cos(r))+this.y0,t},s.inverse=function(t){var s,a,h,e,n,r=(t.x-this.x0)/this.k0,o=this.rh-(t.y-this.y0)/this.k0;this.ns>0?(s=Math.sqrt(r*r+o*o),a=1):(s=-Math.sqrt(r*r+o*o),a=-1);var l=0;if(0!==s&&(l=Math.atan2(a*r,a*o)),0!==s||this.ns>0){if(a=1/this.ns,h=Math.pow(s/(this.a*this.f0),a),e=i.phi2z(this.e,h),-9999===e)return null}else e=-i.HALF_PI;return n=i.adjust_lon(l/this.ns+this.long0),t.x=n,t.y=e,t},s.names=["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_2SP","lcc"]}),i("proj4/projCode/krovak",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.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},s.forward=function(t){var s,a,h,e,n,r,o,l=t.x,u=t.y,p=i.adjust_lon(l-this.long0);return s=Math.pow((1+this.e*Math.sin(u))/(1-this.e*Math.sin(u)),this.alfa*this.e/2),a=2*(Math.atan(this.k*Math.pow(Math.tan(u/2+this.s45),this.alfa)/s)-this.s45),h=-p*this.alfa,e=Math.asin(Math.cos(this.ad)*Math.sin(a)+Math.sin(this.ad)*Math.cos(a)*Math.cos(h)),n=Math.asin(Math.cos(a)*Math.sin(h)/Math.cos(e)),r=this.n*n,o=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(e/2+this.s45),this.n),t.y=o*Math.cos(r)/1,t.x=o*Math.sin(r)/1,this.czech||(t.y*=-1,t.x*=-1),t},s.inverse=function(t){var s,i,a,h,e,n,r,o,l=t.x;t.x=t.y,t.y=l,this.czech||(t.y*=-1,t.x*=-1),n=Math.sqrt(t.x*t.x+t.y*t.y),e=Math.atan2(t.y,t.x),h=e/Math.sin(this.s0),a=2*(Math.atan(Math.pow(this.ro0/n,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),s=Math.asin(Math.cos(this.ad)*Math.sin(a)-Math.sin(this.ad)*Math.cos(a)*Math.cos(h)),i=Math.asin(Math.cos(a)*Math.sin(h)/Math.cos(s)),t.x=this.long0-i/this.alfa,r=s,o=0;var u=0;do t.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(s/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(r))/(1-this.e*Math.sin(r)),this.e/2))-this.s45),Math.abs(r-t.y)<1e-10&&(o=1),r=t.y,u+=1;while(0===o&&15>u);return u>=15?null:t},s.names=["Krovak","krovak"]}),i("proj4/projCode/cass",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){this.sphere||(this.e0=i.e0fn(this.es),this.e1=i.e1fn(this.es),this.e2=i.e2fn(this.es),this.e3=i.e3fn(this.es),this.ml0=this.a*i.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat0))},s.forward=function(t){var s,a,h=t.x,e=t.y;if(h=i.adjust_lon(h-this.long0),this.sphere)s=this.a*Math.asin(Math.cos(e)*Math.sin(h)),a=this.a*(Math.atan2(Math.tan(e),Math.cos(h))-this.lat0);else{var n=Math.sin(e),r=Math.cos(e),o=i.gN(this.a,this.e,n),l=Math.tan(e)*Math.tan(e),u=h*Math.cos(e),p=u*u,c=this.es*r*r/(1-this.es),m=this.a*i.mlfn(this.e0,this.e1,this.e2,this.e3,e);s=o*u*(1-p*l*(1/6-(8-l+8*c)*p/120)),a=m-this.ml0+o*n/r*p*(.5+(5-l+6*c)*p/24)}return t.x=s+this.x0,t.y=a+this.y0,t},s.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var s,a,h=t.x/this.a,e=t.y/this.a;if(this.sphere){var n=e+this.lat0;s=Math.asin(Math.sin(n)*Math.cos(h)),a=Math.atan2(Math.tan(h),Math.cos(n))}else{var r=this.ml0/this.a+e,o=i.imlfn(r,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(o)-i.HALF_PI)<=i.EPSLN)return t.x=this.long0,t.y=i.HALF_PI,0>e&&(t.y*=-1),t;var l=i.gN(this.a,this.e,Math.sin(o)),u=l*l*l/this.a/this.a*(1-this.es),p=Math.pow(Math.tan(o),2),c=h*this.a/l,m=c*c;s=o-l*Math.tan(o)/u*c*c*(.5-(1+3*p)*c*c/24),a=c*(1-m*(p/3+(1+3*p)*p*m/15))/Math.cos(o)}return t.x=i.adjust_lon(a+this.long0),t.y=i.adjust_lat(s),t},s.names=["Cassini","Cassini_Soldner","cass"]}),i("proj4/projCode/laea",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.S_POLE=1,s.N_POLE=2,s.EQUIT=3,s.OBLIQ=4,s.init=function(){var t=Math.abs(this.lat0);if(this.mode=Math.abs(t-i.HALF_PI)0){var s;switch(this.qp=i.qsfnz(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),s=Math.sin(this.lat0),this.sinb1=i.qsfnz(this.e,s)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*s*s)*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))},s.forward=function(t){var s,a,h,e,n,r,o,l,u,p,c=t.x,m=t.y;if(c=i.adjust_lon(c-this.long0),this.sphere){if(n=Math.sin(m),p=Math.cos(m),h=Math.cos(c),this.mode===this.OBLIQ||this.mode===this.EQUIT){if(a=this.mode===this.EQUIT?1+p*h:1+this.sinph0*n+this.cosph0*p*h,a<=i.EPSLN)return null;a=Math.sqrt(2/a),s=a*p*Math.sin(c),a*=this.mode===this.EQUIT?n:this.cosph0*n-this.sinph0*p*h}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(h=-h),Math.abs(m+this.phi0)=0?(s=(u=Math.sqrt(r))*e,a=h*(this.mode===this.S_POLE?u:-u)):s=a=0}}return t.x=this.a*s+this.x0,t.y=this.a*a+this.y0,t},s.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var s,a,h,e,n,r,o,l=t.x/this.a,u=t.y/this.a;if(this.sphere){var p,c=0,m=0;if(p=Math.sqrt(l*l+u*u),a=.5*p,a>1)return null;switch(a=2*Math.asin(a),(this.mode===this.OBLIQ||this.mode===this.EQUIT)&&(m=Math.sin(a),c=Math.cos(a)),this.mode){case this.EQUIT:a=Math.abs(p)<=i.EPSLN?0:Math.asin(u*m/p),l*=m,u=c*p;break;case this.OBLIQ:a=Math.abs(p)<=i.EPSLN?this.phi0:Math.asin(c*this.sinph0+u*m*this.cosph0/p),l*=m*this.cosph0,u=(c-Math.sin(a)*this.sinph0)*p;break;case this.N_POLE:u=-u,a=i.HALF_PI-a;break;case this.S_POLE:a-=i.HALF_PI}s=0!==u||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(l,u):0}else{if(o=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(l/=this.dd,u*=this.dd,r=Math.sqrt(l*l+u*u),r90&&a*i.R2D<-90&&s*i.R2D>180&&s*i.R2D<-180)return null;var h,e;if(Math.abs(Math.abs(a)-i.HALF_PI)<=i.EPSLN)return null;if(this.sphere)h=this.x0+this.a*this.k0*i.adjust_lon(s-this.long0),e=this.y0+this.a*this.k0*Math.log(Math.tan(i.FORTPI+.5*a));else{var n=Math.sin(a),r=i.tsfnz(this.e,a,n);h=this.x0+this.a*this.k0*i.adjust_lon(s-this.long0),e=this.y0-this.a*this.k0*Math.log(r)}return t.x=h,t.y=e,t},s.inverse=function(t){var s,a,h=t.x-this.x0,e=t.y-this.y0;if(this.sphere)a=i.HALF_PI-2*Math.atan(Math.exp(-e/(this.a*this.k0)));else{var n=Math.exp(-e/(this.a*this.k0));if(a=i.phi2z(this.e,n),-9999===a)return null}return s=i.adjust_lon(this.long0+h/(this.a*this.k0)),t.x=s,t.y=a,t},s.names=["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]}),i("proj4/projCode/aea",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){Math.abs(this.lat1+this.lat2)i.EPSLN?(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)},s.forward=function(t){var s=t.x,a=t.y;this.sin_phi=Math.sin(a),this.cos_phi=Math.cos(a);var h=i.qsfnz(this.e3,this.sin_phi,this.cos_phi),e=this.a*Math.sqrt(this.c-this.ns0*h)/this.ns0,n=this.ns0*i.adjust_lon(s-this.long0),r=e*Math.sin(n)+this.x0,o=this.rh-e*Math.cos(n)+this.y0;return t.x=r,t.y=o,t},s.inverse=function(t){var s,a,h,e,n,r;return t.x-=this.x0,t.y=this.rh-t.y+this.y0,this.ns0>=0?(s=Math.sqrt(t.x*t.x+t.y*t.y),h=1):(s=-Math.sqrt(t.x*t.x+t.y*t.y),h=-1),e=0,0!==s&&(e=Math.atan2(h*t.x,h*t.y)),h=s*this.ns0/this.a,this.sphere?r=Math.asin((this.c-h*h)/(2*this.ns0)):(a=(this.c-h*h)/this.ns0,r=this.phi1z(this.e3,a)),n=i.adjust_lon(e/this.ns0+this.long0),t.x=n,t.y=r,t},s.phi1z=function(t,s){var a,h,e,n,r,o=i.asinz(.5*s);if(t=u;u++)if(a=Math.sin(o),h=Math.cos(o),e=t*a,n=1-e*e,r=.5*n*n/h*(s/(1-l)-a/n+.5/t*Math.log((1-e)/(1+e))),o+=r,Math.abs(r)<=1e-7)return o;return null},s.names=["Albers_Conic_Equal_Area","Albers","aea"]}),i("proj4/projCode/gnom",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),this.infinity_dist=1e3*this.a,this.rc=1},s.forward=function(t){var s,a,h,e,n,r,o,l,u=t.x,p=t.y;return h=i.adjust_lon(u-this.long0),s=Math.sin(p),a=Math.cos(p),e=Math.cos(h),r=this.sin_p14*s+this.cos_p14*a*e,n=1,r>0||Math.abs(r)<=i.EPSLN?(o=this.x0+this.a*n*a*Math.sin(h)/r,l=this.y0+this.a*n*(this.cos_p14*s-this.sin_p14*a*e)/r):(o=this.x0+this.infinity_dist*a*Math.sin(h),l=this.y0+this.infinity_dist*(this.cos_p14*s-this.sin_p14*a*e)),t.x=o,t.y=l,t},s.inverse=function(t){var s,a,h,e,n,r;return t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,(s=Math.sqrt(t.x*t.x+t.y*t.y))?(e=Math.atan2(s,this.rc),a=Math.sin(e),h=Math.cos(e),r=i.asinz(h*this.sin_p14+t.y*a*this.cos_p14/s),n=Math.atan2(t.x*a,s*this.cos_p14*h-t.y*this.sin_p14*a),n=i.adjust_lon(this.long0+n)):(r=this.phic0,n=0),t.x=n,t.y=r,t},s.names=["gnom"]}),i("proj4/projCode/cea",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){this.sphere||(this.k0=i.msfnz(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},s.forward=function(t){var s,a,h=t.x,e=t.y,n=i.adjust_lon(h-this.long0);if(this.sphere)s=this.x0+this.a*n*Math.cos(this.lat_ts),a=this.y0+this.a*Math.sin(e)/Math.cos(this.lat_ts);else{var r=i.qsfnz(this.e,Math.sin(e));s=this.x0+this.a*this.k0*n,a=this.y0+.5*this.a*r/this.k0}return t.x=s,t.y=a,t},s.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var s,a;return this.sphere?(s=i.adjust_lon(this.long0+t.x/this.a/Math.cos(this.lat_ts)),a=Math.asin(t.y/this.a*Math.cos(this.lat_ts))):(a=i.iqsfnz(this.e,2*t.y*this.k0/this.a),s=i.adjust_lon(this.long0+t.x/(this.a*this.k0))),t.x=s,t.y=a,t},s.names=["cea"]}),i("proj4/projCode/eqc",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.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_t||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},s.forward=function(t){var s=t.x,a=t.y,h=i.adjust_lon(s-this.long0),e=i.adjust_lat(a-this.lat0);return t.x=this.x0+this.a*h*this.rc,t.y=this.y0+this.a*e,t},s.inverse=function(t){var s=t.x,a=t.y;return t.x=i.adjust_lon(this.long0+(s-this.x0)/(this.a*this.rc)),t.y=i.adjust_lat(this.lat0+(a-this.y0)/this.a),t},s.names=["Equirectangular","Equidistant_Cylindrical","eqc"]}),i("proj4/projCode/poly",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=i.e0fn(this.es),this.e1=i.e1fn(this.es),this.e2=i.e2fn(this.es),this.e3=i.e3fn(this.es),this.ml0=this.a*i.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat0)},s.forward=function(t){var s,a,h,e=t.x,n=t.y,r=i.adjust_lon(e-this.long0);if(h=r*Math.sin(n),this.sphere)Math.abs(n)<=i.EPSLN?(s=this.a*r,a=-1*this.a*this.lat0):(s=this.a*Math.sin(h)/Math.tan(n),a=this.a*(i.adjust_lat(n-this.lat0)+(1-Math.cos(h))/Math.tan(n)));else if(Math.abs(n)<=i.EPSLN)s=this.a*r,a=-1*this.ml0;else{var o=i.gN(this.a,this.e,Math.sin(n))/Math.tan(n);s=o*Math.sin(h),a=this.a*i.mlfn(this.e0,this.e1,this.e2,this.e3,n)-this.ml0+o*(1-Math.cos(h))}return t.x=s+this.x0,t.y=a+this.y0,t},s.inverse=function(t){var s,a,h,e,n,r,o,l,u;if(h=t.x-this.x0,e=t.y-this.y0,this.sphere)if(Math.abs(e+this.a*this.lat0)<=i.EPSLN)s=i.adjust_lon(h/this.a+this.long0),a=0;else{r=this.lat0+e/this.a,o=h*h/this.a/this.a+r*r,l=r;var p;for(n=i.MAX_ITER;n;--n)if(p=Math.tan(l),u=-1*(r*(l*p+1)-l-.5*(l*l+o)*p)/((l-r)/p-1),l+=u,Math.abs(u)<=i.EPSLN){a=l;break}s=i.adjust_lon(this.long0+Math.asin(h*Math.tan(l)/this.a)/Math.sin(a))}else if(Math.abs(e+this.ml0)<=i.EPSLN)a=0,s=i.adjust_lon(this.long0+h/this.a);else{r=(this.ml0+e)/this.a,o=h*h/this.a/this.a+r*r,l=r;var c,m,M,f,d;for(n=i.MAX_ITER;n;--n)if(d=this.e*Math.sin(l),c=Math.sqrt(1-d*d)*Math.tan(l),m=this.a*i.mlfn(this.e0,this.e1,this.e2,this.e3,l),M=this.e0-2*this.e1*Math.cos(2*l)+4*this.e2*Math.cos(4*l)-6*this.e3*Math.cos(6*l),f=m/this.a,u=(r*(c*f+1)-f-.5*c*(f*f+o))/(this.es*Math.sin(2*l)*(f*f+o-2*r*f)/(4*c)+(r-f)*(c*M-2/Math.sin(2*l))-M),l-=u,Math.abs(u)<=i.EPSLN){a=l;break}c=Math.sqrt(1-this.es*Math.pow(Math.sin(a),2))*Math.tan(a),s=i.adjust_lon(this.long0+Math.asin(h*c/this.a)/Math.sin(a))}return t.x=s,t.y=a,t},s.names=["Polyconic","poly"]}),i("proj4/projCode/nzmg",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.iterations=1,s.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},s.forward=function(t){var s,a=t.x,h=t.y,e=h-this.lat0,n=a-this.long0,r=1e-5*(e/i.SEC_TO_RAD),o=n,l=1,u=0;for(s=1;10>=s;s++)l*=r,u+=this.A[s]*l;var p,c,m=u,M=o,f=1,d=0,_=0,y=0;for(s=1;6>=s;s++)p=f*m-d*M,c=d*m+f*M,f=p,d=c,_=_+this.B_re[s]*f-this.B_im[s]*d,y=y+this.B_im[s]*f+this.B_re[s]*d;return t.x=y*this.a+this.x0,t.y=_*this.a+this.y0,t},s.inverse=function(t){var s,a,h,e=t.x,n=t.y,r=e-this.x0,o=n-this.y0,l=o/this.a,u=r/this.a,p=1,c=0,m=0,M=0;for(s=1;6>=s;s++)a=p*l-c*u,h=c*l+p*u,p=a,c=h,m=m+this.C_re[s]*p-this.C_im[s]*c,M=M+this.C_im[s]*p+this.C_re[s]*c;for(var f=0;f=s;s++)d=y*m-j*M,_=j*m+y*M,y=d,j=_,x+=(s-1)*(this.B_re[s]*y-this.B_im[s]*j),g+=(s-1)*(this.B_im[s]*y+this.B_re[s]*j);y=1,j=0;var v=this.B_re[1],P=this.B_im[1];for(s=2;6>=s;s++)d=y*m-j*M,_=j*m+y*M,y=d,j=_,v+=s*(this.B_re[s]*y-this.B_im[s]*j),P+=s*(this.B_im[s]*y+this.B_re[s]*j);var b=v*v+P*P;m=(x*v+g*P)/b,M=(g*v-x*P)/b}var C=m,S=M,N=1,I=0;for(s=1;9>=s;s++)N*=C,I+=this.D[s]*N;var A=this.lat0+1e5*I*i.SEC_TO_RAD,E=this.long0+S;return t.x=E,t.y=A,t},s.names=["New_Zealand_Map_Grid","nzmg"]}),i("proj4/projCode/mill",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){},s.forward=function(t){var s=t.x,a=t.y,h=i.adjust_lon(s-this.long0),e=this.x0+this.a*h,n=this.y0+1.25*this.a*Math.log(Math.tan(i.PI/4+a/2.5));return t.x=e,t.y=n,t},s.inverse=function(t){t.x-=this.x0,t.y-=this.y0;var s=i.adjust_lon(this.long0+t.x/this.a),a=2.5*(Math.atan(Math.exp(.8*t.y/this.a))-i.PI/4);return t.x=s,t.y=a,t},s.names=["Miller_Cylindrical","mill"]}),i("proj4/projCode/sinu",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){this.sphere?(this.n=1,this.m=0,this.es=0,this.C_y=Math.sqrt((this.m+1)/this.n),this.C_x=this.C_y/(this.m+1)):this.en=i.pj_enfn(this.es)},s.forward=function(t){var s,a,h=t.x,e=t.y;if(h=i.adjust_lon(h-this.long0),this.sphere){if(this.m)for(var n=this.n*Math.sin(e),r=i.MAX_ITER;r;--r){var o=(this.m*e+Math.sin(e)-n)/(this.m+Math.cos(e));if(e-=o,Math.abs(o).999999999999&&(a=.999999999999),s=Math.asin(a);var h=i.adjust_lon(this.long0+t.x/(.900316316158*this.a*Math.cos(s)));h<-i.PI&&(h=-i.PI),h>i.PI&&(h=i.PI),a=(2*s+Math.sin(2*s))/i.PI,Math.abs(a)>1&&(a=1);var e=Math.asin(a);return t.x=h,t.y=e,t},s.names=["Mollweide","moll"]}),i("proj4/projCode/eqdc",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){return Math.abs(this.lat1+this.lat2)=0?(a=Math.sqrt(t.x*t.x+t.y*t.y),s=1):(a=-Math.sqrt(t.x*t.x+t.y*t.y),s=-1);var n=0;if(0!==a&&(n=Math.atan2(s*t.x,s*t.y)),this.sphere)return e=i.adjust_lon(this.long0+n/this.ns),h=i.adjust_lat(this.g-a/this.a),t.x=e,t.y=h,t;var r=this.g-a/this.a;return h=i.imlfn(r,this.e0,this.e1,this.e2,this.e3),e=i.adjust_lon(this.long0+n/this.ns),t.x=e,t.y=h,t},s.names=["Equidistant_Conic","eqdc"]}),i("proj4/projCode/vandg",["require","exports","module","proj4/common"],function(t,s){var i=t("proj4/common");s.init=function(){this.R=this.a},s.forward=function(t){var s,a,h=t.x,e=t.y,n=i.adjust_lon(h-this.long0);Math.abs(e)<=i.EPSLN&&(s=this.x0+this.R*n,a=this.y0);var r=i.asinz(2*Math.abs(e/i.PI));(Math.abs(n)<=i.EPSLN||Math.abs(Math.abs(e)-i.HALF_PI)<=i.EPSLN)&&(s=this.x0,a=e>=0?this.y0+i.PI*this.R*Math.tan(.5*r):this.y0+i.PI*this.R*-Math.tan(.5*r));var o=.5*Math.abs(i.PI/n-n/i.PI),l=o*o,u=Math.sin(r),p=Math.cos(r),c=p/(u+p-1),m=c*c,M=c*(2/u-1),f=M*M,d=i.PI*this.R*(o*(c-f)+Math.sqrt(l*(c-f)*(c-f)-(f+l)*(m-f)))/(f+l);0>n&&(d=-d),s=this.x0+d;var _=l+c;return d=i.PI*this.R*(M*_-o*Math.sqrt((f+l)*(l+1)-_*_))/(f+l),a=e>=0?this.y0+d:this.y0-d,t.x=s,t.y=a,t},s.inverse=function(t){var s,a,h,e,n,r,o,l,u,p,c,m,M;return t.x-=this.x0,t.y-=this.y0,c=i.PI*this.R,h=t.x/c,e=t.y/c,n=h*h+e*e,r=-Math.abs(e)*(1+n),o=r-2*e*e+h*h,l=-2*r+1+2*e*e+n*n,M=e*e/l+(2*o*o*o/l/l/l-9*r*o/l/l)/27,u=(r-o*o/3/l)/l,p=2*Math.sqrt(-u/3),c=3*M/u/p,Math.abs(c)>1&&(c=c>=0?1:-1),m=Math.acos(c)/3,a=t.y>=0?(-p*Math.cos(m+i.PI/3)-o/3/l)*i.PI:-(-p*Math.cos(m+i.PI/3)-o/3/l)*i.PI,s=Math.abs(h)2*i.HALF_PI*this.a)return;return a=s/this.a,h=Math.sin(a),e=Math.cos(a),n=this.long0,Math.abs(s)<=i.EPSLN?r=this.lat0:(r=i.asinz(e*this.sin_p12+t.y*h*this.cos_p12/s),o=Math.abs(this.lat0)-i.HALF_PI,n=Math.abs(o)<=i.EPSLN?this.lat0>=0?i.adjust_lon(this.long0+Math.atan2(t.x,-t.y)):i.adjust_lon(this.long0-Math.atan2(-t.x,t.y)):i.adjust_lon(this.long0+Math.atan2(t.x*h,s*this.cos_p12*e-t.y*this.sin_p12*h))),t.x=n,t.y=r,t}return l=i.e0fn(this.es),u=i.e1fn(this.es),p=i.e2fn(this.es),c=i.e3fn(this.es),Math.abs(this.sin_p12-1)<=i.EPSLN?(m=this.a*i.mlfn(l,u,p,c,i.HALF_PI),s=Math.sqrt(t.x*t.x+t.y*t.y),M=m-s,r=i.imlfn(M/this.a,l,u,p,c),n=i.adjust_lon(this.long0+Math.atan2(t.x,-1*t.y)),t.x=n,t.y=r,t):Math.abs(this.sin_p12+1)<=i.EPSLN?(m=this.a*i.mlfn(l,u,p,c,i.HALF_PI),s=Math.sqrt(t.x*t.x+t.y*t.y),M=s-m,r=i.imlfn(M/this.a,l,u,p,c),n=i.adjust_lon(this.long0+Math.atan2(t.x,t.y)),t.x=n,t.y=r,t):(s=Math.sqrt(t.x*t.x+t.y*t.y),_=Math.atan2(t.x,t.y),f=i.gN(this.a,this.e,this.sin_p12),y=Math.cos(_),j=this.e*this.cos_p12*y,x=-j*j/(1-this.es),g=3*this.es*(1-x)*this.sin_p12*this.cos_p12*y/(1-this.es),v=s/f,P=v-x*(1+x)*Math.pow(v,3)/6-g*(1+3*x)*Math.pow(v,4)/24,b=1-x*P*P/2-v*P*P*P/6,d=Math.asin(this.sin_p12*Math.cos(P)+this.cos_p12*Math.sin(P)*y),n=i.adjust_lon(this.long0+Math.asin(Math.sin(_)*Math.sin(P)/Math.cos(d))),r=Math.atan((1-this.es*b*this.sin_p12/Math.sin(d))*Math.tan(d)/(1-this.es)),t.x=n,t.y=r,t)},s.names=["Azimuthal_Equidistant","aeqd"]}),i("proj4/projCode/longlat",["require","exports","module"],function(t,s){function i(t){return t}s.init=function(){},s.forward=i,s.inverse=i,s.names=["longlat","identity"]}),i("proj4/projections",["require","exports","module","proj4/projCode/tmerc","proj4/projCode/utm","proj4/projCode/sterea","proj4/projCode/stere","proj4/projCode/somerc","proj4/projCode/omerc","proj4/projCode/lcc","proj4/projCode/krovak","proj4/projCode/cass","proj4/projCode/laea","proj4/projCode/merc","proj4/projCode/aea","proj4/projCode/gnom","proj4/projCode/cea","proj4/projCode/eqc","proj4/projCode/poly","proj4/projCode/nzmg","proj4/projCode/mill","proj4/projCode/sinu","proj4/projCode/moll","proj4/projCode/eqdc","proj4/projCode/vandg","proj4/projCode/aeqd","proj4/projCode/longlat"],function(t,s){function i(t,s){var i=e.length;return t.names?(e[i]=t,t.names.forEach(function(t){h[t.toLowerCase()]=i}),this):(console.log(s),!0)}var a=[t("proj4/projCode/tmerc"),t("proj4/projCode/utm"),t("proj4/projCode/sterea"),t("proj4/projCode/stere"),t("proj4/projCode/somerc"),t("proj4/projCode/omerc"),t("proj4/projCode/lcc"),t("proj4/projCode/krovak"),t("proj4/projCode/cass"),t("proj4/projCode/laea"),t("proj4/projCode/merc"),t("proj4/projCode/aea"),t("proj4/projCode/gnom"),t("proj4/projCode/cea"),t("proj4/projCode/eqc"),t("proj4/projCode/poly"),t("proj4/projCode/nzmg"),t("proj4/projCode/mill"),t("proj4/projCode/sinu"),t("proj4/projCode/moll"),t("proj4/projCode/eqdc"),t("proj4/projCode/vandg"),t("proj4/projCode/aeqd"),t("proj4/projCode/longlat")],h={},e=[];s.add=i,s.get=function(t){if(!t)return!1;var s=t.toLowerCase();return"undefined"!=typeof h[s]&&e[h[s]]?e[h[s]]:void 0},s.start=function(){a.forEach(i)}}),i("proj4/Proj",["require","proj4/extend","proj4/common","proj4/defs","proj4/constants","proj4/datum","proj4/projections","proj4/wkt","proj4/projString"],function(t){function s(t){if(!(this instanceof s))return new s(t);this.srsCodeInput=t,this.x0=0,this.y0=0;var a;"string"==typeof t?t in h?(this.deriveConstants(h[t]),i(this,h[t])):t.indexOf("GEOGCS")>=0||t.indexOf("GEOCCS")>=0||t.indexOf("PROJCS")>=0||t.indexOf("LOCAL_CS")>=0?(a=o(t),this.deriveConstants(a),i(this,a)):"+"===t[0]&&(a=l(t),this.deriveConstants(a),i(this,a)):(this.deriveConstants(t),i(this,t)),this.initTransforms(this.projName)}var i=t("proj4/extend"),a=t("proj4/common"),h=t("proj4/defs"),e=t("proj4/constants"),n=t("proj4/datum"),r=t("proj4/projections"),o=t("proj4/wkt"),l=t("proj4/projString");return s.projections=r,s.projections.start(),s.prototype={initTransforms:function(t){var a=s.projections.get(t);if(!a)throw"unknown projection "+t;i(this,a),this.init()},deriveConstants:function(t){if(t.nadgrids&&0===t.nadgrids.length&&(t.nadgrids=null),t.nadgrids){t.grids=t.nadgrids.split(",");var s=null,h=t.grids.length;if(h>0)for(var r=0;h>r;r++){s=t.grids[r];var o=s.split("@");""!==o[o.length-1]&&(t.grids[r]={mandatory:1===o.length,name:o[o.length-1],grid:e.grids[o[o.length-1]]},t.grids[r].mandatory&&!t.grids[r].grid)}}if(t.datumCode&&"none"!==t.datumCode){var l=e.Datum[t.datumCode];l&&(t.datum_params=l.towgs84?l.towgs84.split(","):null,t.ellps=l.ellipse,t.datumName=l.datumName?l.datumName:t.datumCode)}if(!t.a){var u=e.Ellipsoid[t.ellps]?e.Ellipsoid[t.ellps]:e.Ellipsoid.WGS84;i(t,u)}t.rf&&!t.b&&(t.b=(1-1/t.rf)*t.a),(0===t.rf||Math.abs(t.a-t.b)n;n++)e*=t.datum_params[n];if(0===e)return t.a=o,t.es=t.es,a;c=t.datum_params.length>3?s.PJD_7PARAM:s.PJD_3PARAM}return i.datum_type===s.PJD_GRIDSHIFT&&(i.a=s.SRS_WGS84_SEMIMAJOR,i.es=s.SRS_WGS84_ESQUARED),(t.es!==i.es||t.a!==i.a||h(c)||h(i.datum_type))&&(t.geodetic_to_geocentric(a),h(t.datum_type)&&t.geocentric_to_wgs84(a),h(i.datum_type)&&i.geocentric_from_wgs84(a),i.geocentric_to_geodetic(a)),i.datum_type===s.PJD_GRIDSHIFT&&this.apply_gridshift(i,1,a),t.a=o,t.es=l,i.a=u,i.es=p,a}}),i("proj4/adjust_axis",[],function(){return function(t,s,i){var a,h,e,n=i.x,r=i.y,o=i.z||0;for(e=0;3>e;e++)if(!s||2!==e||void 0!==i.z)switch(0===e?(a=n,h="x"):1===e?(a=r,h="y"):(a=o,h="z"),t.axis[e]){case"e":i[h]=a;break;case"w":i[h]=-a;break;case"n":i[h]=a;break;case"s":i[h]=-a;break;case"u":void 0!==i[h]&&(i.z=a);break;case"d":void 0!==i[h]&&(i.z=-a);break;default:return null}return i}}),i("proj4/transform",["require","proj4/common","proj4/datum_transform","proj4/adjust_axis","proj4/Proj"],function(t){var s=t("proj4/common"),i=t("proj4/datum_transform"),a=t("proj4/adjust_axis"),h=t("proj4/Proj");return function e(t,n,r){function o(t,i){return(t.datum.datum_type===s.PJD_3PARAM||t.datum.datum_type===s.PJD_7PARAM)&&"WGS84"!==i.datumCode}var l;return t.datum&&n.datum&&(o(t,n)||o(n,t))&&(l=new h("WGS84"),e(t,l,r),t=l),"enu"!==t.axis&&a(t,!1,r),"longlat"===t.projName?(r.x*=s.D2R,r.y*=s.D2R):(t.to_meter&&(r.x*=t.to_meter,r.y*=t.to_meter),t.inverse(r)),t.from_greenwich&&(r.x+=t.from_greenwich),r=i(t.datum,n.datum,r),n.from_greenwich&&(r.x-=n.from_greenwich),"longlat"===n.projName?(r.x*=s.R2D,r.y*=s.R2D):(n.forward(r),n.to_meter&&(r.x/=n.to_meter,r.y/=n.to_meter)),"enu"!==n.axis&&a(n,!0,r),r}}),i("proj4/core",["require","proj4/Point","proj4/Proj","proj4/transform"],function(t){function s(t,s,i){var h;return Array.isArray(i)?(h=e(t,s,a(i)),3===i.length?[h.x,h.y,h.z]:[h.x,h.y]):e(t,s,i)}function i(t){return t instanceof h?t:t.oProj?t.oProj:h(t)}var a=t("proj4/Point"),h=t("proj4/Proj"),e=t("proj4/transform"),n=h("WGS84");return function(t,a,h){t=i(t);var e,r=!1;return"undefined"==typeof a?(a=t,t=n,r=!0):("undefined"!=typeof a.x||Array.isArray(a))&&(h=a,a=t,t=n,r=!0),a=i(a),h?s(t,a,h):(e={forward:function(i){return s(t,a,i)},inverse:function(i){return s(a,t,i)}},r&&(e.oProj=a),e)}}),i("proj4/version",[],function(){return"1.4.1"}),i("proj4",["require","proj4/core","proj4/Proj","proj4/Point","proj4/defs","proj4/transform","proj4/mgrs","proj4/version"],function(t){var s=t("proj4/core");return s.defaultDatum="WGS84",s.Proj=t("proj4/Proj"),s.WGS84=new s.Proj("WGS84"),s.Point=t("proj4/Point"),s.defs=t("proj4/defs"),s.transform=t("proj4/transform"),s.mgrs=t("proj4/mgrs"),s.version=t("proj4/version"),s}),s("proj4")}); -},{}],72:[function(require,module,exports){ //converter.js var multi = require('multigeojson'); function getCoordString(coords,res,origin) { @@ -5704,26 +213,8 @@ module.exports = { MultiPolygon: multiPolygon }; -},{"multigeojson":2}],73:[function(require,module,exports){ -module.exports = { - mapExtent: [-180,-90,180,90], - mapExtentProjCode: 'EPSG:4326', - mapExtent: [-180,-90,180,90], - inProjCode: 'EPSG:4326', - outProjCode: 'EPSG:4326', - r: 2, - style:"", - proj4jsDefs: { - 'SR-ORG:6864': '+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs', - 'EPSG:4326': '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' - } -}; - -},{}],74:[function(require,module,exports){ +},{"multigeojson":2}],4:[function(require,module,exports){ var extend = require('deep-extend'), - proj4 = require('proj4'), - reproject = require('reproject'), - defaults = require('./defaults.js'), converter = require('./converter.js'); //g2svg as geojson2svg (shorthand) @@ -5731,69 +222,13 @@ var g2svg = function(viewportSize,opt) { if(!viewportSize) return; this.viewportSize = viewportSize; var opt = opt || {}; - extend(defaults,opt); - extend(this,defaults); - var mapExtentProj,inPorj,outProj; - this.reproject = reproject; - if(this.mapExtentProjCode != this.outProjCode) { - if(!this.proj4jsDefs) return; - if(!proj4.defs[this.mapExtentProjCode]) { - if(this.proj4jsDefs[this.mapExtentProjCode]){ - mapExtentProj = proj4.Proj(this.proj4jsDefs[this.mapExtentProjCode]); - } else { - return false; - } - } else { - mapExtentProj = proj4.Proj(this.mapExtentProjCode); - } - if(!proj4.defs[this.outProjCode]) { - if(this.proj4jsDefs[this.outProjCode]){ - outProj = proj4.Proj(this.proj4jsDefs[this.outProjCode]); - } else { - return false; - } - } else { - outProj = proj4.Proj(this.outProjCode); - } - var ll = proj4(mapExtentProj,outProj,[this.mapExtent[0],this.mapExtent[1]]); - var tr = proj4(mapExtentProj,outProj,[this.mapExtent[2],this.mapExtent[3]]); - this.projectedMapExtent = [ll[0],ll[1],tr[0],tr[1]]; - this.mapExtentProj = mapExtentProj; - this.outProj = outProj; - } else { - this.projectedMapExtent = this.mapExtent; - } - this.res = this.calResolution(this.projectedMapExtent,this.viewportSize); - - if(this.inProjCode !== this.outProjCode) { - if(!this.proj4jsDefs) return; - if(!proj4.defs[this.inProjCode]) { - if(this.proj4jsDefs[this.inProjCode]){ - inProj = proj4.Proj(this.proj4jsDefs[this.inProjCode]); - } else { - return false; - } - } else { - inProj = proj4.Proj(this.inProjCode); - } - this.inProj = inProj; - if(!this.outProj) { - if(!proj4.defs[this.outProjCode]) { - if(this.proj4jsDefs[this.outProjCode]){ - outProj = proj4.Proj(this.proj4jsDefs[this.outProjCode]); - } else { - return false; - } - } else { - outProj = proj4.Proj(this.outProjCode); - } - this.outProj = outProj; - } - } + this.mapExtent = opt.mapExtent + || {'left':-180,'bottom':-90,'right':180,'top':90}; + this.res = this.calResolution(this.mapExtent,this.viewportSize); }; g2svg.prototype.calResolution = function(extent,size) { - var xres = (extent[2] - extent[0])/size.width; - var yres = (extent[3] - extent[1])/size.height; + var xres = (extent.right - extent.left)/size.width; + var yres = (extent.top - extent.bottom)/size.height; return Math.max(xres,yres); }; g2svg.prototype.convert = function(geojson,options) { @@ -5831,17 +266,10 @@ g2svg.prototype.convertFeature = function(feature,options) { }; g2svg.prototype.convertGeometry = function(geom,opt) { if(converter[geom.type]) { - var outGeom - ,opt = opt || {}; - - if(this.inProjCode != this.outProjCode) { - outGeom = this.reproject.reproject(geom,this.inProj,this.outProj); - } else { - outGeom = geom; - } + var opt = opt || {}; var explode = opt.hasOwnProperty('explode') ? opt.explode : false; - var paths = converter[geom.type].call(this,outGeom,this.res, - {x:this.projectedMapExtent[0],y:this.projectedMapExtent[3]}, + var paths = converter[geom.type].call(this,geom,this.res, + {x:this.mapExtent.left,y:this.mapExtent.top}, {explode:explode} ); var svgJsons,svgEles; @@ -5894,7 +322,7 @@ var jsonToSvgElement = function(json,type,opt) { module.exports = g2svg; -},{"./converter.js":72,"./defaults.js":73,"deep-extend":1,"proj4":37,"reproject":70}],75:[function(require,module,exports){ +},{"./converter.js":3,"deep-extend":1}],5:[function(require,module,exports){ var extend = require('deep-extend'); var g2svg = require('./instance.js'); var geojson2svg = function(viewportSize,options) { @@ -5909,4 +337,4 @@ if(window) { window.geojson2svg = geojson2svg; } -},{"./instance.js":74,"deep-extend":1}]},{},[75]) \ No newline at end of file +},{"./instance.js":4,"deep-extend":1}]},{},[5]) \ No newline at end of file diff --git a/examples/world.js b/examples/world.js index 79c5358..8d260e2 100644 --- a/examples/world.js +++ b/examples/world.js @@ -3,18 +3,8 @@ //var dataURL = 'http://54.255.134.125:3005/examples/data/CAN.geo.json'; var dataURLPoint = 'http://54.255.134.125:3005/examples/data/capitals.json'; getjson(dataURLPoint,drawGeoJSON); - getjson(dataURLPoly,drawGeoJSON2); + getjson(dataURLPoly,drawGeoJSON); - function handleRequest() { - if (httpRequest.readyState === 4) { - if (httpRequest.status === 200) { - drawGeoJSON(JSON.parse(httpRequest.responseText)); - } else { - console.log('There was a problem with the request.'); - } - } - } - function drawGeoJSON(resp) { console.log('i am drawing'); var geojson = JSON.parse(resp); @@ -31,22 +21,6 @@ svgMap.appendChild(svg); }); } - function drawGeoJSON2(resp) { - console.log('i am drawing2'); - var geojson = JSON.parse(resp); - var svgMap = document.getElementById('map'); - var convertor = geojson2svg({width:800,height:800}); - //var attributes = {style:"stroke:#006600; fill: #00cc00"}; - var attributes = {style:"stroke:#006600; fill: none;stroke-width:1px;"}; - var svgElements = convertor.convert(geojson,{attributes:attributes,output:'svg',explode:false}); - var parser = new DOMParser(); - svgElements.forEach(function(svgStr) { - var el = parser.parseFromString(svgStr, "image/svg+xml"); - //var svg = el.firstChild; - var svg = parseSVG(svgStr); - svgMap.appendChild(svg); - }); - } //parseSVG from http://stackoverflow.com/questions/3642035/jquerys-append-not-working-with-svg-element function parseSVG(s) { var div= document.createElementNS('http://www.w3.org/1999/xhtml', 'div'); diff --git a/package.json b/package.json index 3bcec03..33f2e3f 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,9 @@ }, "devDependencies": { "mocha": "~1.17.1", - "chai": "~1.9.0" + "chai": "~1.9.0", + "parse-svg-path": "~0.1.1", + "expect.js": "~0.3.1", + "jsdom": "~0.10.5" } } diff --git a/src/converter.js b/src/converter.js index dbb14ac..3cbbd75 100644 --- a/src/converter.js +++ b/src/converter.js @@ -8,7 +8,6 @@ function getCoordString(coords,res,origin) { return coordStr.join(' '); } function addAttributes(ele,attributes) { - console.log('adding attr'); var part = ele.split('/>')[0]; for(var key in attributes) { if(attributes[key]) { @@ -19,17 +18,19 @@ function addAttributes(ele,attributes) { } function point(geom,res,origin,opt) { - var forcePath = opt && opt.hasOwnProperty('forcePath') ? opt.forcePath - : false; - var path; - if(forcePath) { - - } else { - path = getCoordString([geom.coordinates],res,origin); - } + var r = opt && opt.r ? opt.r : 1; + var path = 'M' + getCoordString([geom.coordinates],res,origin) + +' m'+ -r+ ',0'+ ' a'+r+','+ r + ' 0 1,1 '+ 2*r + ','+0 + +' a'+r+','+ r + ' 0 1,1 '+ -2*r + ','+0; return [path]; } -function multiPoint(geom,res,origin,attributes) { +function multiPoint(geom,res,origin,opt) { + var explode = opt && opt.hasOwnProperty('explode') ? opt.explode : false; + var paths = multi.explode(geom).map(function(single) { + return point(single,res,origin,opt)[0]; + }); + if(!explode) return [paths.join(' ')] + return paths; } function lineString(geom,res,origin,otp) { @@ -38,7 +39,7 @@ function lineString(geom,res,origin,otp) { return [path]; } function multiLineString(geom,res,origin,opt) { - var explode = opt.hasOwnProperty('explode') ? opt.explode : false; + var explode = opt && opt.hasOwnProperty('explode') ? opt.explode : false; var paths = multi.explode(geom).map(function(single) { return lineString(single,res,origin,opt)[0]; }); @@ -65,7 +66,7 @@ function multiPolygon(geom,res,origin,opt) { var paths = multi.explode(geom).map(function(single) { return polygon(single,res,origin,opt)[0]; }); - if(!explode) return [paths.join(' ').replace('Z','') + 'Z']; + if(!explode) return [paths.join(' ').replace(/Z/g,'') + 'Z']; return paths; } module.exports = { diff --git a/src/defaults.js b/src/defaults.js index 7cbddbb..39a9206 100644 --- a/src/defaults.js +++ b/src/defaults.js @@ -1,13 +1,5 @@ module.exports = { mapExtent: [-180,-90,180,90], - mapExtentProjCode: 'EPSG:4326', - mapExtent: [-180,-90,180,90], - inProjCode: 'EPSG:4326', - outProjCode: 'EPSG:4326', r: 2, style:"", - proj4jsDefs: { - 'SR-ORG:6864': '+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs', - 'EPSG:4326': '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' - } }; diff --git a/src/instance.js b/src/instance.js index 4f7eeac..50d5dbb 100644 --- a/src/instance.js +++ b/src/instance.js @@ -1,7 +1,4 @@ var extend = require('deep-extend'), - proj4 = require('proj4'), - reproject = require('reproject'), - defaults = require('./defaults.js'), converter = require('./converter.js'); //g2svg as geojson2svg (shorthand) @@ -9,69 +6,13 @@ var g2svg = function(viewportSize,opt) { if(!viewportSize) return; this.viewportSize = viewportSize; var opt = opt || {}; - extend(defaults,opt); - extend(this,defaults); - var mapExtentProj,inPorj,outProj; - this.reproject = reproject; - if(this.mapExtentProjCode != this.outProjCode) { - if(!this.proj4jsDefs) return; - if(!proj4.defs[this.mapExtentProjCode]) { - if(this.proj4jsDefs[this.mapExtentProjCode]){ - mapExtentProj = proj4.Proj(this.proj4jsDefs[this.mapExtentProjCode]); - } else { - return false; - } - } else { - mapExtentProj = proj4.Proj(this.mapExtentProjCode); - } - if(!proj4.defs[this.outProjCode]) { - if(this.proj4jsDefs[this.outProjCode]){ - outProj = proj4.Proj(this.proj4jsDefs[this.outProjCode]); - } else { - return false; - } - } else { - outProj = proj4.Proj(this.outProjCode); - } - var ll = proj4(mapExtentProj,outProj,[this.mapExtent[0],this.mapExtent[1]]); - var tr = proj4(mapExtentProj,outProj,[this.mapExtent[2],this.mapExtent[3]]); - this.projectedMapExtent = [ll[0],ll[1],tr[0],tr[1]]; - this.mapExtentProj = mapExtentProj; - this.outProj = outProj; - } else { - this.projectedMapExtent = this.mapExtent; - } - this.res = this.calResolution(this.projectedMapExtent,this.viewportSize); - - if(this.inProjCode !== this.outProjCode) { - if(!this.proj4jsDefs) return; - if(!proj4.defs[this.inProjCode]) { - if(this.proj4jsDefs[this.inProjCode]){ - inProj = proj4.Proj(this.proj4jsDefs[this.inProjCode]); - } else { - return false; - } - } else { - inProj = proj4.Proj(this.inProjCode); - } - this.inProj = inProj; - if(!this.outProj) { - if(!proj4.defs[this.outProjCode]) { - if(this.proj4jsDefs[this.outProjCode]){ - outProj = proj4.Proj(this.proj4jsDefs[this.outProjCode]); - } else { - return false; - } - } else { - outProj = proj4.Proj(this.outProjCode); - } - this.outProj = outProj; - } - } + this.mapExtent = opt.mapExtent + || {'left':-180,'bottom':-90,'right':180,'top':90}; + this.res = this.calResolution(this.mapExtent,this.viewportSize); }; g2svg.prototype.calResolution = function(extent,size) { - var xres = (extent[2] - extent[0])/size.width; - var yres = (extent[3] - extent[1])/size.height; + var xres = (extent.right - extent.left)/size.width; + var yres = (extent.top - extent.bottom)/size.height; return Math.max(xres,yres); }; g2svg.prototype.convert = function(geojson,options) { @@ -109,23 +50,17 @@ g2svg.prototype.convertFeature = function(feature,options) { }; g2svg.prototype.convertGeometry = function(geom,opt) { if(converter[geom.type]) { - var outGeom - ,opt = opt || {}; - - if(this.inProjCode != this.outProjCode) { - outGeom = this.reproject.reproject(geom,this.inProj,this.outProj); - } else { - outGeom = geom; - } - var explode = opt.hasOwnProperty('explode') ? opt.explode : false; - var paths = converter[geom.type].call(this,outGeom,this.res, - {x:this.projectedMapExtent[0],y:this.projectedMapExtent[3]}, - {explode:explode} + var opt = opt || {}; + //var explode = opt.hasOwnProperty('explode') ? opt.explode : false; + var paths = converter[geom.type].call(this,geom, + this.res, + {x:this.mapExtent.left,y:this.mapExtent.top}, + opt ); var svgJsons,svgEles; if(opt.output && opt.output.toLowerCase() == 'svg') { svgJsons = paths.map(function(path) { - return pathToSvgJson(path,geom.type,opt.attributes); + return pathToSvgJson(path,geom.type,opt.attributes,opt); }); svgEles = svgJsons.map(function(json) { return jsonToSvgElement(json,geom.type); @@ -140,11 +75,11 @@ g2svg.prototype.convertGeometry = function(geom,opt) { var pathToSvgJson = function(path,type,attributes,opt) { var svg = {}; var forcePath = opt && opt.hasOwnProperty('forcePath') ? opt.forcePath - : false; - if(type == 'Point' || type == 'MultiPoint' && !forcePath) { + : true; + if((type == 'Point' || type == 'MultiPoint') && !forcePath) { svg['cx'] = path.split(',')[0]; svg['cy'] = path.split(',')[1]; - svg['r'] = opt && opt.r ? opt.r : '2'; + svg['r'] = opt && opt.r ? opt.r : '1'; } else { svg = {d: path}; if(type == 'Polygon' || type == 'MultiPolygon') { @@ -158,9 +93,9 @@ var pathToSvgJson = function(path,type,attributes,opt) { }; var jsonToSvgElement = function(json,type,opt) { var forcePath = opt && opt.hasOwnProperty('forcePath') ? opt.forcePath - : false; + : true; var ele =''] + geojson: {type:'Point',coordinates:[50,50]}, + path: ["M127.77777777777777,22.22222222222222 m-2,0 a2,2 0 1,1 4,0 a2,2 0 1,1 -4,0"], + svg: [''] }, { type: 'LineString', - json: {type:'LineString',coordinates:[[10,10],[15,20],[30,10]]}, - svg: [''] + geojson: {type:'LineString',coordinates:[[10,10],[15,20],[30,10]]}, + path: ['M105.55555555555556,44.44444444444444 108.33333333333333,38.888888888888886 116.66666666666666,44.44444444444444'], + svg: [''] }, { type: 'Polygon', - json:{ + geojson:{ "type": "Polygon", "coordinates": [ [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]] ] }, - svg: [''] + path:['M116.66666666666666,44.44444444444444 122.22222222222221,27.77777777777778 111.11111111111111,27.77777777777778 105.55555555555556,38.888888888888886 116.66666666666666,44.44444444444444Z'], + svg: [''] }, { type: 'Polygon with hole', - json:{ + geojson:{ "type": "Polygon", "coordinates": [ [[35, 10], [45, 45], [15, 40], [10, 20], [35, 10]], [[20, 30], [35, 35], [30, 20], [20, 30]] ] }, - svg: [''] + path: ['M119.44444444444444,44.44444444444444 125,25 108.33333333333333,27.77777777777778 105.55555555555556,38.888888888888886 119.44444444444444,44.44444444444444 M111.11111111111111,33.333333333333336 119.44444444444444,30.555555555555554 116.66666666666666,38.888888888888886 111.11111111111111,33.333333333333336Z'], + svg: [''] }, - { + /*{ type: 'MultiPoint', - json: { + geojson: { "type": "MultiPoint", "coordinates": [ [10, 40], [40, 30], [20, 20], [30, 10] - ] + ] }, - svg: ['','','',''] - }, + path: [' M105.55555555555556,27.77777777777778 m-2,0 a2,2 0 1,1 4,0 a2,2 0 1,1 -4,0 M122.22222222222221,33.333333333333336 m-2,0 a2,2 0 1,1 4,0 a2,2 0 1,1 -4,0 M111.11111111111111,38.888888888888886 m-2,0 a2,2 0 1,1 4,0 a2,2 0 1,1 -4,0 M116.66666666666666,44.44444444444444 m-2,0 a2,2 0 1,1 4,0 a2,2 0 1,1 -4,0 '], + svg: ['','','',''] + },*/ { type: 'MultiLineString', - json: { + geojson: { "type": "MultiLineString", "coordinates": [ [[10, 10], [20, 20], [10, 40]], [[40, 40], [30, 30], [40, 20], [30, 10]] ] }, - svg:['',''] + path: ['M105.55555555555556,44.44444444444444 111.11111111111111,38.888888888888886 105.55555555555556,27.77777777777778 M122.22222222222221,27.77777777777778 116.66666666666666,33.333333333333336 122.22222222222221,38.888888888888886 116.66666666666666,44.44444444444444'], + svg:[''] }, { type: 'MultiPolygon', - json: { + geojson: { "type": "MultiPolygon", "coordinates": [ [ @@ -65,11 +72,12 @@ module.exports = { ] ] }, - svg:['',''] + path: ['M116.66666666666666,38.888888888888886 125,27.77777777777778 105.55555555555556,27.77777777777778 116.66666666666666,38.888888888888886 M108.33333333333333,47.22222222222222 122.22222222222221,44.44444444444444 105.55555555555556,38.888888888888886 102.77777777777777,44.44444444444444 108.33333333333333,47.22222222222222Z'], + svg:[''] }, { type: 'MultiPolygon with holes', - json: { + geojson: { "type": "MultiPolygon", "coordinates": [ [ @@ -81,7 +89,79 @@ module.exports = { ] ] }, - svg:['',''] - } - ] + path: ['M122.22222222222221,27.77777777777778 111.11111111111111,25 125,33.333333333333336 122.22222222222221,27.77777777777778 M111.11111111111111,30.555555555555554 105.55555555555556,33.333333333333336 105.55555555555556,44.44444444444444 116.66666666666666,47.22222222222222 125,38.888888888888886 111.11111111111111,30.555555555555554 M116.66666666666666,38.888888888888886 111.11111111111111,41.666666666666664 111.11111111111111,36.11111111111111 116.66666666666666,38.888888888888886Z'], + svg:[''] + }, + ], + feature: { + type: 'Feature', + geojson: { + type: "Feature", + geometry: { + "type": "MultiLineString", + "coordinates": [ + [[10, 10], [20, 20], [10, 40]], + [[40, 40], [30, 30], [40, 20], [30, 10]] + ] + }, + id: "feature1", + properties: { + prop1: 'val1', + prop2: 23.45 + } + }, + path: ['M105.55555555555556,44.44444444444444 111.11111111111111,38.888888888888886 105.55555555555556,27.77777777777778 M122.22222222222221,27.77777777777778 116.66666666666666,33.333333333333336 122.22222222222221,38.888888888888886 116.66666666666666,44.44444444444444'], + svg:[''] + }, + featureCollection: { + type: 'FeatureCollection', + geojson: { + "type": "FeatureCollection", + "features": [ + /*{ + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [102.0, 0.6] + }, + "properties": { + "prop0": "value0" + } + },*/ + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] + ] + }, + "properties": { + "prop1": 0.0, + "prop0": "value0" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], + [100.0, 0.0] + ] + ] + }, + "properties": { + "prop1": { + "this": "that" + }, + "prop0": "value0" + } + } + ] + }, + path: ['M156.66666666666666,50 157.22222222222223,49.44444444444444 157.77777777777777,50 158.33333333333334,49.44444444444444', 'M155.55555555555554,50 156.11111111111111,50 156.11111111111111,49.44444444444444 155.55555555555554,49.44444444444444 155.55555555555554,50Z'], + svg: ['',''] + } }