{"version":3,"file":"brcatlas.min.umd.js","sources":["../src/svgCoords.js","../src/dataAccess.js","../src/constants.js","../node_modules/micromodal/dist/micromodal.es.js","../src/svgOptsDialog.js","../src/svgImages.js","../node_modules/proj4/lib/constants/values.js","../node_modules/proj4/lib/constants/PrimeMeridian.js","../node_modules/proj4/lib/constants/units.js","../node_modules/proj4/lib/match.js","../node_modules/proj4/lib/projString.js","../node_modules/wkt-parser/parser.js","../node_modules/wkt-parser/process.js","../node_modules/wkt-parser/index.js","../node_modules/proj4/lib/defs.js","../node_modules/proj4/lib/global.js","../node_modules/proj4/lib/parseCode.js","../node_modules/proj4/lib/extend.js","../node_modules/proj4/lib/common/msfnz.js","../node_modules/proj4/lib/common/sign.js","../node_modules/proj4/lib/common/adjust_lon.js","../node_modules/proj4/lib/common/tsfnz.js","../node_modules/proj4/lib/common/phi2z.js","../node_modules/proj4/lib/projections/longlat.js","../node_modules/proj4/lib/projections.js","../node_modules/proj4/lib/projections/merc.js","../node_modules/proj4/lib/constants/Ellipsoid.js","../node_modules/proj4/lib/constants/Datum.js","../node_modules/proj4/lib/nadgrid.js","../node_modules/proj4/lib/Proj.js","../node_modules/proj4/lib/deriveConstants.js","../node_modules/proj4/lib/datum.js","../node_modules/proj4/lib/datumUtils.js","../node_modules/proj4/lib/datum_transform.js","../node_modules/proj4/lib/adjust_axis.js","../node_modules/proj4/lib/common/toPoint.js","../node_modules/proj4/lib/checkSanity.js","../node_modules/proj4/lib/transform.js","../node_modules/proj4/lib/core.js","../node_modules/mgrs/mgrs.js","../node_modules/proj4/lib/Point.js","../node_modules/proj4/lib/common/pj_enfn.js","../node_modules/proj4/lib/common/pj_mlfn.js","../node_modules/proj4/lib/common/pj_inv_mlfn.js","../node_modules/proj4/lib/projections/tmerc.js","../node_modules/proj4/lib/common/sinh.js","../node_modules/proj4/lib/common/hypot.js","../node_modules/proj4/lib/common/asinhy.js","../node_modules/proj4/lib/common/log1py.js","../node_modules/proj4/lib/common/gatg.js","../node_modules/proj4/lib/common/clens_cmplx.js","../node_modules/proj4/lib/common/cosh.js","../node_modules/proj4/lib/projections/etmerc.js","../node_modules/proj4/lib/common/clens.js","../node_modules/proj4/lib/projections/utm.js","../node_modules/proj4/lib/common/adjust_zone.js","../node_modules/proj4/lib/common/srat.js","../node_modules/proj4/lib/projections/gauss.js","../node_modules/proj4/lib/projections/sterea.js","../node_modules/proj4/lib/projections/stere.js","../node_modules/proj4/lib/projections/somerc.js","../node_modules/proj4/lib/projections/omerc.js","../node_modules/proj4/lib/projections/lcc.js","../node_modules/proj4/lib/projections/krovak.js","../node_modules/proj4/lib/common/mlfn.js","../node_modules/proj4/lib/common/e0fn.js","../node_modules/proj4/lib/common/e1fn.js","../node_modules/proj4/lib/common/e2fn.js","../node_modules/proj4/lib/common/e3fn.js","../node_modules/proj4/lib/common/gN.js","../node_modules/proj4/lib/common/adjust_lat.js","../node_modules/proj4/lib/common/imlfn.js","../node_modules/proj4/lib/projections/cass.js","../node_modules/proj4/lib/common/qsfnz.js","../node_modules/proj4/lib/projections/laea.js","../node_modules/proj4/lib/common/asinz.js","../node_modules/proj4/lib/projections/aea.js","../node_modules/proj4/lib/projections/gnom.js","../node_modules/proj4/lib/projections/cea.js","../node_modules/proj4/lib/common/iqsfnz.js","../node_modules/proj4/lib/projections/eqc.js","../node_modules/proj4/lib/projections/poly.js","../node_modules/proj4/lib/projections/nzmg.js","../node_modules/proj4/lib/projections/mill.js","../node_modules/proj4/lib/projections/sinu.js","../node_modules/proj4/lib/projections/moll.js","../node_modules/proj4/lib/projections/eqdc.js","../node_modules/proj4/lib/projections/vandg.js","../node_modules/proj4/lib/projections/aeqd.js","../node_modules/proj4/lib/projections/ortho.js","../node_modules/proj4/lib/projections/qsc.js","../node_modules/proj4/lib/projections/robin.js","../node_modules/proj4/lib/projections/geocent.js","../node_modules/proj4/lib/projections/tpers.js","../node_modules/proj4/lib/projections/geos.js","../node_modules/proj4/lib/index.js","../node_modules/proj4/projs.js","../node_modules/brc-atlas-bigr/dist/bigr.esm.js","../src/svgDots.js","../src/svgLegend.js","../src/download.js","../src/svgMap.js","../src/leafletMap.js","../src/tagParse.js","../index.js"],"sourcesContent":["/** @module svgCoords */\n\nimport * as d3 from 'd3'\n\n/**\n * @typedef {Object} transOptsSel\n * @property {string} key - there must be at least one, but potentially more, properties\n * on this object, each describing a map 'transformation'.\n */\n\n/**\n * @typedef {Object} transOpts - A 'transformation' options object simply defines the extents of the\n * map, potentially with insets too.\n * @property {string} id - this must match the key by which the object is accessed through\n * the parent object.\n * @property {string} caption - a human readable name for this transformation options object.\n * @property {module:svgCoords~transOptsBounds} bounds - an object defining the extents of the map.\n * @property {Array.} insets - an array of objects defining the inset portions of the map. \n */\n\n/**\n * @typedef {Object} transOptsInset - an object defining an inset for a map, i.e. part of a map\n * which will be displayed in a different location to that in which it is actually found \n * @property {module:svgCoords~transOptsBounds} bounds - an object defining the extents of the inset.\n * @property {number} imageX - a value defining where the inset will be displayed\n * (displaced) on the SVG. If the number is positive it represents the number of \n * pixels the left boundary of the inset will be positioned from the left margin of\n * the SVG. If it is negative, it represents the number of pixels the right boundary\n * of the inset will be positioned from the right boundary of the SVG.\n * @property {number} imageY - a value defining where the inset will be displayed\n * (displaced) on the SVG. If the number is positive it represents the number of \n * pixels the botton boundary of the inset will be positioned from the bottom margin of\n * the SVG. If it is negative, it represents the number of pixels the top boundary\n * of the inset will be positioned from the top boundary of the SVG.\n */\n\n /**\n * @typedef {Object} transOptsBounds - an object defining the extents of the map, \n * or portion of a mpa, in the projection system\n * you want to use (either British Nation Gid, Irish National Grid or UTM 30 N for Channel Islands).\n * properties on this element are xmin, ymin, xmax and ymax.\n * @property {number} xmin - the x value for the lower left corner.\n * @property {number} ymin - the y value for the lower left corner.\n * @property {number} xmax - the x value for the top right corner.\n * @property {number} ymax - the y value for the top right corner.\n */\n\n/**\n * Given a transform options object, describing a bounding rectangle in world coordinates,\n * and a height dimension, this function returns an array of objects - one\n * for each inset described in the transform object - that describe a set of\n * rectangles corresponding to each of the insets. Each object has an origin\n * corresponding to the top-left of the rectangle, a width and a height dimension.\n * The dimensions and coordiates are relative to the height argument. A typical\n * use of these metrics would be to draw an SVG rectagle around an inset.\n * @param {module:svgCoords~transOpts} transOpts - The transformation options object.\n * @param {number} outputHeight - The height, e.g. height in pixels, of an SVG element.\n * @returns {Array}\n */\nfunction getInsetDims(transOpts, outputHeight) {\n\n const outputWidth = widthFromHeight(transOpts, outputHeight)\n const transform = transformFunction(transOpts, outputHeight)\n const insetDims = []\n \n if (transOpts.insets) {\n transOpts.insets.forEach(function(inset) {\n const ll = transform([inset.bounds.xmin, inset.bounds.ymin])\n const ur = transform([inset.bounds.xmax, inset.bounds.ymax])\n const iWidth = ur[0]-ll[0]\n const iHeight = ll[1]-ur[1]\n\n insetDims.push ({\n x: inset.imageX < 0 ? outputWidth - iWidth + inset.imageX : inset.imageX,\n y: inset.imageY < 0 ? - inset.imageY : outputHeight - inset.imageY - iHeight,\n width: iWidth,\n height: iHeight\n })\n })\n }\n return insetDims\n}\n\n/**\n * Given a transform options object, describing a bounding rectangle in world coordinates,\n * and a height dimension, this function returns a width dimension\n * that respects the aspect ratio described by the bounding rectangle.\n * @param {module:svgCoords~transOpts} transOpts - The transformation options object.\n * @param {number} outputHeight - The height, e.g. height in pixels, of an SVG element.\n * @returns {number}\n */\nfunction widthFromHeight(transOpts, outputHeight) {\n const realWidth = transOpts.bounds.xmax - transOpts.bounds.xmin\n const realHeight = transOpts.bounds.ymax - transOpts.bounds.ymin\n return outputHeight * realWidth/realHeight\n}\n\n/**\n * Given a transform options object, describing a bounding rectangle in world coordinates,\n * and a height dimension, this function returns a new function that will accept a\n * point argument - normally describing real world coordinates - and returns a \n * point that is transformed to be within the range 0 - outputHeight (for y)\n * and 0 - outputWidth (for x). This function can be used as input to a d3.geoTransform\n * to provide a transformation to d3.geoPath to draw an SVG path from a geojson file.\n * The transOpts argument is an object which can also describe areas which should\n * displaced in the output. This can be used for displaying islands in an\n * inset, e.g. the Channel Islands.\n * @param {module:svgCoords~transOpts} transOpts - The transformation options object.\n * @param {number} outputHeight - The height, e.g. height in pixels, of an SVG element.\n * @returns {function}\n */\nfunction transformFunction(transOpts, outputHeight) {\n\n const realWidth = transOpts.bounds.xmax - transOpts.bounds.xmin\n const realHeight = transOpts.bounds.ymax - transOpts.bounds.ymin\n const outputWidth = widthFromHeight(transOpts, outputHeight)\n\n return function(p, ignoreInset) {\n const x = p[0]\n const y = p[1]\n let tX, tY\n\n tX = outputWidth * (x-transOpts.bounds.xmin)/realWidth\n tY = outputHeight - outputHeight * (y-transOpts.bounds.ymin)/realHeight\n\n if (!ignoreInset && transOpts.insets && transOpts.insets.length > 0) {\n transOpts.insets.forEach(function(inset) {\n \n if (x >= inset.bounds.xmin && x <= inset.bounds.xmax && y >= inset.bounds.ymin && y <= inset.bounds.ymax) {\n\n const insetX = outputWidth * (inset.bounds.xmin-transOpts.bounds.xmin)/realWidth\n const insetY = outputHeight - outputHeight * (inset.bounds.ymin-transOpts.bounds.ymin)/realHeight\n\n // Coordinates are within bounds on an inset\n // Adjust inset origns - negative are offsets of max inset from max output\n\n let imageX, imageY\n if (inset.imageX < 0 && !transOpts.forTween) {\n imageX = outputWidth + inset.imageX - ((inset.bounds.xmax - inset.bounds.xmin) / realWidth * outputWidth)\n } else {\n imageX=inset.imageX\n }\n if (inset.imageY < 0 && !transOpts.forTween) {\n imageY = outputHeight + inset.imageY - ((inset.bounds.ymax - inset.bounds.ymin) / realHeight * outputHeight)\n } else {\n imageY=inset.imageY\n }\n\n tX = tX - insetX + imageX\n tY = outputHeight - imageY - (insetY - tY) \n }\n })\n }\n return [tX, tY]\n }\n}\n\n/**\n * Given a transform options object, describing a bounding rectangle in world coordinates,\n * and a height dimension, this function returns an object that encapsulates the transformation\n * options and provides additional transformation functionality and other information.\n * @param {module:svgCoords~transOpts} transOpts - The transformation options object.\n * @param {number} outputHeight - The height, e.g. height in pixels, of an SVG element.\n * @returns {Object} transopts - The transformation object.\n * @returns {Object} transopts.params - The transformation options object.\n * @returns {Array} transopts.insetDims - An array of objects defining the position and size of insets.\n * @returns {number} transopts.height - The height, e.g. height in pixels, of the SVG element.\n * @returns {number} transopts.width - The width, e.g. width in pixels, of the SVG element.\n * @returns {function} transopts.point - A function that will take a point object describing real world coordinates and return the SVG coordinates.\n * @returns {function} transopts.d3Path - A function that will take a geoJson path in real world coordinates and return the SVG path.\n */\nexport function createTrans (transOpts, outputHeight) {\n const transform = transformFunction(transOpts, outputHeight)\n return {\n params: transOpts,\n insetDims: getInsetDims(transOpts, outputHeight),\n height: outputHeight,\n width: widthFromHeight(transOpts, outputHeight),\n point: transform,\n d3Path: d3.geoPath()\n .projection(\n d3.geoTransform({\n point: function(x, y) {\n const tP = transform([x,y])\n const tX = tP[0]\n const tY = tP[1]\n this.stream.point(tX, tY)\n }\n })\n )\n }\n}\n\n// Defined insets required for namedTransOpts\nconst boundsChannelIslands_gb = {\n xmin: 337373,\n ymin: -92599,\n xmax: 427671,\n ymax: -6678\n}\nconst boundsNorthernIsles_gb = {\n xmin: 312667,\n ymin: 980030,\n xmax: 475291,\n ymax: 1225003\n}\n\n/** @constant\n * @description This object contains some named objects that are in the correct \n * format to be used as transOpts arguments to some of the functions in this module.\n * Using one of these may save you generating one of your own. The main bounds element\n * indicates the extent of the main map (in real world coordinates). The bounds of\n * inset objects indicate the extent that is to be offset within the map image.\n * The imageX and imageY values of an inset object indicates the position of the offset\n * portion within the map in pixels. Positve x and y values offset the inset from the\n * left and bottom of the image respecitvely. Negative x and y values offset the inset\n * from the right and top of the image respectively.\n * Each transOpts object also has a property called 'id' which must be set to the\n * value used as a key to the object in the parent object. Each also has a\n * property called 'caption' which has a name which can be displayed if offering\n * users a choice between transformation objects.\n *
    \n *
  • namedTransOpts.BI1 is a bounding box, in EPSG:27700, for the \n * British Ilses that includes the Channel Islands in their natural position.\n *
  • namedTransOpts.BI2 is a bounding box, in EPSG:27700, for the \n * British Isles, that doesn't extend as far south as the \n * Channel Islands, but with an inset covering the Channel Isles, \n * offset 25 pixels from the bottom left corner of the output.\n *
  • namedTransOpts.BI3 is a bounding box, in EPSG:27700, for \n * the British Isles, that doesn't extend as far north as the Northern Isles.\n * An inset covering the Northern Isles, is offset 25 pixels from the \n * top right corner of the output.\n *
  • namedTransOpts.BI4 is a bounding box, in EPSG:27700, for \n * the British Isles, that doesn't extend as far south as the \n * Channel Islands or as far north as the Northern Isles. An inset covering \n * the Channel Isles, is offset 25 pixels from the bottom left corner of the output.\n * An inset covering the Northern Isles, is offset 25 pixels from the \n * top right corner of the output.\n *
\n * @type {object}\n*/\nexport const namedTransOpts = {\n BI1: {\n id: 'BI1',\n caption: 'No insets',\n bounds: {\n xmin: -213389,\n ymin: -113239,\n xmax: 702813,\n ymax: 1237242\n },\n },\n BI2: {\n id: 'BI2',\n caption: 'Inset Channel Islands (CI)',\n bounds: {\n xmin: -213389,\n ymin: -9939,\n xmax: 702813,\n ymax: 1237242\n },\n insets: [{\n bounds: boundsChannelIslands_gb,\n imageX: 25,\n imageY: 25\n }]\n },\n BI3: {\n id: 'BI3',\n caption: 'Inset Northern Isles',\n bounds: {\n xmin: -213389,\n ymin: -9939,\n xmax: 702813,\n ymax: 1050000\n },\n insets: [{\n bounds: boundsNorthernIsles_gb,\n imageX: -25,\n imageY: -25\n }]\n },\n BI4: {\n id: 'BI4',\n caption: 'Inset CI & Northern Isles',\n bounds: {\n xmin: -213389,\n ymin: -9939,\n xmax: 702813,\n ymax: 1050000\n },\n insets: [{\n bounds: boundsChannelIslands_gb,\n imageX: 25,\n imageY: 25\n },\n {\n bounds: boundsNorthernIsles_gb,\n imageX: -25,\n imageY: -25\n }]\n }\n}\n\n/**\n * Given both 'from' and 'to' transform options objects, an output height and a\n * 'tween' value between 0 and 1, this function returns a transform option object\n * for which the map bounds, the inset bounds and the inset image position\n * are all interpolated between the 'from' and 'to' objects at a position\n * depending on the value of the tween value. Typically this would then be used\n * to help generate a path transformation to use with D3 to animate transitions\n * between different map transformations. Note that this only works with\n * named transformation objects defined in this library.\n * @param {module:svgCoords~transOpts} from - The 'from' transformation options object.\n * @param {module:svgCoords~transOpts} to - The 'to' transformation options object.\n * @param {number} outputHeight - The height, e.g. height in pixels, of an SVG element.\n * @param {number} tween - Between 0 and 1 indicating the interpolation position.\n * @returns {module:svgCoords~transOpts} - Intermediate transformation options object.\n */\nexport function getTweenTransOpts(from, to, outputHeight, tween){\n \n const fto = copyTransOptsForTween(namedTransOpts[from], outputHeight)\n const tto = copyTransOptsForTween(namedTransOpts[to], outputHeight)\n\n let rto = {\n bounds: {\n xmin: fto.bounds.xmin + (tto.bounds.xmin - fto.bounds.xmin) * tween,\n xmax: fto.bounds.xmax + (tto.bounds.xmax - fto.bounds.xmax) * tween,\n ymin: fto.bounds.ymin + (tto.bounds.ymin - fto.bounds.ymin) * tween,\n ymax: fto.bounds.ymax + (tto.bounds.ymax - fto.bounds.ymax) * tween\n },\n insets: [],\n forTween: true // Means that negative image positions won't be translated by transformFunction\n }\n fto.insets.forEach(function(i,idx){\n rto.insets.push({\n bounds: {\n xmin: i.bounds.xmin + (tto.insets[idx].bounds.xmin - i.bounds.xmin) * tween,\n xmax: i.bounds.xmax + (tto.insets[idx].bounds.xmax - i.bounds.xmax) * tween,\n ymin: i.bounds.ymin + (tto.insets[idx].bounds.ymin - i.bounds.ymin) * tween,\n ymax: i.bounds.ymax + (tto.insets[idx].bounds.ymax - i.bounds.ymax) * tween\n },\n imageX: i.imageX + (tto.insets[idx].imageX - i.imageX) * tween,\n imageY: i.imageY + (tto.insets[idx].imageY - i.imageY) * tween\n })\n })\n return rto\n}\n\nfunction copyTransOptsForTween(transOpts, outputHeight) {\n\n // This function makes a copy of a transformation object. The copy is different\n // from the original in two respects. Firstly the image positions of the insets\n // are expressed as positive numbers (from bottom or left of image)\n // even when expressed as negative offsets (from top or right of image) in the\n // original. Secondly all named insets used in this library are represented in\n // the returned object even if not present in the original. Such insets are\n // given image positions that reflect their real world positions.\n\n const insetDims = getInsetDims(transOpts, outputHeight)\n\n let tto = {\n bounds: {\n xmin: transOpts.bounds.xmin,\n xmax: transOpts.bounds.xmax,\n ymin: transOpts.bounds.ymin,\n ymax: transOpts.bounds.ymax\n },\n insets: []\n }\n if (transOpts.insets){\n transOpts.insets.forEach(function(i, idx){\n const iNew = {\n bounds: {\n xmin: i.bounds.xmin,\n xmax: i.bounds.xmax,\n ymin: i.bounds.ymin,\n ymax: i.bounds.ymax\n },\n }\n // Usng the calculated insetDims translates any negative numbers - used\n // as shorthand for defining position offsets from top or right margin - to \n // positive values from bottom and left.\n iNew.imageX = insetDims[idx].x,\n iNew.imageY = outputHeight - insetDims[idx].y - insetDims[idx].height\n tto.insets.push(iNew)\n })\n }\n\n let insetCi, insetNi\n tto.insets.forEach(function(i){\n if (i.bounds.xmin === boundsChannelIslands_gb.xmin) {\n insetCi = true\n }\n if (i.bounds.xmin === boundsNorthernIsles_gb.xmin) {\n insetNi = true\n }\n })\n\n if (!insetCi) {\n tto.insets.unshift({\n bounds: boundsChannelIslands_gb,\n imageX: (boundsChannelIslands_gb.xmin - tto.bounds.xmin) / (tto.bounds.xmax - tto.bounds.xmin) * widthFromHeight(tto, outputHeight),\n imageY: (boundsChannelIslands_gb.ymin - tto.bounds.ymin) / (tto.bounds.ymax - tto.bounds.ymin) * outputHeight\n })\n }\n\n if (!insetNi) {\n tto.insets.push({\n bounds: boundsNorthernIsles_gb,\n imageX: (boundsNorthernIsles_gb.xmin - tto.bounds.xmin) / (tto.bounds.xmax - tto.bounds.xmin) * widthFromHeight(tto, outputHeight),\n imageY: (boundsNorthernIsles_gb.ymin - tto.bounds.ymin ) / (tto.bounds.ymax - tto.bounds.ymin) * outputHeight\n })\n }\n return tto\n}\n\nexport function getRadiusPixels(transform, precision){\n return Math.abs(transform([300000,300000])[0]-transform([300000+precision/2,300000])[0])\n}","/** @module dataAccess */\n\nimport * as d3 from 'd3'\n\nfunction csvMonad(file) {\n return csvGr(file, 1000)\n}\nfunction csvTetrad(file) {\n return csvGr(file, 2000)\n}\nfunction csvQuadrant(file) {\n return csvGr(file, 5000)\n}\nfunction csvHectad(file) {\n return csvGr(file, 10000)\n}\nfunction csvGr(file, precision) {\n if (file) {\n return new Promise((resolve, reject) => {\n d3.csv(file, function(r) {\n if (r.gr) {\n return({\n gr: r.gr,\n caption: `Grid ref: ${r.gr}`,\n noCaption: `Grid ref: `,\n colour: r.colour,\n shape: r.shape,\n opacity: r.opacity,\n size: r.size\n })\n }\n }).then(function(data) {\n resolve({\n records: data,\n precision: precision,\n })\n }).catch(function(e){\n reject(e)\n })\n })\n } else {\n return Promise.resolve()\n }\n}\n\n/** @constant\n* @description This object has properties corresponding to a number of data access\n* functions that can be used to load data provided in standard formats. There are\n* four functions accessed through the keys listed below.\n*
    \n*
  • Standard monad expects the grid references to be monads (1 km resolution).\n*
  • Standard tetrad expects the grid references to be tetrads (2 km resolution).\n*
  • Standard quadrant expects the grid references to be quadrants (5 km resolution).\n*
  • Standard hectad expects the grid references to be hectads (10 km resolution).\n*
\n* Each of the\n* data accessor functions referenced by these keys takes a single argument which is the path (or URL) of\n* a CSV that contains data in a standard format. The columns which must be present in the \n* CSV are described below (the order is not important).\n*
    \n*
  • gr - the grid referece which must be of the correct precision for the function.\n*
  • shape - describes the shape that will be displayed at that location,\n* valid values are: circle, square, diamond, triangle-up, triangle-down.\n*
  • size - a number between 0 and 1 which will be used as a factor to resize the\n* dot symbol displayed on the map.\n*
  • colour - a colour for the symbol which can be hex format, e.g. #FFA500, \n* RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red.\n*
  • opacity - a number between 0 and 1 used to set the opacity of the symbol\n* (0 is fully transparent and 1 fully opaque).\n*
  • caption - an html string that will be used to update an element identified\n* by the captionId option of an svg or leaflet map when the mouse cursor moves over the\n* element representing this gr on the map.\n*
  • noCaption - an html string that will be used to update an element identified\n* by the captionId option of an svg or leaflet map when the mouse cursor moves out\n* of the element representing this gr on the map.\n*
\n* The following columns are optional:\n*
  • stroke a colour specifying an outline for the symbol which can be hex format, e.g. #FFA500, \n* RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red. If not present, no outline will be drawn.\n* @type {object}\n*/\nexport const dataAccessors = {\n 'Standard monad': csvMonad,\n 'Standard tetrad': csvTetrad,\n 'Standard quadrant': csvQuadrant,\n 'Standard hectad': csvHectad\n}\n\n\n","import pkg from '../package.json'\n\nexport const constants = {\n bigrCdn: 'https://unpkg.com/brc-atlas-bigr/dist',\n thisCdn: `https://cdn.jsdelivr.net/gh/biologicalrecordscentre/brc-atlas@${pkg.version}`\n}\n\n// For testing only\n//constants.thisCdn = ''","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar MicroModal = function () {\n\n var FOCUSABLE_ELEMENTS = ['a[href]', 'area[href]', 'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])', 'select:not([disabled]):not([aria-hidden])', 'textarea:not([disabled]):not([aria-hidden])', 'button:not([disabled]):not([aria-hidden])', 'iframe', 'object', 'embed', '[contenteditable]', '[tabindex]:not([tabindex^=\"-\"])'];\n\n var Modal = /*#__PURE__*/function () {\n function Modal(_ref) {\n var targetModal = _ref.targetModal,\n _ref$triggers = _ref.triggers,\n triggers = _ref$triggers === void 0 ? [] : _ref$triggers,\n _ref$onShow = _ref.onShow,\n onShow = _ref$onShow === void 0 ? function () {} : _ref$onShow,\n _ref$onClose = _ref.onClose,\n onClose = _ref$onClose === void 0 ? function () {} : _ref$onClose,\n _ref$openTrigger = _ref.openTrigger,\n openTrigger = _ref$openTrigger === void 0 ? 'data-micromodal-trigger' : _ref$openTrigger,\n _ref$closeTrigger = _ref.closeTrigger,\n closeTrigger = _ref$closeTrigger === void 0 ? 'data-micromodal-close' : _ref$closeTrigger,\n _ref$openClass = _ref.openClass,\n openClass = _ref$openClass === void 0 ? 'is-open' : _ref$openClass,\n _ref$disableScroll = _ref.disableScroll,\n disableScroll = _ref$disableScroll === void 0 ? false : _ref$disableScroll,\n _ref$disableFocus = _ref.disableFocus,\n disableFocus = _ref$disableFocus === void 0 ? false : _ref$disableFocus,\n _ref$awaitCloseAnimat = _ref.awaitCloseAnimation,\n awaitCloseAnimation = _ref$awaitCloseAnimat === void 0 ? false : _ref$awaitCloseAnimat,\n _ref$awaitOpenAnimati = _ref.awaitOpenAnimation,\n awaitOpenAnimation = _ref$awaitOpenAnimati === void 0 ? false : _ref$awaitOpenAnimati,\n _ref$debugMode = _ref.debugMode,\n debugMode = _ref$debugMode === void 0 ? false : _ref$debugMode;\n\n _classCallCheck(this, Modal);\n\n // Save a reference of the modal\n this.modal = document.getElementById(targetModal); // Save a reference to the passed config\n\n this.config = {\n debugMode: debugMode,\n disableScroll: disableScroll,\n openTrigger: openTrigger,\n closeTrigger: closeTrigger,\n openClass: openClass,\n onShow: onShow,\n onClose: onClose,\n awaitCloseAnimation: awaitCloseAnimation,\n awaitOpenAnimation: awaitOpenAnimation,\n disableFocus: disableFocus\n }; // Register click events only if pre binding eventListeners\n\n if (triggers.length > 0) this.registerTriggers.apply(this, _toConsumableArray(triggers)); // pre bind functions for event listeners\n\n this.onClick = this.onClick.bind(this);\n this.onKeydown = this.onKeydown.bind(this);\n }\n /**\n * Loops through all openTriggers and binds click event\n * @param {array} triggers [Array of node elements]\n * @return {void}\n */\n\n\n _createClass(Modal, [{\n key: \"registerTriggers\",\n value: function registerTriggers() {\n var _this = this;\n\n for (var _len = arguments.length, triggers = new Array(_len), _key = 0; _key < _len; _key++) {\n triggers[_key] = arguments[_key];\n }\n\n triggers.filter(Boolean).forEach(function (trigger) {\n trigger.addEventListener('click', function (event) {\n return _this.showModal(event);\n });\n });\n }\n }, {\n key: \"showModal\",\n value: function showModal() {\n var _this2 = this;\n\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n this.activeElement = document.activeElement;\n this.modal.setAttribute('aria-hidden', 'false');\n this.modal.classList.add(this.config.openClass);\n this.scrollBehaviour('disable');\n this.addEventListeners();\n\n if (this.config.awaitOpenAnimation) {\n var handler = function handler() {\n _this2.modal.removeEventListener('animationend', handler, false);\n\n _this2.setFocusToFirstNode();\n };\n\n this.modal.addEventListener('animationend', handler, false);\n } else {\n this.setFocusToFirstNode();\n }\n\n this.config.onShow(this.modal, this.activeElement, event);\n }\n }, {\n key: \"closeModal\",\n value: function closeModal() {\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var modal = this.modal;\n this.modal.setAttribute('aria-hidden', 'true');\n this.removeEventListeners();\n this.scrollBehaviour('enable');\n\n if (this.activeElement && this.activeElement.focus) {\n this.activeElement.focus();\n }\n\n this.config.onClose(this.modal, this.activeElement, event);\n\n if (this.config.awaitCloseAnimation) {\n var openClass = this.config.openClass; // <- old school ftw\n\n this.modal.addEventListener('animationend', function handler() {\n modal.classList.remove(openClass);\n modal.removeEventListener('animationend', handler, false);\n }, false);\n } else {\n modal.classList.remove(this.config.openClass);\n }\n }\n }, {\n key: \"closeModalById\",\n value: function closeModalById(targetModal) {\n this.modal = document.getElementById(targetModal);\n if (this.modal) this.closeModal();\n }\n }, {\n key: \"scrollBehaviour\",\n value: function scrollBehaviour(toggle) {\n if (!this.config.disableScroll) return;\n var body = document.querySelector('body');\n\n switch (toggle) {\n case 'enable':\n Object.assign(body.style, {\n overflow: ''\n });\n break;\n\n case 'disable':\n Object.assign(body.style, {\n overflow: 'hidden'\n });\n break;\n }\n }\n }, {\n key: \"addEventListeners\",\n value: function addEventListeners() {\n this.modal.addEventListener('touchstart', this.onClick);\n this.modal.addEventListener('click', this.onClick);\n document.addEventListener('keydown', this.onKeydown);\n }\n }, {\n key: \"removeEventListeners\",\n value: function removeEventListeners() {\n this.modal.removeEventListener('touchstart', this.onClick);\n this.modal.removeEventListener('click', this.onClick);\n document.removeEventListener('keydown', this.onKeydown);\n }\n }, {\n key: \"onClick\",\n value: function onClick(event) {\n if (event.target.hasAttribute(this.config.closeTrigger)) {\n this.closeModal(event);\n }\n }\n }, {\n key: \"onKeydown\",\n value: function onKeydown(event) {\n if (event.keyCode === 27) this.closeModal(event); // esc\n\n if (event.keyCode === 9) this.retainFocus(event); // tab\n }\n }, {\n key: \"getFocusableNodes\",\n value: function getFocusableNodes() {\n var nodes = this.modal.querySelectorAll(FOCUSABLE_ELEMENTS);\n return Array.apply(void 0, _toConsumableArray(nodes));\n }\n /**\n * Tries to set focus on a node which is not a close trigger\n * if no other nodes exist then focuses on first close trigger\n */\n\n }, {\n key: \"setFocusToFirstNode\",\n value: function setFocusToFirstNode() {\n var _this3 = this;\n\n if (this.config.disableFocus) return;\n var focusableNodes = this.getFocusableNodes(); // no focusable nodes\n\n if (focusableNodes.length === 0) return; // remove nodes on whose click, the modal closes\n // could not think of a better name :(\n\n var nodesWhichAreNotCloseTargets = focusableNodes.filter(function (node) {\n return !node.hasAttribute(_this3.config.closeTrigger);\n });\n if (nodesWhichAreNotCloseTargets.length > 0) nodesWhichAreNotCloseTargets[0].focus();\n if (nodesWhichAreNotCloseTargets.length === 0) focusableNodes[0].focus();\n }\n }, {\n key: \"retainFocus\",\n value: function retainFocus(event) {\n var focusableNodes = this.getFocusableNodes(); // no focusable nodes\n\n if (focusableNodes.length === 0) return;\n /**\n * Filters nodes which are hidden to prevent\n * focus leak outside modal\n */\n\n focusableNodes = focusableNodes.filter(function (node) {\n return node.offsetParent !== null;\n }); // if disableFocus is true\n\n if (!this.modal.contains(document.activeElement)) {\n focusableNodes[0].focus();\n } else {\n var focusedItemIndex = focusableNodes.indexOf(document.activeElement);\n\n if (event.shiftKey && focusedItemIndex === 0) {\n focusableNodes[focusableNodes.length - 1].focus();\n event.preventDefault();\n }\n\n if (!event.shiftKey && focusableNodes.length > 0 && focusedItemIndex === focusableNodes.length - 1) {\n focusableNodes[0].focus();\n event.preventDefault();\n }\n }\n }\n }]);\n\n return Modal;\n }();\n /**\n * Modal prototype ends.\n * Here on code is responsible for detecting and\n * auto binding event handlers on modal triggers\n */\n // Keep a reference to the opened modal\n\n\n var activeModal = null;\n /**\n * Generates an associative array of modals and it's\n * respective triggers\n * @param {array} triggers An array of all triggers\n * @param {string} triggerAttr The data-attribute which triggers the module\n * @return {array}\n */\n\n var generateTriggerMap = function generateTriggerMap(triggers, triggerAttr) {\n var triggerMap = [];\n triggers.forEach(function (trigger) {\n var targetModal = trigger.attributes[triggerAttr].value;\n if (triggerMap[targetModal] === undefined) triggerMap[targetModal] = [];\n triggerMap[targetModal].push(trigger);\n });\n return triggerMap;\n };\n /**\n * Validates whether a modal of the given id exists\n * in the DOM\n * @param {number} id The id of the modal\n * @return {boolean}\n */\n\n\n var validateModalPresence = function validateModalPresence(id) {\n if (!document.getElementById(id)) {\n console.warn(\"MicroModal: \\u2757Seems like you have missed %c'\".concat(id, \"'\"), 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', 'ID somewhere in your code. Refer example below to resolve it.');\n console.warn(\"%cExample:\", 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', \"
    \"));\n return false;\n }\n };\n /**\n * Validates if there are modal triggers present\n * in the DOM\n * @param {array} triggers An array of data-triggers\n * @return {boolean}\n */\n\n\n var validateTriggerPresence = function validateTriggerPresence(triggers) {\n if (triggers.length <= 0) {\n console.warn(\"MicroModal: \\u2757Please specify at least one %c'micromodal-trigger'\", 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', 'data attribute.');\n console.warn(\"%cExample:\", 'background-color: #f8f9fa;color: #50596c;font-weight: bold;', \"\");\n return false;\n }\n };\n /**\n * Checks if triggers and their corresponding modals\n * are present in the DOM\n * @param {array} triggers Array of DOM nodes which have data-triggers\n * @param {array} triggerMap Associative array of modals and their triggers\n * @return {boolean}\n */\n\n\n var validateArgs = function validateArgs(triggers, triggerMap) {\n validateTriggerPresence(triggers);\n if (!triggerMap) return true;\n\n for (var id in triggerMap) {\n validateModalPresence(id);\n }\n\n return true;\n };\n /**\n * Binds click handlers to all modal triggers\n * @param {object} config [description]\n * @return void\n */\n\n\n var init = function init(config) {\n // Create an config object with default openTrigger\n var options = Object.assign({}, {\n openTrigger: 'data-micromodal-trigger'\n }, config); // Collects all the nodes with the trigger\n\n var triggers = _toConsumableArray(document.querySelectorAll(\"[\".concat(options.openTrigger, \"]\"))); // Makes a mappings of modals with their trigger nodes\n\n\n var triggerMap = generateTriggerMap(triggers, options.openTrigger); // Checks if modals and triggers exist in dom\n\n if (options.debugMode === true && validateArgs(triggers, triggerMap) === false) return; // For every target modal creates a new instance\n\n for (var key in triggerMap) {\n var value = triggerMap[key];\n options.targetModal = key;\n options.triggers = _toConsumableArray(value);\n activeModal = new Modal(options); // eslint-disable-line no-new\n }\n };\n /**\n * Shows a particular modal\n * @param {string} targetModal [The id of the modal to display]\n * @param {object} config [The configuration object to pass]\n * @return {void}\n */\n\n\n var show = function show(targetModal, config) {\n var options = config || {};\n options.targetModal = targetModal; // Checks if modals and triggers exist in dom\n\n if (options.debugMode === true && validateModalPresence(targetModal) === false) return; // clear events in case previous modal wasn't close\n\n if (activeModal) activeModal.removeEventListeners(); // stores reference to active modal\n\n activeModal = new Modal(options); // eslint-disable-line no-new\n\n activeModal.showModal();\n };\n /**\n * Closes the active modal\n * @param {string} targetModal [The id of the modal to close]\n * @return {void}\n */\n\n\n var close = function close(targetModal) {\n targetModal ? activeModal.closeModalById(targetModal) : activeModal.closeModal();\n };\n\n return {\n init: init,\n show: show,\n close: close\n };\n}();\nwindow.MicroModal = MicroModal;\n\nexport default MicroModal;\n","import * as d3 from 'd3'\nimport MicroModal from 'micromodal'\n\nexport function optsDialog(mapid, transOptsSel, transOptsKey, transOptsControl, mapTypesSel, mapTypesKey, mapTypesControl, applyFunction) {\n\n const div1 = d3.select(`body`)\n .append(\"div\")\n .classed(\"modal micromodal-slide brc-atlas-map-opts\", true)\n .attr(\"id\", `mapOptsModal-${mapid}`)\n .attr(\"aria-hidden\", \"true\")\n\n const div2 = div1.append(\"div\")\n .classed(\"modal__overlay\", true)\n .attr(\"tabindex\", \"-1\")\n .attr(\"data-micromodal-close\", \"\")\n\n const div3 = div2.append(\"div\")\n .classed(\"modal__container\", true)\n .attr(\"role\", \"dialog\")\n .attr(\"aria-modal\", \"true\")\n .attr(\"aria-labelledby\", `mapOptsModal-${mapid}-title`)\n\n const header = div3.append(\"header\")\n .classed(\"modal__header\", true)\n\n header.append(\"h2\")\n .classed(\"modal__title\", true)\n .attr(\"id\", `mapOptsModal-${mapid}-title`)\n .text(\"Map options\")\n\n header.append(\"button\")\n .classed(\"modal__close\", true)\n .attr(\"aria-label\", \"Close modal\")\n .attr(\"data-micromodal-close\", \"\")\n\n const main = div3.append(\"main\")\n .classed(\"modal__content\", true)\n .attr(\"id\", `mapOptsModal-${mapid}-content`)\n\n transOptsSelection(mapid, main, transOptsSel, transOptsKey, transOptsControl)\n mapTypeSelection(mapid, main, mapTypesSel, mapTypesKey, mapTypesControl)\n\n const footer = div3.append(\"main\")\n .classed(\"modal__footer\", true)\n\n const apply = footer.append(\"button\")\n .classed(\"modal__btn modal__btn-primary\", true)\n .attr(\"data-micromodal-close\", \"\")\n .text(\"Okay\")\n\n footer.append(\"button\")\n .classed(\"modal__btn\", true)\n .attr(\"data-micromodal-close\", \"\")\n .attr(\"aria-label\", \"Close this dialog window\")\n .text(\"Cancel\")\n\n MicroModal.init()\n\n apply.on(\"click\", () => {\n const ret = {}\n if (transOptsControl && Object.keys(transOptsSel).length > 1) {\n ret.transOptsKey = div1.select(`input[name=\"trans-opts-radio-${mapid}\"]:checked`).node().value\n }\n if (mapTypesControl && Object.keys(mapTypesSel).length > 1) {\n ret.mapTypesKey = div1.select(`input[name=\"map-type-radio-${mapid}\"]:checked`).node().value\n }\n applyFunction(ret) \n })\n}\n\nexport function showOptsDialog(mapid, mapTypesKey, transOptsSel, transOptsKey){\n\n if (document.getElementById(`trans-opts-radio-${mapid}-${transOptsKey}`)) {\n document.getElementById(`trans-opts-radio-${mapid}-${transOptsKey}`).checked = true\n }\n const id = mapTypesKey.replace(/ /g,'')\n if (document.getElementById(`map-type-radio-${mapid}-${id}`)) {\n document.getElementById(`map-type-radio-${mapid}-${id}`).checked = true\n }\n MicroModal.show(`mapOptsModal-${mapid}`)\n}\n\nfunction transOptsSelection(mapid, el, transOptsSel, transOptsKey, transOptsControl) {\n if (transOptsControl && Object.keys(transOptsSel).length > 1) {\n el.append(\"h3\").text(\"Extent & view\")\n Object.keys(transOptsSel).forEach(k => {\n const radio = el.append(\"input\")\n .attr(\"type\", \"radio\")\n .attr(\"id\", `trans-opts-radio-${mapid}-${k}`)\n .attr(\"name\", `trans-opts-radio-${mapid}`)\n .attr(\"value\", k)\n el.append(\"label\")\n .attr(\"for\", `trans-opts-radio-${mapid}-${k}`)\n .text(transOptsSel[k].caption)\n\n if (k === transOptsKey) {\n radio.attr(\"checked\", \"checked\")\n }\n if (k !== Object.keys(transOptsSel)[Object.keys(transOptsSel).length-1]) {\n el.append(\"br\")\n }\n })\n }\n}\n\nfunction mapTypeSelection(mapid, el, mapTypesSel, mapTypesKey, mapTypesControl) {\n \n if (mapTypesControl && Object.keys(mapTypesSel).length > 1) {\n el.append(\"h3\").text(\"Map information type\")\n Object.keys(mapTypesSel).forEach(k => {\n const id = k.replace(/ /g,'')\n const radio = el.append(\"input\")\n .attr(\"type\", \"radio\")\n .attr(\"id\", `map-type-radio-${mapid}-${id}`)\n .attr(\"name\", `map-type-radio-${mapid}`)\n .attr(\"value\", k)\n el.append(\"label\")\n .attr(\"for\", `map-type-radio-${mapid}-${id}`)\n .text(k)\n\n if (k === mapTypesKey) {\n radio.attr(\"checked\", \"checked\")\n }\n if (k !== Object.keys(mapTypesSel)[Object.keys(mapTypesSel).length-1]) {\n el.append(\"br\")\n }\n })\n }\n}","import * as d3 from 'd3'\n\nconst basemaps = {}\n\nexport function showImage(mapId, show, gBasemaps, imageFile, worldFile, trans, seaFill) {\n\n // Save the map source details for use with transformImages\n if (!basemaps[mapId] && show) {\n basemaps[mapId] = {\n mapId: mapId,\n imageFile: imageFile,\n worldFile: worldFile\n }\n } \n\n const transId = trans.params.id\n\n // Ensure g element exists for this mapId.\n if (gBasemaps.select(`#basemap-${mapId}`).size() === 0) {\n gBasemaps.append('g').attr('id', `basemap-${mapId}`)\n }\n\n // Hide/show main g element for mapId appropriately\n if (show) {\n gBasemaps.select(`#basemap-${mapId}`).classed('hidden', false)\n } else {\n gBasemaps.select(`#basemap-${mapId}`).classed('hidden', true)\n return\n }\n\n // Ensure g element exists for this mapId & transId\n if (gBasemaps.select(`#basemap-${mapId}-${transId}`).size() === 0) {\n gBasemaps.select(`#basemap-${mapId}`).append('g').attr('id', `basemap-${mapId}-${transId}`) \n }\n\n // Hide all g elements corresponding to different transitions within main mapId g elment\n // except that corresponding to this transID\n gBasemaps.select(`#basemap-${mapId}`).selectAll('g').classed('hidden', true)\n gBasemaps.select(`#basemap-${mapId}-${transId}`).classed('hidden', false)\n \n // Add the images to the map/trans g element if none there already\n if (gBasemaps.select(`#basemap-${mapId}-${transId} Image`).size() === 0) {\n const img = new Image()\n img.onerror = function(e) {\n console.log(imageFile, 'could not be opened.', e)\n }\n img.onload = function() {\n const imageWidth = this.width\n const imageHeight = this.height\n\n fetch(worldFile)\n .then(response => {\n response.text().then(text => {\n const aWrld = text.split('\\n')\n\n const xResolution = Number(aWrld[0])\n const yResolution = Number(aWrld[3]) //negative value\n const minEasting = Number(aWrld[4])\n const maxNorthing = Number(aWrld[5])\n\n const maxEasting = minEasting + imageWidth * xResolution\n const minNorthing = maxNorthing + imageHeight * yResolution\n\n const topLeft = trans.point([minEasting, maxNorthing])\n const topRight = trans.point([maxEasting, maxNorthing])\n const bottomLeft = trans.point([minEasting, minNorthing])\n\n const iInsets = trans.params.insets ? trans.params.insets.length : 0\n for (let i=0; i <= iInsets; i++) {\n let xShift = 0, yShift = 0\n if (i > 0) {\n // Inset\n const bounds = trans.params.insets[i-1].bounds\n const dims = trans.insetDims[i-1]\n const xmid = bounds.xmin + (bounds.xmax - bounds.xmin)/2\n const ymid = bounds.ymin + (bounds.ymax - bounds.ymin)/2\n const xyWithInset = trans.point([xmid, ymid])\n const xyWithNoInset = trans.point([xmid, ymid], true)\n xShift = xyWithInset[0] - xyWithNoInset[0] \n yShift = xyWithInset[1] - xyWithNoInset[1]\n\n const clippath = d3.select('svg defs')\n .append('clipPath').attr('id', `clippath-${mapId}-${transId}-${i}`)\n clippath.append('rect')\n .attr('x', dims.x)\n .attr('y', dims.y)\n .attr('width', dims.width)\n .attr('height', dims.height)\n\n // Add g element to mask out original area of clipPath\n const maskTopLeft = trans.point([bounds.xmin, bounds.ymax], true)\n gBasemaps.select(`#basemap-${mapId}`).append('rect')\n .attr('x', maskTopLeft[0])\n .attr('y', maskTopLeft[1])\n .attr('width', dims.width)\n .attr('height', dims.height)\n .attr('fill', seaFill)\n }\n\n // Changed to use dataURL rather than file path URL so that image can be \n // serialised when using the saveMap method.\n const img = gBasemaps.select(`#basemap-${mapId}-${transId}`).append('image')\n //.attr('xmlns:xlink', \"http://www.w3.org/1999/xlink\")\n .attr('xlink:href', getDataUrl(this)) // xlink:href required to properly use image data URLs in SVG file\n //.attr('href', getDataUrl(this))\n .attr('x', topLeft[0] + xShift)\n .attr('y', topLeft[1] + yShift) \n .attr('width', topRight[0]-topLeft[0])\n .attr('height', bottomLeft[1]-topLeft[1])\n\n if (i > 0) {\n img.attr('clip-path', `url(#clippath-${mapId}-${transId}-${i})`)\n }\n }\n })\n })\n .catch(e => {\n console.log(worldFile, 'could not be opened.', e)\n }) \n }\n // Load the image into image object so that we can get\n // its dimensions.\n img.src = imageFile\n }\n}\n\nfunction getDataUrl(img) {\n // Create canvas\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n // Set width and height\n canvas.width = img.width\n canvas.height = img.height\n // Draw the image - use png format to support background transparency\n ctx.drawImage(img, 0, 0)\n return canvas.toDataURL('image/png')\n}\n\nexport function transformImages(gBasemaps, trans, seaFill) {\n\n Object.keys(basemaps).forEach(k => {\n const b = basemaps[k]\n if (b.imageFile) {\n const hidden = gBasemaps.select(`#basemap-${b.mapId}`).classed('hidden')\n //console.log(b.mapId, !hidden)\n showImage(b.mapId, !hidden, gBasemaps, b.imageFile, b.worldFile, trans, seaFill)\n }\n })\n}\n\nexport function setImagePriorities(gBasemaps, mapIds){\n mapIds.reverse().forEach(mapId => {\n gBasemaps.append('g')\n .attr('id', `basemap-${mapId}`)\n .classed('baseMapHidden', true)\n })\n}","export var PJD_3PARAM = 1;\nexport var PJD_7PARAM = 2;\nexport var PJD_GRIDSHIFT = 3;\nexport var PJD_WGS84 = 4; // WGS84 or equivalent\nexport var PJD_NODATUM = 5; // WGS84 or equivalent\nexport var SRS_WGS84_SEMIMAJOR = 6378137.0; // only used in grid shift transforms\nexport var SRS_WGS84_SEMIMINOR = 6356752.314; // only used in grid shift transforms\nexport var SRS_WGS84_ESQUARED = 0.0066943799901413165; // only used in grid shift transforms\nexport var SEC_TO_RAD = 4.84813681109535993589914102357e-6;\nexport var HALF_PI = Math.PI/2;\n// ellipoid pj_set_ell.c\nexport var SIXTH = 0.1666666666666666667;\n/* 1/6 */\nexport var RA4 = 0.04722222222222222222;\n/* 17/360 */\nexport var RA6 = 0.02215608465608465608;\nexport var EPSLN = 1.0e-10;\n// you'd think you could use Number.EPSILON above but that makes\n// Mollweide get into an infinate loop.\n\nexport var D2R = 0.01745329251994329577;\nexport var R2D = 57.29577951308232088;\nexport var FORTPI = Math.PI/4;\nexport var TWO_PI = Math.PI * 2;\n// SPI is slightly greater than Math.PI, so values that exceed the -180..180\n// degree range by a tiny amount don't get wrapped. This prevents points that\n// have drifted from their original location along the 180th meridian (due to\n// floating point error) from changing their sign.\nexport var SPI = 3.14159265359;\n","var exports = {};\nexport {exports as default};\n\nexports.greenwich = 0.0; //\"0dE\",\nexports.lisbon = -9.131906111111; //\"9d07'54.862\\\"W\",\nexports.paris = 2.337229166667; //\"2d20'14.025\\\"E\",\nexports.bogota = -74.080916666667; //\"74d04'51.3\\\"W\",\nexports.madrid = -3.687938888889; //\"3d41'16.58\\\"W\",\nexports.rome = 12.452333333333; //\"12d27'8.4\\\"E\",\nexports.bern = 7.439583333333; //\"7d26'22.5\\\"E\",\nexports.jakarta = 106.807719444444; //\"106d48'27.79\\\"E\",\nexports.ferro = -17.666666666667; //\"17d40'W\",\nexports.brussels = 4.367975; //\"4d22'4.71\\\"E\",\nexports.stockholm = 18.058277777778; //\"18d3'29.8\\\"E\",\nexports.athens = 23.7163375; //\"23d42'58.815\\\"E\",\nexports.oslo = 10.722916666667; //\"10d43'22.5\\\"E\"\n","export default {\n ft: {to_meter: 0.3048},\n 'us-ft': {to_meter: 1200 / 3937}\n};\n","var ignoredChar = /[\\s_\\-\\/\\(\\)]/g;\nexport default function match(obj, key) {\n if (obj[key]) {\n return obj[key];\n }\n var keys = Object.keys(obj);\n var lkey = key.toLowerCase().replace(ignoredChar, '');\n var i = -1;\n var testkey, processedKey;\n while (++i < keys.length) {\n testkey = keys[i];\n processedKey = testkey.toLowerCase().replace(ignoredChar, '');\n if (processedKey === lkey) {\n return obj[testkey];\n }\n }\n}\n","import {D2R} from './constants/values';\nimport PrimeMeridian from './constants/PrimeMeridian';\nimport units from './constants/units';\nimport match from './match';\n\nexport default function(defData) {\n var self = {};\n var paramObj = defData.split('+').map(function(v) {\n return v.trim();\n }).filter(function(a) {\n return a;\n }).reduce(function(p, a) {\n var split = a.split('=');\n split.push(true);\n p[split[0].toLowerCase()] = split[1];\n return p;\n }, {});\n var paramName, paramVal, paramOutname;\n var params = {\n proj: 'projName',\n datum: 'datumCode',\n rf: function(v) {\n self.rf = parseFloat(v);\n },\n lat_0: function(v) {\n self.lat0 = v * D2R;\n },\n lat_1: function(v) {\n self.lat1 = v * D2R;\n },\n lat_2: function(v) {\n self.lat2 = v * D2R;\n },\n lat_ts: function(v) {\n self.lat_ts = v * D2R;\n },\n lon_0: function(v) {\n self.long0 = v * D2R;\n },\n lon_1: function(v) {\n self.long1 = v * D2R;\n },\n lon_2: function(v) {\n self.long2 = v * D2R;\n },\n alpha: function(v) {\n self.alpha = parseFloat(v) * D2R;\n },\n gamma: function(v) {\n self.rectified_grid_angle = parseFloat(v);\n },\n lonc: function(v) {\n self.longc = v * D2R;\n },\n x_0: function(v) {\n self.x0 = parseFloat(v);\n },\n y_0: function(v) {\n self.y0 = parseFloat(v);\n },\n k_0: function(v) {\n self.k0 = parseFloat(v);\n },\n k: function(v) {\n self.k0 = parseFloat(v);\n },\n a: function(v) {\n self.a = parseFloat(v);\n },\n b: function(v) {\n self.b = parseFloat(v);\n },\n r_a: function() {\n self.R_A = true;\n },\n zone: function(v) {\n self.zone = parseInt(v, 10);\n },\n south: function() {\n self.utmSouth = true;\n },\n towgs84: function(v) {\n self.datum_params = v.split(\",\").map(function(a) {\n return parseFloat(a);\n });\n },\n to_meter: function(v) {\n self.to_meter = parseFloat(v);\n },\n units: function(v) {\n self.units = v;\n var unit = match(units, v);\n if (unit) {\n self.to_meter = unit.to_meter;\n }\n },\n from_greenwich: function(v) {\n self.from_greenwich = v * D2R;\n },\n pm: function(v) {\n var pm = match(PrimeMeridian, v);\n self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R;\n },\n nadgrids: function(v) {\n if (v === '@null') {\n self.datumCode = 'none';\n }\n else {\n self.nadgrids = v;\n }\n },\n axis: function(v) {\n var legalAxis = \"ewnsud\";\n 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) {\n self.axis = v;\n }\n },\n approx: function() {\n self.approx = true;\n }\n };\n for (paramName in paramObj) {\n paramVal = paramObj[paramName];\n if (paramName in params) {\n paramOutname = params[paramName];\n if (typeof paramOutname === 'function') {\n paramOutname(paramVal);\n }\n else {\n self[paramOutname] = paramVal;\n }\n }\n else {\n self[paramName] = paramVal;\n }\n }\n if(typeof self.datumCode === 'string' && self.datumCode !== \"WGS84\"){\n self.datumCode = self.datumCode.toLowerCase();\n }\n return self;\n}\n","export default parseString;\n\nvar NEUTRAL = 1;\nvar KEYWORD = 2;\nvar NUMBER = 3;\nvar QUOTED = 4;\nvar AFTERQUOTE = 5;\nvar ENDED = -1;\nvar whitespace = /\\s/;\nvar latin = /[A-Za-z]/;\nvar keyword = /[A-Za-z84]/;\nvar endThings = /[,\\]]/;\nvar digets = /[\\d\\.E\\-\\+]/;\n// const ignoredChar = /[\\s_\\-\\/\\(\\)]/g;\nfunction Parser(text) {\n if (typeof text !== 'string') {\n throw new Error('not a string');\n }\n this.text = text.trim();\n this.level = 0;\n this.place = 0;\n this.root = null;\n this.stack = [];\n this.currentObject = null;\n this.state = NEUTRAL;\n}\nParser.prototype.readCharicter = function() {\n var char = this.text[this.place++];\n if (this.state !== QUOTED) {\n while (whitespace.test(char)) {\n if (this.place >= this.text.length) {\n return;\n }\n char = this.text[this.place++];\n }\n }\n switch (this.state) {\n case NEUTRAL:\n return this.neutral(char);\n case KEYWORD:\n return this.keyword(char)\n case QUOTED:\n return this.quoted(char);\n case AFTERQUOTE:\n return this.afterquote(char);\n case NUMBER:\n return this.number(char);\n case ENDED:\n return;\n }\n};\nParser.prototype.afterquote = function(char) {\n if (char === '\"') {\n this.word += '\"';\n this.state = QUOTED;\n return;\n }\n if (endThings.test(char)) {\n this.word = this.word.trim();\n this.afterItem(char);\n return;\n }\n throw new Error('havn\\'t handled \"' +char + '\" in afterquote yet, index ' + this.place);\n};\nParser.prototype.afterItem = function(char) {\n if (char === ',') {\n if (this.word !== null) {\n this.currentObject.push(this.word);\n }\n this.word = null;\n this.state = NEUTRAL;\n return;\n }\n if (char === ']') {\n this.level--;\n if (this.word !== null) {\n this.currentObject.push(this.word);\n this.word = null;\n }\n this.state = NEUTRAL;\n this.currentObject = this.stack.pop();\n if (!this.currentObject) {\n this.state = ENDED;\n }\n\n return;\n }\n};\nParser.prototype.number = function(char) {\n if (digets.test(char)) {\n this.word += char;\n return;\n }\n if (endThings.test(char)) {\n this.word = parseFloat(this.word);\n this.afterItem(char);\n return;\n }\n throw new Error('havn\\'t handled \"' +char + '\" in number yet, index ' + this.place);\n};\nParser.prototype.quoted = function(char) {\n if (char === '\"') {\n this.state = AFTERQUOTE;\n return;\n }\n this.word += char;\n return;\n};\nParser.prototype.keyword = function(char) {\n if (keyword.test(char)) {\n this.word += char;\n return;\n }\n if (char === '[') {\n var newObjects = [];\n newObjects.push(this.word);\n this.level++;\n if (this.root === null) {\n this.root = newObjects;\n } else {\n this.currentObject.push(newObjects);\n }\n this.stack.push(this.currentObject);\n this.currentObject = newObjects;\n this.state = NEUTRAL;\n return;\n }\n if (endThings.test(char)) {\n this.afterItem(char);\n return;\n }\n throw new Error('havn\\'t handled \"' +char + '\" in keyword yet, index ' + this.place);\n};\nParser.prototype.neutral = function(char) {\n if (latin.test(char)) {\n this.word = char;\n this.state = KEYWORD;\n return;\n }\n if (char === '\"') {\n this.word = '';\n this.state = QUOTED;\n return;\n }\n if (digets.test(char)) {\n this.word = char;\n this.state = NUMBER;\n return;\n }\n if (endThings.test(char)) {\n this.afterItem(char);\n return;\n }\n throw new Error('havn\\'t handled \"' +char + '\" in neutral yet, index ' + this.place);\n};\nParser.prototype.output = function() {\n while (this.place < this.text.length) {\n this.readCharicter();\n }\n if (this.state === ENDED) {\n return this.root;\n }\n throw new Error('unable to parse string \"' +this.text + '\". State is ' + this.state);\n};\n\nfunction parseString(txt) {\n var parser = new Parser(txt);\n return parser.output();\n}\n","\n\nfunction mapit(obj, key, value) {\n if (Array.isArray(key)) {\n value.unshift(key);\n key = null;\n }\n var thing = key ? {} : obj;\n\n var out = value.reduce(function(newObj, item) {\n sExpr(item, newObj);\n return newObj\n }, thing);\n if (key) {\n obj[key] = out;\n }\n}\n\nexport function sExpr(v, obj) {\n if (!Array.isArray(v)) {\n obj[v] = true;\n return;\n }\n var key = v.shift();\n if (key === 'PARAMETER') {\n key = v.shift();\n }\n if (v.length === 1) {\n if (Array.isArray(v[0])) {\n obj[key] = {};\n sExpr(v[0], obj[key]);\n return;\n }\n obj[key] = v[0];\n return;\n }\n if (!v.length) {\n obj[key] = true;\n return;\n }\n if (key === 'TOWGS84') {\n obj[key] = v;\n return;\n }\n if (key === 'AXIS') {\n if (!(key in obj)) {\n obj[key] = [];\n }\n obj[key].push(v);\n return;\n }\n if (!Array.isArray(key)) {\n obj[key] = {};\n }\n\n var i;\n switch (key) {\n case 'UNIT':\n case 'PRIMEM':\n case 'VERT_DATUM':\n obj[key] = {\n name: v[0].toLowerCase(),\n convert: v[1]\n };\n if (v.length === 3) {\n sExpr(v[2], obj[key]);\n }\n return;\n case 'SPHEROID':\n case 'ELLIPSOID':\n obj[key] = {\n name: v[0],\n a: v[1],\n rf: v[2]\n };\n if (v.length === 4) {\n sExpr(v[3], obj[key]);\n }\n return;\n case 'PROJECTEDCRS':\n case 'PROJCRS':\n case 'GEOGCS':\n case 'GEOCCS':\n case 'PROJCS':\n case 'LOCAL_CS':\n case 'GEODCRS':\n case 'GEODETICCRS':\n case 'GEODETICDATUM':\n case 'EDATUM':\n case 'ENGINEERINGDATUM':\n case 'VERT_CS':\n case 'VERTCRS':\n case 'VERTICALCRS':\n case 'COMPD_CS':\n case 'COMPOUNDCRS':\n case 'ENGINEERINGCRS':\n case 'ENGCRS':\n case 'FITTED_CS':\n case 'LOCAL_DATUM':\n case 'DATUM':\n v[0] = ['name', v[0]];\n mapit(obj, key, v);\n return;\n default:\n i = -1;\n while (++i < v.length) {\n if (!Array.isArray(v[i])) {\n return sExpr(v, obj[key]);\n }\n }\n return mapit(obj, key, v);\n }\n}\n","var D2R = 0.01745329251994329577;\nimport parser from './parser';\nimport {sExpr} from './process';\n\n\n\nfunction rename(obj, params) {\n var outName = params[0];\n var inName = params[1];\n if (!(outName in obj) && (inName in obj)) {\n obj[outName] = obj[inName];\n if (params.length === 3) {\n obj[outName] = params[2](obj[outName]);\n }\n }\n}\n\nfunction d2r(input) {\n return input * D2R;\n}\n\nfunction cleanWKT(wkt) {\n if (wkt.type === 'GEOGCS') {\n wkt.projName = 'longlat';\n } else if (wkt.type === 'LOCAL_CS') {\n wkt.projName = 'identity';\n wkt.local = true;\n } else {\n if (typeof wkt.PROJECTION === 'object') {\n wkt.projName = Object.keys(wkt.PROJECTION)[0];\n } else {\n wkt.projName = wkt.PROJECTION;\n }\n }\n if (wkt.AXIS) {\n var axisOrder = '';\n for (var i = 0, ii = wkt.AXIS.length; i < ii; ++i) {\n var axis = [wkt.AXIS[i][0].toLowerCase(), wkt.AXIS[i][1].toLowerCase()];\n if (axis[0].indexOf('north') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'north')) {\n axisOrder += 'n';\n } else if (axis[0].indexOf('south') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'south')) {\n axisOrder += 's';\n } else if (axis[0].indexOf('east') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'east')) {\n axisOrder += 'e';\n } else if (axis[0].indexOf('west') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'west')) {\n axisOrder += 'w';\n }\n }\n if (axisOrder.length === 2) {\n axisOrder += 'u';\n }\n if (axisOrder.length === 3) {\n wkt.axis = axisOrder;\n }\n }\n if (wkt.UNIT) {\n wkt.units = wkt.UNIT.name.toLowerCase();\n if (wkt.units === 'metre') {\n wkt.units = 'meter';\n }\n if (wkt.UNIT.convert) {\n if (wkt.type === 'GEOGCS') {\n if (wkt.DATUM && wkt.DATUM.SPHEROID) {\n wkt.to_meter = wkt.UNIT.convert*wkt.DATUM.SPHEROID.a;\n }\n } else {\n wkt.to_meter = wkt.UNIT.convert;\n }\n }\n }\n var geogcs = wkt.GEOGCS;\n if (wkt.type === 'GEOGCS') {\n geogcs = wkt;\n }\n if (geogcs) {\n //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){\n // wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R;\n //}\n if (geogcs.DATUM) {\n wkt.datumCode = geogcs.DATUM.name.toLowerCase();\n } else {\n wkt.datumCode = geogcs.name.toLowerCase();\n }\n if (wkt.datumCode.slice(0, 2) === 'd_') {\n wkt.datumCode = wkt.datumCode.slice(2);\n }\n if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') {\n wkt.datumCode = 'nzgd49';\n }\n if (wkt.datumCode === 'wgs_1984' || wkt.datumCode === 'world_geodetic_system_1984') {\n if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') {\n wkt.sphere = true;\n }\n wkt.datumCode = 'wgs84';\n }\n if (wkt.datumCode.slice(-6) === '_ferro') {\n wkt.datumCode = wkt.datumCode.slice(0, - 6);\n }\n if (wkt.datumCode.slice(-8) === '_jakarta') {\n wkt.datumCode = wkt.datumCode.slice(0, - 8);\n }\n if (~wkt.datumCode.indexOf('belge')) {\n wkt.datumCode = 'rnb72';\n }\n if (geogcs.DATUM && geogcs.DATUM.SPHEROID) {\n wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\\_18/, 'clrk');\n if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') {\n wkt.ellps = 'intl';\n }\n\n wkt.a = geogcs.DATUM.SPHEROID.a;\n wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10);\n }\n\n if (geogcs.DATUM && geogcs.DATUM.TOWGS84) {\n wkt.datum_params = geogcs.DATUM.TOWGS84;\n }\n if (~wkt.datumCode.indexOf('osgb_1936')) {\n wkt.datumCode = 'osgb36';\n }\n if (~wkt.datumCode.indexOf('osni_1952')) {\n wkt.datumCode = 'osni52';\n }\n if (~wkt.datumCode.indexOf('tm65')\n || ~wkt.datumCode.indexOf('geodetic_datum_of_1965')) {\n wkt.datumCode = 'ire65';\n }\n if (wkt.datumCode === 'ch1903+') {\n wkt.datumCode = 'ch1903';\n }\n if (~wkt.datumCode.indexOf('israel')) {\n wkt.datumCode = 'isr93';\n }\n }\n if (wkt.b && !isFinite(wkt.b)) {\n wkt.b = wkt.a;\n }\n\n function toMeter(input) {\n var ratio = wkt.to_meter || 1;\n return input * ratio;\n }\n var renamer = function(a) {\n return rename(wkt, a);\n };\n var list = [\n ['standard_parallel_1', 'Standard_Parallel_1'],\n ['standard_parallel_1', 'Latitude of 1st standard parallel'],\n ['standard_parallel_2', 'Standard_Parallel_2'],\n ['standard_parallel_2', 'Latitude of 2nd standard parallel'],\n ['false_easting', 'False_Easting'],\n ['false_easting', 'False easting'],\n ['false-easting', 'Easting at false origin'],\n ['false_northing', 'False_Northing'],\n ['false_northing', 'False northing'],\n ['false_northing', 'Northing at false origin'],\n ['central_meridian', 'Central_Meridian'],\n ['central_meridian', 'Longitude of natural origin'],\n ['central_meridian', 'Longitude of false origin'],\n ['latitude_of_origin', 'Latitude_Of_Origin'],\n ['latitude_of_origin', 'Central_Parallel'],\n ['latitude_of_origin', 'Latitude of natural origin'],\n ['latitude_of_origin', 'Latitude of false origin'],\n ['scale_factor', 'Scale_Factor'],\n ['k0', 'scale_factor'],\n ['latitude_of_center', 'Latitude_Of_Center'],\n ['latitude_of_center', 'Latitude_of_center'],\n ['lat0', 'latitude_of_center', d2r],\n ['longitude_of_center', 'Longitude_Of_Center'],\n ['longitude_of_center', 'Longitude_of_center'],\n ['longc', 'longitude_of_center', d2r],\n ['x0', 'false_easting', toMeter],\n ['y0', 'false_northing', toMeter],\n ['long0', 'central_meridian', d2r],\n ['lat0', 'latitude_of_origin', d2r],\n ['lat0', 'standard_parallel_1', d2r],\n ['lat1', 'standard_parallel_1', d2r],\n ['lat2', 'standard_parallel_2', d2r],\n ['azimuth', 'Azimuth'],\n ['alpha', 'azimuth', d2r],\n ['srsCode', 'name']\n ];\n list.forEach(renamer);\n if (!wkt.long0 && wkt.longc && (wkt.projName === 'Albers_Conic_Equal_Area' || wkt.projName === 'Lambert_Azimuthal_Equal_Area')) {\n wkt.long0 = wkt.longc;\n }\n if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === 'Stereographic_South_Pole' || wkt.projName === 'Polar Stereographic (variant B)')) {\n wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90);\n wkt.lat_ts = wkt.lat1;\n }\n}\nexport default function(wkt) {\n var lisp = parser(wkt);\n var type = lisp.shift();\n var name = lisp.shift();\n lisp.unshift(['name', name]);\n lisp.unshift(['type', type]);\n var obj = {};\n sExpr(lisp, obj);\n cleanWKT(obj);\n return obj;\n}\n","import globals from './global';\nimport parseProj from './projString';\nimport wkt from 'wkt-parser';\n\nfunction defs(name) {\n /*global console*/\n var that = this;\n if (arguments.length === 2) {\n var def = arguments[1];\n if (typeof def === 'string') {\n if (def.charAt(0) === '+') {\n defs[name] = parseProj(arguments[1]);\n }\n else {\n defs[name] = wkt(arguments[1]);\n }\n } else {\n defs[name] = def;\n }\n }\n else if (arguments.length === 1) {\n if (Array.isArray(name)) {\n return name.map(function(v) {\n if (Array.isArray(v)) {\n defs.apply(that, v);\n }\n else {\n defs(v);\n }\n });\n }\n else if (typeof name === 'string') {\n if (name in defs) {\n return defs[name];\n }\n }\n else if ('EPSG' in name) {\n defs['EPSG:' + name.EPSG] = name;\n }\n else if ('ESRI' in name) {\n defs['ESRI:' + name.ESRI] = name;\n }\n else if ('IAU2000' in name) {\n defs['IAU2000:' + name.IAU2000] = name;\n }\n else {\n console.log(name);\n }\n return;\n }\n\n\n}\nglobals(defs);\nexport default defs;\n","export default function(defs) {\n defs('EPSG:4326', \"+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees\");\n defs('EPSG:4269', \"+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees\");\n 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\");\n\n defs.WGS84 = defs['EPSG:4326'];\n defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857\n defs.GOOGLE = defs['EPSG:3857'];\n defs['EPSG:900913'] = defs['EPSG:3857'];\n defs['EPSG:102113'] = defs['EPSG:3857'];\n}\n","import defs from './defs';\nimport wkt from 'wkt-parser';\nimport projStr from './projString';\nimport match from './match';\nfunction testObj(code){\n return typeof code === 'string';\n}\nfunction testDef(code){\n return code in defs;\n}\nvar codeWords = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS','GEOCCS','PROJCS','LOCAL_CS', 'GEODCRS', 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS'];\nfunction testWKT(code){\n return codeWords.some(function (word) {\n return code.indexOf(word) > -1;\n });\n}\nvar codes = ['3857', '900913', '3785', '102113'];\nfunction checkMercator(item) {\n var auth = match(item, 'authority');\n if (!auth) {\n return;\n }\n var code = match(auth, 'epsg');\n return code && codes.indexOf(code) > -1;\n}\nfunction checkProjStr(item) {\n var ext = match(item, 'extension');\n if (!ext) {\n return;\n }\n return match(ext, 'proj4');\n}\nfunction testProj(code){\n return code[0] === '+';\n}\nfunction parse(code){\n if (testObj(code)) {\n //check to see if this is a WKT string\n if (testDef(code)) {\n return defs[code];\n }\n if (testWKT(code)) {\n var out = wkt(code);\n // test of spetial case, due to this being a very common and often malformed\n if (checkMercator(out)) {\n return defs['EPSG:3857'];\n }\n var maybeProjStr = checkProjStr(out);\n if (maybeProjStr) {\n return projStr(maybeProjStr);\n }\n return out;\n }\n if (testProj(code)) {\n return projStr(code);\n }\n }else{\n return code;\n }\n}\n\nexport default parse;\n","export default function(destination, source) {\n destination = destination || {};\n var value, property;\n if (!source) {\n return destination;\n }\n for (property in source) {\n value = source[property];\n if (value !== undefined) {\n destination[property] = value;\n }\n }\n return destination;\n}\n","export default function(eccent, sinphi, cosphi) {\n var con = eccent * sinphi;\n return cosphi / (Math.sqrt(1 - con * con));\n}","export default function(x) {\n return x<0 ? -1 : 1;\n}","\nimport {TWO_PI, SPI} from '../constants/values';\nimport sign from './sign';\n\nexport default function(x) {\n return (Math.abs(x) <= SPI) ? x : (x - (sign(x) * TWO_PI));\n}\n","import {HALF_PI} from '../constants/values';\n\nexport default function(eccent, phi, sinphi) {\n var con = eccent * sinphi;\n var com = 0.5 * eccent;\n con = Math.pow(((1 - con) / (1 + con)), com);\n return (Math.tan(0.5 * (HALF_PI - phi)) / con);\n}\n","import {HALF_PI} from '../constants/values';\n\nexport default function(eccent, ts) {\n var eccnth = 0.5 * eccent;\n var con, dphi;\n var phi = HALF_PI - 2 * Math.atan(ts);\n for (var i = 0; i <= 15; i++) {\n con = eccent * Math.sin(phi);\n dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi;\n phi += dphi;\n if (Math.abs(dphi) <= 0.0000000001) {\n return phi;\n }\n }\n //console.log(\"phi2z has NoConvergence\");\n return -9999;\n}\n","export function init() {\n //no-op for longlat\n}\n\nfunction identity(pt) {\n return pt;\n}\nexport {identity as forward};\nexport {identity as inverse};\nexport var names = [\"longlat\", \"identity\"];\nexport default {\n init: init,\n forward: identity,\n inverse: identity,\n names: names\n};\n","import merc from \"./projections/merc\";\nimport longlat from \"./projections/longlat\";\nvar projs = [merc, longlat];\nvar names = {};\nvar projStore = [];\n\nfunction add(proj, i) {\n var len = projStore.length;\n if (!proj.names) {\n console.log(i);\n return true;\n }\n projStore[len] = proj;\n proj.names.forEach(function(n) {\n names[n.toLowerCase()] = len;\n });\n return this;\n}\n\nexport {add};\n\nexport function get(name) {\n if (!name) {\n return false;\n }\n var n = name.toLowerCase();\n if (typeof names[n] !== 'undefined' && projStore[names[n]]) {\n return projStore[names[n]];\n }\n}\n\nexport function start() {\n projs.forEach(add);\n}\nexport default {\n start: start,\n add: add,\n get: get\n};\n","import msfnz from '../common/msfnz';\n\nimport adjust_lon from '../common/adjust_lon';\nimport tsfnz from '../common/tsfnz';\nimport phi2z from '../common/phi2z';\nimport {FORTPI, R2D, EPSLN, HALF_PI} from '../constants/values';\nexport function init() {\n var con = this.b / this.a;\n this.es = 1 - con * con;\n if(!('x0' in this)){\n this.x0 = 0;\n }\n if(!('y0' in this)){\n this.y0 = 0;\n }\n this.e = Math.sqrt(this.es);\n if (this.lat_ts) {\n if (this.sphere) {\n this.k0 = Math.cos(this.lat_ts);\n }\n else {\n this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));\n }\n }\n else {\n if (!this.k0) {\n if (this.k) {\n this.k0 = this.k;\n }\n else {\n this.k0 = 1;\n }\n }\n }\n}\n\n/* Mercator forward equations--mapping lat,long to x,y\n --------------------------------------------------*/\n\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n // convert to radians\n if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) {\n return null;\n }\n\n var x, y;\n if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {\n return null;\n }\n else {\n if (this.sphere) {\n x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);\n y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat));\n }\n else {\n var sinphi = Math.sin(lat);\n var ts = tsfnz(this.e, lat, sinphi);\n x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);\n y = this.y0 - this.a * this.k0 * Math.log(ts);\n }\n p.x = x;\n p.y = y;\n return p;\n }\n}\n\n/* Mercator inverse equations--mapping x,y to lat/long\n --------------------------------------------------*/\nexport function inverse(p) {\n\n var x = p.x - this.x0;\n var y = p.y - this.y0;\n var lon, lat;\n\n if (this.sphere) {\n lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0)));\n }\n else {\n var ts = Math.exp(-y / (this.a * this.k0));\n lat = phi2z(this.e, ts);\n if (lat === -9999) {\n return null;\n }\n }\n lon = adjust_lon(this.long0 + x / (this.a * this.k0));\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Mercator\", \"Popular Visualisation Pseudo Mercator\", \"Mercator_1SP\", \"Mercator_Auxiliary_Sphere\", \"merc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","var exports = {};\nexport {exports as default};\nexports.MERIT = {\n a: 6378137.0,\n rf: 298.257,\n ellipseName: \"MERIT 1983\"\n};\n\nexports.SGS85 = {\n a: 6378136.0,\n rf: 298.257,\n ellipseName: \"Soviet Geodetic System 85\"\n};\n\nexports.GRS80 = {\n a: 6378137.0,\n rf: 298.257222101,\n ellipseName: \"GRS 1980(IUGG, 1980)\"\n};\n\nexports.IAU76 = {\n a: 6378140.0,\n rf: 298.257,\n ellipseName: \"IAU 1976\"\n};\n\nexports.airy = {\n a: 6377563.396,\n b: 6356256.910,\n ellipseName: \"Airy 1830\"\n};\n\nexports.APL4 = {\n a: 6378137,\n rf: 298.25,\n ellipseName: \"Appl. Physics. 1965\"\n};\n\nexports.NWL9D = {\n a: 6378145.0,\n rf: 298.25,\n ellipseName: \"Naval Weapons Lab., 1965\"\n};\n\nexports.mod_airy = {\n a: 6377340.189,\n b: 6356034.446,\n ellipseName: \"Modified Airy\"\n};\n\nexports.andrae = {\n a: 6377104.43,\n rf: 300.0,\n ellipseName: \"Andrae 1876 (Den., Iclnd.)\"\n};\n\nexports.aust_SA = {\n a: 6378160.0,\n rf: 298.25,\n ellipseName: \"Australian Natl & S. Amer. 1969\"\n};\n\nexports.GRS67 = {\n a: 6378160.0,\n rf: 298.2471674270,\n ellipseName: \"GRS 67(IUGG 1967)\"\n};\n\nexports.bessel = {\n a: 6377397.155,\n rf: 299.1528128,\n ellipseName: \"Bessel 1841\"\n};\n\nexports.bess_nam = {\n a: 6377483.865,\n rf: 299.1528128,\n ellipseName: \"Bessel 1841 (Namibia)\"\n};\n\nexports.clrk66 = {\n a: 6378206.4,\n b: 6356583.8,\n ellipseName: \"Clarke 1866\"\n};\n\nexports.clrk80 = {\n a: 6378249.145,\n rf: 293.4663,\n ellipseName: \"Clarke 1880 mod.\"\n};\n\nexports.clrk80ign = {\n a: 6378249.2,\n b: 6356515,\n rf: 293.4660213,\n ellipseName: \"Clarke 1880 (IGN)\"\n};\n\nexports.clrk58 = {\n a: 6378293.645208759,\n rf: 294.2606763692654,\n ellipseName: \"Clarke 1858\"\n};\n\nexports.CPM = {\n a: 6375738.7,\n rf: 334.29,\n ellipseName: \"Comm. des Poids et Mesures 1799\"\n};\n\nexports.delmbr = {\n a: 6376428.0,\n rf: 311.5,\n ellipseName: \"Delambre 1810 (Belgium)\"\n};\n\nexports.engelis = {\n a: 6378136.05,\n rf: 298.2566,\n ellipseName: \"Engelis 1985\"\n};\n\nexports.evrst30 = {\n a: 6377276.345,\n rf: 300.8017,\n ellipseName: \"Everest 1830\"\n};\n\nexports.evrst48 = {\n a: 6377304.063,\n rf: 300.8017,\n ellipseName: \"Everest 1948\"\n};\n\nexports.evrst56 = {\n a: 6377301.243,\n rf: 300.8017,\n ellipseName: \"Everest 1956\"\n};\n\nexports.evrst69 = {\n a: 6377295.664,\n rf: 300.8017,\n ellipseName: \"Everest 1969\"\n};\n\nexports.evrstSS = {\n a: 6377298.556,\n rf: 300.8017,\n ellipseName: \"Everest (Sabah & Sarawak)\"\n};\n\nexports.fschr60 = {\n a: 6378166.0,\n rf: 298.3,\n ellipseName: \"Fischer (Mercury Datum) 1960\"\n};\n\nexports.fschr60m = {\n a: 6378155.0,\n rf: 298.3,\n ellipseName: \"Fischer 1960\"\n};\n\nexports.fschr68 = {\n a: 6378150.0,\n rf: 298.3,\n ellipseName: \"Fischer 1968\"\n};\n\nexports.helmert = {\n a: 6378200.0,\n rf: 298.3,\n ellipseName: \"Helmert 1906\"\n};\n\nexports.hough = {\n a: 6378270.0,\n rf: 297.0,\n ellipseName: \"Hough\"\n};\n\nexports.intl = {\n a: 6378388.0,\n rf: 297.0,\n ellipseName: \"International 1909 (Hayford)\"\n};\n\nexports.kaula = {\n a: 6378163.0,\n rf: 298.24,\n ellipseName: \"Kaula 1961\"\n};\n\nexports.lerch = {\n a: 6378139.0,\n rf: 298.257,\n ellipseName: \"Lerch 1979\"\n};\n\nexports.mprts = {\n a: 6397300.0,\n rf: 191.0,\n ellipseName: \"Maupertius 1738\"\n};\n\nexports.new_intl = {\n a: 6378157.5,\n b: 6356772.2,\n ellipseName: \"New International 1967\"\n};\n\nexports.plessis = {\n a: 6376523.0,\n rf: 6355863.0,\n ellipseName: \"Plessis 1817 (France)\"\n};\n\nexports.krass = {\n a: 6378245.0,\n rf: 298.3,\n ellipseName: \"Krassovsky, 1942\"\n};\n\nexports.SEasia = {\n a: 6378155.0,\n b: 6356773.3205,\n ellipseName: \"Southeast Asia\"\n};\n\nexports.walbeck = {\n a: 6376896.0,\n b: 6355834.8467,\n ellipseName: \"Walbeck\"\n};\n\nexports.WGS60 = {\n a: 6378165.0,\n rf: 298.3,\n ellipseName: \"WGS 60\"\n};\n\nexports.WGS66 = {\n a: 6378145.0,\n rf: 298.25,\n ellipseName: \"WGS 66\"\n};\n\nexports.WGS7 = {\n a: 6378135.0,\n rf: 298.26,\n ellipseName: \"WGS 72\"\n};\n\nexport var WGS84 = exports.WGS84 = {\n a: 6378137.0,\n rf: 298.257223563,\n ellipseName: \"WGS 84\"\n};\n\nexports.sphere = {\n a: 6370997.0,\n b: 6370997.0,\n ellipseName: \"Normal Sphere (r=6370997)\"\n};\n","var exports = {};\nexport {exports as default};\nexports.wgs84 = {\n towgs84: \"0,0,0\",\n ellipse: \"WGS84\",\n datumName: \"WGS84\"\n};\n\nexports.ch1903 = {\n towgs84: \"674.374,15.056,405.346\",\n ellipse: \"bessel\",\n datumName: \"swiss\"\n};\n\nexports.ggrs87 = {\n towgs84: \"-199.87,74.79,246.62\",\n ellipse: \"GRS80\",\n datumName: \"Greek_Geodetic_Reference_System_1987\"\n};\n\nexports.nad83 = {\n towgs84: \"0,0,0\",\n ellipse: \"GRS80\",\n datumName: \"North_American_Datum_1983\"\n};\n\nexports.nad27 = {\n nadgrids: \"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat\",\n ellipse: \"clrk66\",\n datumName: \"North_American_Datum_1927\"\n};\n\nexports.potsdam = {\n towgs84: \"598.1,73.7,418.2,0.202,0.045,-2.455,6.7\",\n ellipse: \"bessel\",\n datumName: \"Potsdam Rauenberg 1950 DHDN\"\n};\n\nexports.carthage = {\n towgs84: \"-263.0,6.0,431.0\",\n ellipse: \"clark80\",\n datumName: \"Carthage 1934 Tunisia\"\n};\n\nexports.hermannskogel = {\n towgs84: \"577.326,90.129,463.919,5.137,1.474,5.297,2.4232\",\n ellipse: \"bessel\",\n datumName: \"Hermannskogel\"\n};\n\nexports.osni52 = {\n towgs84: \"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15\",\n ellipse: \"airy\",\n datumName: \"Irish National\"\n};\n\nexports.ire65 = {\n towgs84: \"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15\",\n ellipse: \"mod_airy\",\n datumName: \"Ireland 1965\"\n};\n\nexports.rassadiran = {\n towgs84: \"-133.63,-157.5,-158.62\",\n ellipse: \"intl\",\n datumName: \"Rassadiran\"\n};\n\nexports.nzgd49 = {\n towgs84: \"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993\",\n ellipse: \"intl\",\n datumName: \"New Zealand Geodetic Datum 1949\"\n};\n\nexports.osgb36 = {\n towgs84: \"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894\",\n ellipse: \"airy\",\n datumName: \"Airy 1830\"\n};\n\nexports.s_jtsk = {\n towgs84: \"589,76,480\",\n ellipse: 'bessel',\n datumName: 'S-JTSK (Ferro)'\n};\n\nexports.beduaram = {\n towgs84: '-106,-87,188',\n ellipse: 'clrk80',\n datumName: 'Beduaram'\n};\n\nexports.gunung_segara = {\n towgs84: '-403,684,41',\n ellipse: 'bessel',\n datumName: 'Gunung Segara Jakarta'\n};\n\nexports.rnb72 = {\n towgs84: \"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1\",\n ellipse: \"intl\",\n datumName: \"Reseau National Belge 1972\"\n};\n","/**\n * Resources for details of NTv2 file formats:\n * - https://web.archive.org/web/20140127204822if_/http://www.mgs.gov.on.ca:80/stdprodconsume/groups/content/@mgs/@iandit/documents/resourcelist/stel02_047447.pdf\n * - http://mimaka.com/help/gs/html/004_NTV2%20Data%20Format.htm\n */\n\nvar loadedNadgrids = {};\n\n/**\n * Load a binary NTv2 file (.gsb) to a key that can be used in a proj string like +nadgrids=. Pass the NTv2 file\n * as an ArrayBuffer.\n */\nexport default function nadgrid(key, data) {\n var view = new DataView(data);\n var isLittleEndian = detectLittleEndian(view);\n var header = readHeader(view, isLittleEndian);\n if (header.nSubgrids > 1) {\n console.log('Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored');\n }\n var subgrids = readSubgrids(view, header, isLittleEndian);\n var nadgrid = {header: header, subgrids: subgrids};\n loadedNadgrids[key] = nadgrid;\n return nadgrid;\n}\n\n/**\n * Given a proj4 value for nadgrids, return an array of loaded grids\n */\nexport function getNadgrids(nadgrids) {\n // Format details: http://proj.maptools.org/gen_parms.html\n if (nadgrids === undefined) { return null; }\n var grids = nadgrids.split(',');\n return grids.map(parseNadgridString);\n}\n\nfunction parseNadgridString(value) {\n if (value.length === 0) {\n return null;\n }\n var optional = value[0] === '@';\n if (optional) {\n value = value.slice(1);\n }\n if (value === 'null') {\n return {name: 'null', mandatory: !optional, grid: null, isNull: true};\n }\n return {\n name: value,\n mandatory: !optional,\n grid: loadedNadgrids[value] || null,\n isNull: false\n };\n}\n\nfunction secondsToRadians(seconds) {\n return (seconds / 3600) * Math.PI / 180;\n}\n\nfunction detectLittleEndian(view) {\n var nFields = view.getInt32(8, false);\n if (nFields === 11) {\n return false;\n }\n nFields = view.getInt32(8, true);\n if (nFields !== 11) {\n console.warn('Failed to detect nadgrid endian-ness, defaulting to little-endian');\n }\n return true;\n}\n\nfunction readHeader(view, isLittleEndian) {\n return {\n nFields: view.getInt32(8, isLittleEndian),\n nSubgridFields: view.getInt32(24, isLittleEndian),\n nSubgrids: view.getInt32(40, isLittleEndian),\n shiftType: decodeString(view, 56, 56 + 8).trim(),\n fromSemiMajorAxis: view.getFloat64(120, isLittleEndian),\n fromSemiMinorAxis: view.getFloat64(136, isLittleEndian),\n toSemiMajorAxis: view.getFloat64(152, isLittleEndian),\n toSemiMinorAxis: view.getFloat64(168, isLittleEndian),\n };\n}\n\nfunction decodeString(view, start, end) {\n return String.fromCharCode.apply(null, new Uint8Array(view.buffer.slice(start, end)));\n}\n\nfunction readSubgrids(view, header, isLittleEndian) {\n var gridOffset = 176;\n var grids = [];\n for (var i = 0; i < header.nSubgrids; i++) {\n var subHeader = readGridHeader(view, gridOffset, isLittleEndian);\n var nodes = readGridNodes(view, gridOffset, subHeader, isLittleEndian);\n var lngColumnCount = Math.round(\n 1 + (subHeader.upperLongitude - subHeader.lowerLongitude) / subHeader.longitudeInterval);\n var latColumnCount = Math.round(\n 1 + (subHeader.upperLatitude - subHeader.lowerLatitude) / subHeader.latitudeInterval);\n // Proj4 operates on radians whereas the coordinates are in seconds in the grid\n grids.push({\n ll: [secondsToRadians(subHeader.lowerLongitude), secondsToRadians(subHeader.lowerLatitude)],\n del: [secondsToRadians(subHeader.longitudeInterval), secondsToRadians(subHeader.latitudeInterval)],\n lim: [lngColumnCount, latColumnCount],\n count: subHeader.gridNodeCount,\n cvs: mapNodes(nodes)\n });\n }\n return grids;\n}\n\nfunction mapNodes(nodes) {\n return nodes.map(function (r) {return [secondsToRadians(r.longitudeShift), secondsToRadians(r.latitudeShift)];});\n}\n\nfunction readGridHeader(view, offset, isLittleEndian) {\n return {\n name: decodeString(view, offset + 8, offset + 16).trim(),\n parent: decodeString(view, offset + 24, offset + 24 + 8).trim(),\n lowerLatitude: view.getFloat64(offset + 72, isLittleEndian),\n upperLatitude: view.getFloat64(offset + 88, isLittleEndian),\n lowerLongitude: view.getFloat64(offset + 104, isLittleEndian),\n upperLongitude: view.getFloat64(offset + 120, isLittleEndian),\n latitudeInterval: view.getFloat64(offset + 136, isLittleEndian),\n longitudeInterval: view.getFloat64(offset + 152, isLittleEndian),\n gridNodeCount: view.getInt32(offset + 168, isLittleEndian)\n };\n}\n\nfunction readGridNodes(view, offset, gridHeader, isLittleEndian) {\n var nodesOffset = offset + 176;\n var gridRecordLength = 16;\n var gridShiftRecords = [];\n for (var i = 0; i < gridHeader.gridNodeCount; i++) {\n var record = {\n latitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength, isLittleEndian),\n longitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength + 4, isLittleEndian),\n latitudeAccuracy: view.getFloat32(nodesOffset + i * gridRecordLength + 8, isLittleEndian),\n longitudeAccuracy: view.getFloat32(nodesOffset + i * gridRecordLength + 12, isLittleEndian),\n };\n gridShiftRecords.push(record);\n }\n return gridShiftRecords;\n}\n","import parseCode from './parseCode';\nimport extend from './extend';\nimport projections from './projections';\nimport {sphere as dc_sphere, eccentricity as dc_eccentricity} from './deriveConstants';\nimport Datum from './constants/Datum';\nimport datum from './datum';\nimport match from './match';\nimport {getNadgrids} from \"./nadgrid\";\n\nfunction Projection(srsCode,callback) {\n if (!(this instanceof Projection)) {\n return new Projection(srsCode);\n }\n callback = callback || function(error){\n if(error){\n throw error;\n }\n };\n var json = parseCode(srsCode);\n if(typeof json !== 'object'){\n callback(srsCode);\n return;\n }\n var ourProj = Projection.projections.get(json.projName);\n if(!ourProj){\n callback(srsCode);\n return;\n }\n if (json.datumCode && json.datumCode !== 'none') {\n var datumDef = match(Datum, json.datumCode);\n if (datumDef) {\n json.datum_params = json.datum_params || (datumDef.towgs84 ? datumDef.towgs84.split(',') : null);\n json.ellps = datumDef.ellipse;\n json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode;\n }\n }\n json.k0 = json.k0 || 1.0;\n json.axis = json.axis || 'enu';\n json.ellps = json.ellps || 'wgs84';\n json.lat1 = json.lat1 || json.lat0; // Lambert_Conformal_Conic_1SP, for example, needs this\n\n var sphere_ = dc_sphere(json.a, json.b, json.rf, json.ellps, json.sphere);\n var ecc = dc_eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A);\n var nadgrids = getNadgrids(json.nadgrids);\n var datumObj = json.datum || datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2,\n nadgrids);\n\n extend(this, json); // transfer everything over from the projection because we don't know what we'll need\n extend(this, ourProj); // transfer all the methods from the projection\n\n // copy the 4 things over we calculated in deriveConstants.sphere\n this.a = sphere_.a;\n this.b = sphere_.b;\n this.rf = sphere_.rf;\n this.sphere = sphere_.sphere;\n\n // copy the 3 things we calculated in deriveConstants.eccentricity\n this.es = ecc.es;\n this.e = ecc.e;\n this.ep2 = ecc.ep2;\n\n // add in the datum object\n this.datum = datumObj;\n\n // init the projection\n this.init();\n\n // legecy callback from back in the day when it went to spatialreference.org\n callback(null, this);\n\n}\nProjection.projections = projections;\nProjection.projections.start();\nexport default Projection;\n","import {SIXTH, RA4, RA6, EPSLN} from './constants/values';\nimport {default as Ellipsoid, WGS84} from './constants/Ellipsoid';\nimport match from './match';\n\nexport function eccentricity(a, b, rf, R_A) {\n var a2 = a * a; // used in geocentric\n var b2 = b * b; // used in geocentric\n var es = (a2 - b2) / a2; // e ^ 2\n var e = 0;\n if (R_A) {\n a *= 1 - es * (SIXTH + es * (RA4 + es * RA6));\n a2 = a * a;\n es = 0;\n } else {\n e = Math.sqrt(es); // eccentricity\n }\n var ep2 = (a2 - b2) / b2; // used in geocentric\n return {\n es: es,\n e: e,\n ep2: ep2\n };\n}\nexport function sphere(a, b, rf, ellps, sphere) {\n if (!a) { // do we have an ellipsoid?\n var ellipse = match(Ellipsoid, ellps);\n if (!ellipse) {\n ellipse = WGS84;\n }\n a = ellipse.a;\n b = ellipse.b;\n rf = ellipse.rf;\n }\n\n if (rf && !b) {\n b = (1.0 - 1.0 / rf) * a;\n }\n if (rf === 0 || Math.abs(a - b) < EPSLN) {\n sphere = true;\n b = a;\n }\n return {\n a: a,\n b: b,\n rf: rf,\n sphere: sphere\n };\n}\n","import {PJD_3PARAM, PJD_7PARAM, PJD_GRIDSHIFT, PJD_WGS84, PJD_NODATUM, SEC_TO_RAD} from './constants/values';\n\nfunction datum(datumCode, datum_params, a, b, es, ep2, nadgrids) {\n var out = {};\n\n if (datumCode === undefined || datumCode === 'none') {\n out.datum_type = PJD_NODATUM;\n } else {\n out.datum_type = PJD_WGS84;\n }\n\n if (datum_params) {\n out.datum_params = datum_params.map(parseFloat);\n if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) {\n out.datum_type = PJD_3PARAM;\n }\n if (out.datum_params.length > 3) {\n if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) {\n out.datum_type = PJD_7PARAM;\n out.datum_params[3] *= SEC_TO_RAD;\n out.datum_params[4] *= SEC_TO_RAD;\n out.datum_params[5] *= SEC_TO_RAD;\n out.datum_params[6] = (out.datum_params[6] / 1000000.0) + 1.0;\n }\n }\n }\n\n if (nadgrids) {\n out.datum_type = PJD_GRIDSHIFT;\n out.grids = nadgrids;\n }\n out.a = a; //datum object also uses these values\n out.b = b;\n out.es = es;\n out.ep2 = ep2;\n return out;\n}\n\nexport default datum;\n","'use strict';\nimport {PJD_3PARAM, PJD_7PARAM, HALF_PI} from './constants/values';\nexport function compareDatums(source, dest) {\n if (source.datum_type !== dest.datum_type) {\n return false; // false, datums are not equal\n } else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) {\n // the tolerance for es is to ensure that GRS80 and WGS84\n // are considered identical\n return false;\n } else if (source.datum_type === PJD_3PARAM) {\n return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]);\n } else if (source.datum_type === PJD_7PARAM) {\n return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]);\n } else {\n return true; // datums are equal\n }\n} // cs_compare_datums()\n\n/*\n * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates\n * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z),\n * according to the current ellipsoid parameters.\n *\n * Latitude : Geodetic latitude in radians (input)\n * Longitude : Geodetic longitude in radians (input)\n * Height : Geodetic height, in meters (input)\n * X : Calculated Geocentric X coordinate, in meters (output)\n * Y : Calculated Geocentric Y coordinate, in meters (output)\n * Z : Calculated Geocentric Z coordinate, in meters (output)\n *\n */\nexport function geodeticToGeocentric(p, es, a) {\n var Longitude = p.x;\n var Latitude = p.y;\n var Height = p.z ? p.z : 0; //Z value not always supplied\n\n var Rn; /* Earth radius at location */\n var Sin_Lat; /* Math.sin(Latitude) */\n var Sin2_Lat; /* Square of Math.sin(Latitude) */\n var Cos_Lat; /* Math.cos(Latitude) */\n\n /*\n ** Don't blow up if Latitude is just a little out of the value\n ** range as it may just be a rounding issue. Also removed longitude\n ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001.\n */\n if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) {\n Latitude = -HALF_PI;\n } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) {\n Latitude = HALF_PI;\n } else if (Latitude < -HALF_PI) {\n /* Latitude out of range */\n //..reportError('geocent:lat out of range:' + Latitude);\n return { x: -Infinity, y: -Infinity, z: p.z };\n } else if (Latitude > HALF_PI) {\n /* Latitude out of range */\n return { x: Infinity, y: Infinity, z: p.z };\n }\n\n if (Longitude > Math.PI) {\n Longitude -= (2 * Math.PI);\n }\n Sin_Lat = Math.sin(Latitude);\n Cos_Lat = Math.cos(Latitude);\n Sin2_Lat = Sin_Lat * Sin_Lat;\n Rn = a / (Math.sqrt(1.0e0 - es * Sin2_Lat));\n return {\n x: (Rn + Height) * Cos_Lat * Math.cos(Longitude),\n y: (Rn + Height) * Cos_Lat * Math.sin(Longitude),\n z: ((Rn * (1 - es)) + Height) * Sin_Lat\n };\n} // cs_geodetic_to_geocentric()\n\nexport function geocentricToGeodetic(p, es, a, b) {\n /* local defintions and variables */\n /* end-criterium of loop, accuracy of sin(Latitude) */\n var genau = 1e-12;\n var genau2 = (genau * genau);\n var maxiter = 30;\n\n var P; /* distance between semi-minor axis and location */\n var RR; /* distance between center and location */\n var CT; /* sin of geocentric latitude */\n var ST; /* cos of geocentric latitude */\n var RX;\n var RK;\n var RN; /* Earth radius at location */\n var CPHI0; /* cos of start or old geodetic latitude in iterations */\n var SPHI0; /* sin of start or old geodetic latitude in iterations */\n var CPHI; /* cos of searched geodetic latitude */\n var SPHI; /* sin of searched geodetic latitude */\n var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */\n var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */\n\n var X = p.x;\n var Y = p.y;\n var Z = p.z ? p.z : 0.0; //Z value not always supplied\n var Longitude;\n var Latitude;\n var Height;\n\n P = Math.sqrt(X * X + Y * Y);\n RR = Math.sqrt(X * X + Y * Y + Z * Z);\n\n /* special cases for latitude and longitude */\n if (P / a < genau) {\n\n /* special case, if P=0. (X=0., Y=0.) */\n Longitude = 0.0;\n\n /* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis\n * of ellipsoid (=center of mass), Latitude becomes PI/2 */\n if (RR / a < genau) {\n Latitude = HALF_PI;\n Height = -b;\n return {\n x: p.x,\n y: p.y,\n z: p.z\n };\n }\n } else {\n /* ellipsoidal (geodetic) longitude\n * interval: -PI < Longitude <= +PI */\n Longitude = Math.atan2(Y, X);\n }\n\n /* --------------------------------------------------------------\n * Following iterative algorithm was developped by\n * \"Institut for Erdmessung\", University of Hannover, July 1988.\n * Internet: www.ife.uni-hannover.de\n * Iterative computation of CPHI,SPHI and Height.\n * Iteration of CPHI and SPHI to 10**-12 radian resp.\n * 2*10**-7 arcsec.\n * --------------------------------------------------------------\n */\n CT = Z / RR;\n ST = P / RR;\n RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST);\n CPHI0 = ST * (1.0 - es) * RX;\n SPHI0 = CT * RX;\n iter = 0;\n\n /* loop to find sin(Latitude) resp. Latitude\n * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */\n do {\n iter++;\n RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0);\n\n /* ellipsoidal (geodetic) height */\n Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0);\n\n RK = es * RN / (RN + Height);\n RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST);\n CPHI = ST * (1.0 - RK) * RX;\n SPHI = CT * RX;\n SDPHI = SPHI * CPHI0 - CPHI * SPHI0;\n CPHI0 = CPHI;\n SPHI0 = SPHI;\n }\n while (SDPHI * SDPHI > genau2 && iter < maxiter);\n\n /* ellipsoidal (geodetic) latitude */\n Latitude = Math.atan(SPHI / Math.abs(CPHI));\n return {\n x: Longitude,\n y: Latitude,\n z: Height\n };\n} // cs_geocentric_to_geodetic()\n\n/****************************************************************/\n// pj_geocentic_to_wgs84( p )\n// p = point to transform in geocentric coordinates (x,y,z)\n\n\n/** point object, nothing fancy, just allows values to be\n passed back and forth by reference rather than by value.\n Other point classes may be used as long as they have\n x and y properties, which will get modified in the transform method.\n*/\nexport function geocentricToWgs84(p, datum_type, datum_params) {\n\n if (datum_type === PJD_3PARAM) {\n // if( x[io] === HUGE_VAL )\n // continue;\n return {\n x: p.x + datum_params[0],\n y: p.y + datum_params[1],\n z: p.z + datum_params[2],\n };\n } else if (datum_type === PJD_7PARAM) {\n var Dx_BF = datum_params[0];\n var Dy_BF = datum_params[1];\n var Dz_BF = datum_params[2];\n var Rx_BF = datum_params[3];\n var Ry_BF = datum_params[4];\n var Rz_BF = datum_params[5];\n var M_BF = datum_params[6];\n // if( x[io] === HUGE_VAL )\n // continue;\n return {\n x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF,\n y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF,\n z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF\n };\n }\n} // cs_geocentric_to_wgs84\n\n/****************************************************************/\n// pj_geocentic_from_wgs84()\n// coordinate system definition,\n// point to transform in geocentric coordinates (x,y,z)\nexport function geocentricFromWgs84(p, datum_type, datum_params) {\n\n if (datum_type === PJD_3PARAM) {\n //if( x[io] === HUGE_VAL )\n // continue;\n return {\n x: p.x - datum_params[0],\n y: p.y - datum_params[1],\n z: p.z - datum_params[2],\n };\n\n } else if (datum_type === PJD_7PARAM) {\n var Dx_BF = datum_params[0];\n var Dy_BF = datum_params[1];\n var Dz_BF = datum_params[2];\n var Rx_BF = datum_params[3];\n var Ry_BF = datum_params[4];\n var Rz_BF = datum_params[5];\n var M_BF = datum_params[6];\n var x_tmp = (p.x - Dx_BF) / M_BF;\n var y_tmp = (p.y - Dy_BF) / M_BF;\n var z_tmp = (p.z - Dz_BF) / M_BF;\n //if( x[io] === HUGE_VAL )\n // continue;\n\n return {\n x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp,\n y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp,\n z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp\n };\n } //cs_geocentric_from_wgs84()\n}\n","import {\n PJD_3PARAM,\n PJD_7PARAM,\n PJD_GRIDSHIFT,\n PJD_NODATUM,\n R2D,\n SRS_WGS84_ESQUARED,\n SRS_WGS84_SEMIMAJOR, SRS_WGS84_SEMIMINOR\n} from './constants/values';\n\nimport {geodeticToGeocentric, geocentricToGeodetic, geocentricToWgs84, geocentricFromWgs84, compareDatums} from './datumUtils';\nimport adjust_lon from \"./common/adjust_lon\";\nfunction checkParams(type) {\n return (type === PJD_3PARAM || type === PJD_7PARAM);\n}\n\nexport default function(source, dest, point) {\n // Short cut if the datums are identical.\n if (compareDatums(source, dest)) {\n return point; // in this case, zero is sucess,\n // whereas cs_compare_datums returns 1 to indicate TRUE\n // confusing, should fix this\n }\n\n // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest\n if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) {\n return point;\n }\n\n // If this datum requires grid shifts, then apply it to geodetic coordinates.\n var source_a = source.a;\n var source_es = source.es;\n if (source.datum_type === PJD_GRIDSHIFT) {\n var gridShiftCode = applyGridShift(source, false, point);\n if (gridShiftCode !== 0) {\n return undefined;\n }\n source_a = SRS_WGS84_SEMIMAJOR;\n source_es = SRS_WGS84_ESQUARED;\n }\n\n var dest_a = dest.a;\n var dest_b = dest.b;\n var dest_es = dest.es;\n if (dest.datum_type === PJD_GRIDSHIFT) {\n dest_a = SRS_WGS84_SEMIMAJOR;\n dest_b = SRS_WGS84_SEMIMINOR;\n dest_es = SRS_WGS84_ESQUARED;\n }\n\n // Do we need to go through geocentric coordinates?\n if (source_es === dest_es && source_a === dest_a && !checkParams(source.datum_type) && !checkParams(dest.datum_type)) {\n return point;\n }\n\n // Convert to geocentric coordinates.\n point = geodeticToGeocentric(point, source_es, source_a);\n // Convert between datums\n if (checkParams(source.datum_type)) {\n point = geocentricToWgs84(point, source.datum_type, source.datum_params);\n }\n if (checkParams(dest.datum_type)) {\n point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params);\n }\n point = geocentricToGeodetic(point, dest_es, dest_a, dest_b);\n\n if (dest.datum_type === PJD_GRIDSHIFT) {\n var destGridShiftResult = applyGridShift(dest, true, point);\n if (destGridShiftResult !== 0) {\n return undefined;\n }\n }\n\n return point;\n}\n\nexport function applyGridShift(source, inverse, point) {\n if (source.grids === null || source.grids.length === 0) {\n console.log('Grid shift grids not found');\n return -1;\n }\n var input = {x: -point.x, y: point.y};\n var output = {x: Number.NaN, y: Number.NaN};\n var onlyMandatoryGrids = false;\n var attemptedGrids = [];\n for (var i = 0; i < source.grids.length; i++) {\n var grid = source.grids[i];\n attemptedGrids.push(grid.name);\n if (grid.isNull) {\n output = input;\n break;\n }\n onlyMandatoryGrids = grid.mandatory;\n if (grid.grid === null) {\n if (grid.mandatory) {\n console.log(\"Unable to find mandatory grid '\" + grid.name + \"'\");\n return -1;\n }\n continue;\n }\n var subgrid = grid.grid.subgrids[0];\n // skip tables that don't match our point at all\n var epsilon = (Math.abs(subgrid.del[1]) + Math.abs(subgrid.del[0])) / 10000.0;\n var minX = subgrid.ll[0] - epsilon;\n var minY = subgrid.ll[1] - epsilon;\n var maxX = subgrid.ll[0] + (subgrid.lim[0] - 1) * subgrid.del[0] + epsilon;\n var maxY = subgrid.ll[1] + (subgrid.lim[1] - 1) * subgrid.del[1] + epsilon;\n if (minY > input.y || minX > input.x || maxY < input.y || maxX < input.x ) {\n continue;\n }\n output = applySubgridShift(input, inverse, subgrid);\n if (!isNaN(output.x)) {\n break;\n }\n }\n if (isNaN(output.x)) {\n console.log(\"Failed to find a grid shift table for location '\"+\n -input.x * R2D + \" \" + input.y * R2D + \" tried: '\" + attemptedGrids + \"'\");\n return -1;\n }\n point.x = -output.x;\n point.y = output.y;\n return 0;\n}\n\nfunction applySubgridShift(pin, inverse, ct) {\n var val = {x: Number.NaN, y: Number.NaN};\n if (isNaN(pin.x)) { return val; }\n var tb = {x: pin.x, y: pin.y};\n tb.x -= ct.ll[0];\n tb.y -= ct.ll[1];\n tb.x = adjust_lon(tb.x - Math.PI) + Math.PI;\n var t = nadInterpolate(tb, ct);\n if (inverse) {\n if (isNaN(t.x)) {\n return val;\n }\n t.x = tb.x - t.x;\n t.y = tb.y - t.y;\n var i = 9, tol = 1e-12;\n var dif, del;\n do {\n del = nadInterpolate(t, ct);\n if (isNaN(del.x)) {\n console.log(\"Inverse grid shift iteration failed, presumably at grid edge. Using first approximation.\");\n break;\n }\n dif = {x: tb.x - (del.x + t.x), y: tb.y - (del.y + t.y)};\n t.x += dif.x;\n t.y += dif.y;\n } while (i-- && Math.abs(dif.x) > tol && Math.abs(dif.y) > tol);\n if (i < 0) {\n console.log(\"Inverse grid shift iterator failed to converge.\");\n return val;\n }\n val.x = adjust_lon(t.x + ct.ll[0]);\n val.y = t.y + ct.ll[1];\n } else {\n if (!isNaN(t.x)) {\n val.x = pin.x + t.x;\n val.y = pin.y + t.y;\n }\n }\n return val;\n}\n\nfunction nadInterpolate(pin, ct) {\n var t = {x: pin.x / ct.del[0], y: pin.y / ct.del[1]};\n var indx = {x: Math.floor(t.x), y: Math.floor(t.y)};\n var frct = {x: t.x - 1.0 * indx.x, y: t.y - 1.0 * indx.y};\n var val= {x: Number.NaN, y: Number.NaN};\n var inx;\n if (indx.x < 0 || indx.x >= ct.lim[0]) {\n return val;\n }\n if (indx.y < 0 || indx.y >= ct.lim[1]) {\n return val;\n }\n inx = (indx.y * ct.lim[0]) + indx.x;\n var f00 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]};\n inx++;\n var f10= {x: ct.cvs[inx][0], y: ct.cvs[inx][1]};\n inx += ct.lim[0];\n var f11 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]};\n inx--;\n var f01 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]};\n var m11 = frct.x * frct.y, m10 = frct.x * (1.0 - frct.y),\n m00 = (1.0 - frct.x) * (1.0 - frct.y), m01 = (1.0 - frct.x) * frct.y;\n val.x = (m00 * f00.x + m10 * f10.x + m01 * f01.x + m11 * f11.x);\n val.y = (m00 * f00.y + m10 * f10.y + m01 * f01.y + m11 * f11.y);\n return val;\n}\n","export default function(crs, denorm, point) {\n var xin = point.x,\n yin = point.y,\n zin = point.z || 0.0;\n var v, t, i;\n var out = {};\n for (i = 0; i < 3; i++) {\n if (denorm && i === 2 && point.z === undefined) {\n continue;\n }\n if (i === 0) {\n v = xin;\n if (\"ew\".indexOf(crs.axis[i]) !== -1) {\n t = 'x';\n } else {\n t = 'y';\n }\n\n }\n else if (i === 1) {\n v = yin;\n if (\"ns\".indexOf(crs.axis[i]) !== -1) {\n t = 'y';\n } else {\n t = 'x';\n }\n }\n else {\n v = zin;\n t = 'z';\n }\n switch (crs.axis[i]) {\n case 'e':\n out[t] = v;\n break;\n case 'w':\n out[t] = -v;\n break;\n case 'n':\n out[t] = v;\n break;\n case 's':\n out[t] = -v;\n break;\n case 'u':\n if (point[t] !== undefined) {\n out.z = v;\n }\n break;\n case 'd':\n if (point[t] !== undefined) {\n out.z = -v;\n }\n break;\n default:\n //console.log(\"ERROR: unknow axis (\"+crs.axis[i]+\") - check definition of \"+crs.projName);\n return null;\n }\n }\n return out;\n}\n","export default function (array){\n var out = {\n x: array[0],\n y: array[1]\n };\n if (array.length>2) {\n out.z = array[2];\n }\n if (array.length>3) {\n out.m = array[3];\n }\n return out;\n}","export default function (point) {\n checkCoord(point.x);\n checkCoord(point.y);\n}\nfunction checkCoord(num) {\n if (typeof Number.isFinite === 'function') {\n if (Number.isFinite(num)) {\n return;\n }\n throw new TypeError('coordinates must be finite numbers');\n }\n if (typeof num !== 'number' || num !== num || !isFinite(num)) {\n throw new TypeError('coordinates must be finite numbers');\n }\n}\n","import {D2R, R2D, PJD_3PARAM, PJD_7PARAM, PJD_GRIDSHIFT} from './constants/values';\nimport datum_transform from './datum_transform';\nimport adjust_axis from './adjust_axis';\nimport proj from './Proj';\nimport toPoint from './common/toPoint';\nimport checkSanity from './checkSanity';\n\nfunction checkNotWGS(source, dest) {\n return (\n (source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM || source.datum.datum_type === PJD_GRIDSHIFT) && dest.datumCode !== 'WGS84') ||\n ((dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM || dest.datum.datum_type === PJD_GRIDSHIFT) && source.datumCode !== 'WGS84');\n}\n\nexport default function transform(source, dest, point, enforceAxis) {\n var wgs84;\n if (Array.isArray(point)) {\n point = toPoint(point);\n } else {\n // Clone the point object so inputs don't get modified\n point = {\n x: point.x,\n y: point.y,\n z: point.z,\n m: point.m\n };\n }\n var hasZ = point.z !== undefined;\n checkSanity(point);\n // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84\n if (source.datum && dest.datum && checkNotWGS(source, dest)) {\n wgs84 = new proj('WGS84');\n point = transform(source, wgs84, point, enforceAxis);\n source = wgs84;\n }\n // DGR, 2010/11/12\n if (enforceAxis && source.axis !== 'enu') {\n point = adjust_axis(source, false, point);\n }\n // Transform source points to long/lat, if they aren't already.\n if (source.projName === 'longlat') {\n point = {\n x: point.x * D2R,\n y: point.y * D2R,\n z: point.z || 0\n };\n } else {\n if (source.to_meter) {\n point = {\n x: point.x * source.to_meter,\n y: point.y * source.to_meter,\n z: point.z || 0\n };\n }\n point = source.inverse(point); // Convert Cartesian to longlat\n if (!point) {\n return;\n }\n }\n // Adjust for the prime meridian if necessary\n if (source.from_greenwich) {\n point.x += source.from_greenwich;\n }\n\n // Convert datums if needed, and if possible.\n point = datum_transform(source.datum, dest.datum, point);\n if (!point) {\n return;\n }\n\n // Adjust for the prime meridian if necessary\n if (dest.from_greenwich) {\n point = {\n x: point.x - dest.from_greenwich,\n y: point.y,\n z: point.z || 0\n };\n }\n\n if (dest.projName === 'longlat') {\n // convert radians to decimal degrees\n point = {\n x: point.x * R2D,\n y: point.y * R2D,\n z: point.z || 0\n };\n } else { // else project\n point = dest.forward(point);\n if (dest.to_meter) {\n point = {\n x: point.x / dest.to_meter,\n y: point.y / dest.to_meter,\n z: point.z || 0\n };\n }\n }\n\n // DGR, 2010/11/12\n if (enforceAxis && dest.axis !== 'enu') {\n return adjust_axis(dest, true, point);\n }\n\n if (!hasZ) {\n delete point.z;\n }\n return point;\n}\n","import proj from './Proj';\nimport transform from './transform';\nvar wgs84 = proj('WGS84');\n\nfunction transformer(from, to, coords, enforceAxis) {\n var transformedArray, out, keys;\n if (Array.isArray(coords)) {\n transformedArray = transform(from, to, coords, enforceAxis) || {x: NaN, y: NaN};\n if (coords.length > 2) {\n if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) {\n if (typeof transformedArray.z === 'number') {\n return [transformedArray.x, transformedArray.y, transformedArray.z].concat(coords.splice(3));\n } else {\n return [transformedArray.x, transformedArray.y, coords[2]].concat(coords.splice(3));\n }\n } else {\n return [transformedArray.x, transformedArray.y].concat(coords.splice(2));\n }\n } else {\n return [transformedArray.x, transformedArray.y];\n }\n } else {\n out = transform(from, to, coords, enforceAxis);\n keys = Object.keys(coords);\n if (keys.length === 2) {\n return out;\n }\n keys.forEach(function (key) {\n if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) {\n if (key === 'x' || key === 'y' || key === 'z') {\n return;\n }\n } else {\n if (key === 'x' || key === 'y') {\n return;\n }\n }\n out[key] = coords[key];\n });\n return out;\n }\n}\n\nfunction checkProj(item) {\n if (item instanceof proj) {\n return item;\n }\n if (item.oProj) {\n return item.oProj;\n }\n return proj(item);\n}\n\nfunction proj4(fromProj, toProj, coord) {\n fromProj = checkProj(fromProj);\n var single = false;\n var obj;\n if (typeof toProj === 'undefined') {\n toProj = fromProj;\n fromProj = wgs84;\n single = true;\n } else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) {\n coord = toProj;\n toProj = fromProj;\n fromProj = wgs84;\n single = true;\n }\n toProj = checkProj(toProj);\n if (coord) {\n return transformer(fromProj, toProj, coord);\n } else {\n obj = {\n forward: function (coords, enforceAxis) {\n return transformer(fromProj, toProj, coords, enforceAxis);\n },\n inverse: function (coords, enforceAxis) {\n return transformer(toProj, fromProj, coords, enforceAxis);\n }\n };\n if (single) {\n obj.oProj = toProj;\n }\n return obj;\n }\n}\nexport default proj4;","\n\n\n/**\n * UTM zones are grouped, and assigned to one of a group of 6\n * sets.\n *\n * {int} @private\n */\nvar NUM_100K_SETS = 6;\n\n/**\n * The column letters (for easting) of the lower left value, per\n * set.\n *\n * {string} @private\n */\nvar SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS';\n\n/**\n * The row letters (for northing) of the lower left value, per\n * set.\n *\n * {string} @private\n */\nvar SET_ORIGIN_ROW_LETTERS = 'AFAFAF';\n\nvar A = 65; // A\nvar I = 73; // I\nvar O = 79; // O\nvar V = 86; // V\nvar Z = 90; // Z\nexport default {\n forward: forward,\n inverse: inverse,\n toPoint: toPoint\n};\n/**\n * Conversion of lat/lon to MGRS.\n *\n * @param {object} ll Object literal with lat and lon properties on a\n * WGS84 ellipsoid.\n * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for\n * 100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5.\n * @return {string} the MGRS string for the given location and accuracy.\n */\nexport function forward(ll, accuracy) {\n accuracy = accuracy || 5; // default accuracy 1m\n return encode(LLtoUTM({\n lat: ll[1],\n lon: ll[0]\n }), accuracy);\n};\n\n/**\n * Conversion of MGRS to lat/lon.\n *\n * @param {string} mgrs MGRS string.\n * @return {array} An array with left (longitude), bottom (latitude), right\n * (longitude) and top (latitude) values in WGS84, representing the\n * bounding box for the provided MGRS reference.\n */\nexport function inverse(mgrs) {\n var bbox = UTMtoLL(decode(mgrs.toUpperCase()));\n if (bbox.lat && bbox.lon) {\n return [bbox.lon, bbox.lat, bbox.lon, bbox.lat];\n }\n return [bbox.left, bbox.bottom, bbox.right, bbox.top];\n};\n\nexport function toPoint(mgrs) {\n var bbox = UTMtoLL(decode(mgrs.toUpperCase()));\n if (bbox.lat && bbox.lon) {\n return [bbox.lon, bbox.lat];\n }\n return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2];\n};\n/**\n * Conversion from degrees to radians.\n *\n * @private\n * @param {number} deg the angle in degrees.\n * @return {number} the angle in radians.\n */\nfunction degToRad(deg) {\n return (deg * (Math.PI / 180.0));\n}\n\n/**\n * Conversion from radians to degrees.\n *\n * @private\n * @param {number} rad the angle in radians.\n * @return {number} the angle in degrees.\n */\nfunction radToDeg(rad) {\n return (180.0 * (rad / Math.PI));\n}\n\n/**\n * Converts a set of Longitude and Latitude co-ordinates to UTM\n * using the WGS84 ellipsoid.\n *\n * @private\n * @param {object} ll Object literal with lat and lon properties\n * representing the WGS84 coordinate to be converted.\n * @return {object} Object literal containing the UTM value with easting,\n * northing, zoneNumber and zoneLetter properties, and an optional\n * accuracy property in digits. Returns null if the conversion failed.\n */\nfunction LLtoUTM(ll) {\n var Lat = ll.lat;\n var Long = ll.lon;\n var a = 6378137.0; //ellip.radius;\n var eccSquared = 0.00669438; //ellip.eccsq;\n var k0 = 0.9996;\n var LongOrigin;\n var eccPrimeSquared;\n var N, T, C, A, M;\n var LatRad = degToRad(Lat);\n var LongRad = degToRad(Long);\n var LongOriginRad;\n var ZoneNumber;\n // (int)\n ZoneNumber = Math.floor((Long + 180) / 6) + 1;\n\n //Make sure the longitude 180.00 is in Zone 60\n if (Long === 180) {\n ZoneNumber = 60;\n }\n\n // Special zone for Norway\n if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) {\n ZoneNumber = 32;\n }\n\n // Special zones for Svalbard\n if (Lat >= 72.0 && Lat < 84.0) {\n if (Long >= 0.0 && Long < 9.0) {\n ZoneNumber = 31;\n }\n else if (Long >= 9.0 && Long < 21.0) {\n ZoneNumber = 33;\n }\n else if (Long >= 21.0 && Long < 33.0) {\n ZoneNumber = 35;\n }\n else if (Long >= 33.0 && Long < 42.0) {\n ZoneNumber = 37;\n }\n }\n\n LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin\n // in middle of\n // zone\n LongOriginRad = degToRad(LongOrigin);\n\n eccPrimeSquared = (eccSquared) / (1 - eccSquared);\n\n N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad));\n T = Math.tan(LatRad) * Math.tan(LatRad);\n C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad);\n A = Math.cos(LatRad) * (LongRad - LongOriginRad);\n\n 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));\n\n 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);\n\n 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)));\n if (Lat < 0.0) {\n UTMNorthing += 10000000.0; //10000000 meter offset for\n // southern hemisphere\n }\n\n return {\n northing: Math.round(UTMNorthing),\n easting: Math.round(UTMEasting),\n zoneNumber: ZoneNumber,\n zoneLetter: getLetterDesignator(Lat)\n };\n}\n\n/**\n * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience\n * class where the Zone can be specified as a single string eg.\"60N\" which\n * is then broken down into the ZoneNumber and ZoneLetter.\n *\n * @private\n * @param {object} utm An object literal with northing, easting, zoneNumber\n * and zoneLetter properties. If an optional accuracy property is\n * provided (in meters), a bounding box will be returned instead of\n * latitude and longitude.\n * @return {object} An object literal containing either lat and lon values\n * (if no accuracy was provided), or top, right, bottom and left values\n * for the bounding box calculated according to the provided accuracy.\n * Returns null if the conversion failed.\n */\nfunction UTMtoLL(utm) {\n\n var UTMNorthing = utm.northing;\n var UTMEasting = utm.easting;\n var zoneLetter = utm.zoneLetter;\n var zoneNumber = utm.zoneNumber;\n // check the ZoneNummber is valid\n if (zoneNumber < 0 || zoneNumber > 60) {\n return null;\n }\n\n var k0 = 0.9996;\n var a = 6378137.0; //ellip.radius;\n var eccSquared = 0.00669438; //ellip.eccsq;\n var eccPrimeSquared;\n var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared));\n var N1, T1, C1, R1, D, M;\n var LongOrigin;\n var mu, phi1Rad;\n\n // remove 500,000 meter offset for longitude\n var x = UTMEasting - 500000.0;\n var y = UTMNorthing;\n\n // We must know somehow if we are in the Northern or Southern\n // hemisphere, this is the only time we use the letter So even\n // if the Zone letter isn't exactly correct it should indicate\n // the hemisphere correctly\n if (zoneLetter < 'N') {\n y -= 10000000.0; // remove 10,000,000 meter offset used\n // for southern hemisphere\n }\n\n // There are 60 zones with zone 1 being at West -180 to -174\n LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin\n // in middle of\n // zone\n\n eccPrimeSquared = (eccSquared) / (1 - eccSquared);\n\n M = y / k0;\n mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));\n\n 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);\n // double phi1 = ProjMath.radToDeg(phi1Rad);\n\n N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad));\n T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad);\n C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad);\n R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5);\n D = x / (N1 * k0);\n\n 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);\n lat = radToDeg(lat);\n\n 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);\n lon = LongOrigin + radToDeg(lon);\n\n var result;\n if (utm.accuracy) {\n var topRight = UTMtoLL({\n northing: utm.northing + utm.accuracy,\n easting: utm.easting + utm.accuracy,\n zoneLetter: utm.zoneLetter,\n zoneNumber: utm.zoneNumber\n });\n result = {\n top: topRight.lat,\n right: topRight.lon,\n bottom: lat,\n left: lon\n };\n }\n else {\n result = {\n lat: lat,\n lon: lon\n };\n }\n return result;\n}\n\n/**\n * Calculates the MGRS letter designator for the given latitude.\n *\n * @private\n * @param {number} lat The latitude in WGS84 to get the letter designator\n * for.\n * @return {char} The letter designator.\n */\nfunction getLetterDesignator(lat) {\n //This is here as an error flag to show that the Latitude is\n //outside MGRS limits\n var LetterDesignator = 'Z';\n\n if ((84 >= lat) && (lat >= 72)) {\n LetterDesignator = 'X';\n }\n else if ((72 > lat) && (lat >= 64)) {\n LetterDesignator = 'W';\n }\n else if ((64 > lat) && (lat >= 56)) {\n LetterDesignator = 'V';\n }\n else if ((56 > lat) && (lat >= 48)) {\n LetterDesignator = 'U';\n }\n else if ((48 > lat) && (lat >= 40)) {\n LetterDesignator = 'T';\n }\n else if ((40 > lat) && (lat >= 32)) {\n LetterDesignator = 'S';\n }\n else if ((32 > lat) && (lat >= 24)) {\n LetterDesignator = 'R';\n }\n else if ((24 > lat) && (lat >= 16)) {\n LetterDesignator = 'Q';\n }\n else if ((16 > lat) && (lat >= 8)) {\n LetterDesignator = 'P';\n }\n else if ((8 > lat) && (lat >= 0)) {\n LetterDesignator = 'N';\n }\n else if ((0 > lat) && (lat >= -8)) {\n LetterDesignator = 'M';\n }\n else if ((-8 > lat) && (lat >= -16)) {\n LetterDesignator = 'L';\n }\n else if ((-16 > lat) && (lat >= -24)) {\n LetterDesignator = 'K';\n }\n else if ((-24 > lat) && (lat >= -32)) {\n LetterDesignator = 'J';\n }\n else if ((-32 > lat) && (lat >= -40)) {\n LetterDesignator = 'H';\n }\n else if ((-40 > lat) && (lat >= -48)) {\n LetterDesignator = 'G';\n }\n else if ((-48 > lat) && (lat >= -56)) {\n LetterDesignator = 'F';\n }\n else if ((-56 > lat) && (lat >= -64)) {\n LetterDesignator = 'E';\n }\n else if ((-64 > lat) && (lat >= -72)) {\n LetterDesignator = 'D';\n }\n else if ((-72 > lat) && (lat >= -80)) {\n LetterDesignator = 'C';\n }\n return LetterDesignator;\n}\n\n/**\n * Encodes a UTM location as MGRS string.\n *\n * @private\n * @param {object} utm An object literal with easting, northing,\n * zoneLetter, zoneNumber\n * @param {number} accuracy Accuracy in digits (1-5).\n * @return {string} MGRS string for the given UTM location.\n */\nfunction encode(utm, accuracy) {\n // prepend with leading zeroes\n var seasting = \"00000\" + utm.easting,\n snorthing = \"00000\" + utm.northing;\n\n return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy);\n}\n\n/**\n * Get the two letter 100k designator for a given UTM easting,\n * northing and zone number value.\n *\n * @private\n * @param {number} easting\n * @param {number} northing\n * @param {number} zoneNumber\n * @return the two letter 100k designator for the given UTM location.\n */\nfunction get100kID(easting, northing, zoneNumber) {\n var setParm = get100kSetForZone(zoneNumber);\n var setColumn = Math.floor(easting / 100000);\n var setRow = Math.floor(northing / 100000) % 20;\n return getLetter100kID(setColumn, setRow, setParm);\n}\n\n/**\n * Given a UTM zone number, figure out the MGRS 100K set it is in.\n *\n * @private\n * @param {number} i An UTM zone number.\n * @return {number} the 100k set the UTM zone is in.\n */\nfunction get100kSetForZone(i) {\n var setParm = i % NUM_100K_SETS;\n if (setParm === 0) {\n setParm = NUM_100K_SETS;\n }\n\n return setParm;\n}\n\n/**\n * Get the two-letter MGRS 100k designator given information\n * translated from the UTM northing, easting and zone number.\n *\n * @private\n * @param {number} column the column index as it relates to the MGRS\n * 100k set spreadsheet, created from the UTM easting.\n * Values are 1-8.\n * @param {number} row the row index as it relates to the MGRS 100k set\n * spreadsheet, created from the UTM northing value. Values\n * are from 0-19.\n * @param {number} parm the set block, as it relates to the MGRS 100k set\n * spreadsheet, created from the UTM zone. Values are from\n * 1-60.\n * @return two letter MGRS 100k code.\n */\nfunction getLetter100kID(column, row, parm) {\n // colOrigin and rowOrigin are the letters at the origin of the set\n var index = parm - 1;\n var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index);\n var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index);\n\n // colInt and rowInt are the letters to build to return\n var colInt = colOrigin + column - 1;\n var rowInt = rowOrigin + row;\n var rollover = false;\n\n if (colInt > Z) {\n colInt = colInt - Z + A - 1;\n rollover = true;\n }\n\n if (colInt === I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) {\n colInt++;\n }\n\n if (colInt === O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) {\n colInt++;\n\n if (colInt === I) {\n colInt++;\n }\n }\n\n if (colInt > Z) {\n colInt = colInt - Z + A - 1;\n }\n\n if (rowInt > V) {\n rowInt = rowInt - V + A - 1;\n rollover = true;\n }\n else {\n rollover = false;\n }\n\n if (((rowInt === I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I) || (rowOrigin < I)) && rollover)) {\n rowInt++;\n }\n\n if (((rowInt === O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O) || (rowOrigin < O)) && rollover)) {\n rowInt++;\n\n if (rowInt === I) {\n rowInt++;\n }\n }\n\n if (rowInt > V) {\n rowInt = rowInt - V + A - 1;\n }\n\n var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt);\n return twoLetter;\n}\n\n/**\n * Decode the UTM parameters from a MGRS string.\n *\n * @private\n * @param {string} mgrsString an UPPERCASE coordinate string is expected.\n * @return {object} An object literal with easting, northing, zoneLetter,\n * zoneNumber and accuracy (in meters) properties.\n */\nfunction decode(mgrsString) {\n\n if (mgrsString && mgrsString.length === 0) {\n throw (\"MGRSPoint coverting from nothing\");\n }\n\n var length = mgrsString.length;\n\n var hunK = null;\n var sb = \"\";\n var testChar;\n var i = 0;\n\n // get Zone number\n while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) {\n if (i >= 2) {\n throw (\"MGRSPoint bad conversion from: \" + mgrsString);\n }\n sb += testChar;\n i++;\n }\n\n var zoneNumber = parseInt(sb, 10);\n\n if (i === 0 || i + 3 > length) {\n // A good MGRS string has to be 4-5 digits long,\n // ##AAA/#AAA at least.\n throw (\"MGRSPoint bad conversion from: \" + mgrsString);\n }\n\n var zoneLetter = mgrsString.charAt(i++);\n\n // Should we check the zone letter here? Why not.\n if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') {\n throw (\"MGRSPoint zone letter \" + zoneLetter + \" not handled: \" + mgrsString);\n }\n\n hunK = mgrsString.substring(i, i += 2);\n\n var set = get100kSetForZone(zoneNumber);\n\n var east100k = getEastingFromChar(hunK.charAt(0), set);\n var north100k = getNorthingFromChar(hunK.charAt(1), set);\n\n // We have a bug where the northing may be 2000000 too low.\n // How\n // do we know when to roll over?\n\n while (north100k < getMinNorthing(zoneLetter)) {\n north100k += 2000000;\n }\n\n // calculate the char index for easting/northing separator\n var remainder = length - i;\n\n if (remainder % 2 !== 0) {\n 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);\n }\n\n var sep = remainder / 2;\n\n var sepEasting = 0.0;\n var sepNorthing = 0.0;\n var accuracyBonus, sepEastingString, sepNorthingString, easting, northing;\n if (sep > 0) {\n accuracyBonus = 100000.0 / Math.pow(10, sep);\n sepEastingString = mgrsString.substring(i, i + sep);\n sepEasting = parseFloat(sepEastingString) * accuracyBonus;\n sepNorthingString = mgrsString.substring(i + sep);\n sepNorthing = parseFloat(sepNorthingString) * accuracyBonus;\n }\n\n easting = sepEasting + east100k;\n northing = sepNorthing + north100k;\n\n return {\n easting: easting,\n northing: northing,\n zoneLetter: zoneLetter,\n zoneNumber: zoneNumber,\n accuracy: accuracyBonus\n };\n}\n\n/**\n * Given the first letter from a two-letter MGRS 100k zone, and given the\n * MGRS table set for the zone number, figure out the easting value that\n * should be added to the other, secondary easting value.\n *\n * @private\n * @param {char} e The first letter from a two-letter MGRS 100´k zone.\n * @param {number} set The MGRS table set for the zone number.\n * @return {number} The easting value for the given letter and set.\n */\nfunction getEastingFromChar(e, set) {\n // colOrigin is the letter at the origin of the set for the\n // column\n var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1);\n var eastingValue = 100000.0;\n var rewindMarker = false;\n\n while (curCol !== e.charCodeAt(0)) {\n curCol++;\n if (curCol === I) {\n curCol++;\n }\n if (curCol === O) {\n curCol++;\n }\n if (curCol > Z) {\n if (rewindMarker) {\n throw (\"Bad character: \" + e);\n }\n curCol = A;\n rewindMarker = true;\n }\n eastingValue += 100000.0;\n }\n\n return eastingValue;\n}\n\n/**\n * Given the second letter from a two-letter MGRS 100k zone, and given the\n * MGRS table set for the zone number, figure out the northing value that\n * should be added to the other, secondary northing value. You have to\n * remember that Northings are determined from the equator, and the vertical\n * cycle of letters mean a 2000000 additional northing meters. This happens\n * approx. every 18 degrees of latitude. This method does *NOT* count any\n * additional northings. You have to figure out how many 2000000 meters need\n * to be added for the zone letter of the MGRS coordinate.\n *\n * @private\n * @param {char} n Second letter of the MGRS 100k zone\n * @param {number} set The MGRS table set number, which is dependent on the\n * UTM zone number.\n * @return {number} The northing value for the given letter and set.\n */\nfunction getNorthingFromChar(n, set) {\n\n if (n > 'V') {\n throw (\"MGRSPoint given invalid Northing \" + n);\n }\n\n // rowOrigin is the letter at the origin of the set for the\n // column\n var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1);\n var northingValue = 0.0;\n var rewindMarker = false;\n\n while (curRow !== n.charCodeAt(0)) {\n curRow++;\n if (curRow === I) {\n curRow++;\n }\n if (curRow === O) {\n curRow++;\n }\n // fixing a bug making whole application hang in this loop\n // when 'n' is a wrong character\n if (curRow > V) {\n if (rewindMarker) { // making sure that this loop ends\n throw (\"Bad character: \" + n);\n }\n curRow = A;\n rewindMarker = true;\n }\n northingValue += 100000.0;\n }\n\n return northingValue;\n}\n\n/**\n * The function getMinNorthing returns the minimum northing value of a MGRS\n * zone.\n *\n * Ported from Geotrans' c Lattitude_Band_Value structure table.\n *\n * @private\n * @param {char} zoneLetter The MGRS zone to get the min northing for.\n * @return {number}\n */\nfunction getMinNorthing(zoneLetter) {\n var northing;\n switch (zoneLetter) {\n case 'C':\n northing = 1100000.0;\n break;\n case 'D':\n northing = 2000000.0;\n break;\n case 'E':\n northing = 2800000.0;\n break;\n case 'F':\n northing = 3700000.0;\n break;\n case 'G':\n northing = 4600000.0;\n break;\n case 'H':\n northing = 5500000.0;\n break;\n case 'J':\n northing = 6400000.0;\n break;\n case 'K':\n northing = 7300000.0;\n break;\n case 'L':\n northing = 8200000.0;\n break;\n case 'M':\n northing = 9100000.0;\n break;\n case 'N':\n northing = 0.0;\n break;\n case 'P':\n northing = 800000.0;\n break;\n case 'Q':\n northing = 1700000.0;\n break;\n case 'R':\n northing = 2600000.0;\n break;\n case 'S':\n northing = 3500000.0;\n break;\n case 'T':\n northing = 4400000.0;\n break;\n case 'U':\n northing = 5300000.0;\n break;\n case 'V':\n northing = 6200000.0;\n break;\n case 'W':\n northing = 7000000.0;\n break;\n case 'X':\n northing = 7900000.0;\n break;\n default:\n northing = -1.0;\n }\n if (northing >= 0.0) {\n return northing;\n }\n else {\n throw (\"Invalid zone letter: \" + zoneLetter);\n }\n\n}\n","import {toPoint, forward} from 'mgrs';\n\nfunction Point(x, y, z) {\n if (!(this instanceof Point)) {\n return new Point(x, y, z);\n }\n if (Array.isArray(x)) {\n this.x = x[0];\n this.y = x[1];\n this.z = x[2] || 0.0;\n } else if(typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z || 0.0;\n } else if (typeof x === 'string' && typeof y === 'undefined') {\n var coords = x.split(',');\n this.x = parseFloat(coords[0], 10);\n this.y = parseFloat(coords[1], 10);\n this.z = parseFloat(coords[2], 10) || 0.0;\n } else {\n this.x = x;\n this.y = y;\n this.z = z || 0.0;\n }\n console.warn('proj4.Point will be removed in version 3, use proj4.toPoint');\n}\n\nPoint.fromMGRS = function(mgrsStr) {\n return new Point(toPoint(mgrsStr));\n};\nPoint.prototype.toMGRS = function(accuracy) {\n return forward([this.x, this.y], accuracy);\n};\nexport default Point;\n","var C00 = 1;\nvar C02 = 0.25;\nvar C04 = 0.046875;\nvar C06 = 0.01953125;\nvar C08 = 0.01068115234375;\nvar C22 = 0.75;\nvar C44 = 0.46875;\nvar C46 = 0.01302083333333333333;\nvar C48 = 0.00712076822916666666;\nvar C66 = 0.36458333333333333333;\nvar C68 = 0.00569661458333333333;\nvar C88 = 0.3076171875;\n\nexport default function(es) {\n var en = [];\n en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08)));\n en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08)));\n var t = es * es;\n en[2] = t * (C44 - es * (C46 + es * C48));\n t *= es;\n en[3] = t * (C66 - es * C68);\n en[4] = t * es * C88;\n return en;\n}","export default function(phi, sphi, cphi, en) {\n cphi *= sphi;\n sphi *= sphi;\n return (en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4]))));\n}","import pj_mlfn from \"./pj_mlfn\";\nimport {EPSLN} from '../constants/values';\n\nvar MAX_ITER = 20;\n\nexport default function(arg, es, en) {\n var k = 1 / (1 - es);\n var phi = arg;\n for (var i = MAX_ITER; i; --i) { /* rarely goes over 2 iterations */\n var s = Math.sin(phi);\n var t = 1 - es * s * s;\n //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg;\n //phi -= t * (t * Math.sqrt(t)) * k;\n t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k;\n phi -= t;\n if (Math.abs(t) < EPSLN) {\n return phi;\n }\n }\n //..reportError(\"cass:pj_inv_mlfn: Convergence error\");\n return phi;\n}\n","// Heavily based on this tmerc projection implementation\n// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/tmerc.js\n\nimport pj_enfn from '../common/pj_enfn';\nimport pj_mlfn from '../common/pj_mlfn';\nimport pj_inv_mlfn from '../common/pj_inv_mlfn';\nimport adjust_lon from '../common/adjust_lon';\n\nimport {EPSLN, HALF_PI} from '../constants/values';\nimport sign from '../common/sign';\n\nexport function init() {\n this.x0 = this.x0 !== undefined ? this.x0 : 0;\n this.y0 = this.y0 !== undefined ? this.y0 : 0;\n this.long0 = this.long0 !== undefined ? this.long0 : 0;\n this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;\n\n if (this.es) {\n this.en = pj_enfn(this.es);\n this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en);\n }\n}\n\n/**\n Transverse Mercator Forward - long/lat to x/y\n long/lat in radians\n */\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n\n var delta_lon = adjust_lon(lon - this.long0);\n var con;\n var x, y;\n var sin_phi = Math.sin(lat);\n var cos_phi = Math.cos(lat);\n\n if (!this.es) {\n var b = cos_phi * Math.sin(delta_lon);\n\n if ((Math.abs(Math.abs(b) - 1)) < EPSLN) {\n return (93);\n }\n else {\n x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0;\n y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2));\n b = Math.abs(y);\n\n if (b >= 1) {\n if ((b - 1) > EPSLN) {\n return (93);\n }\n else {\n y = 0;\n }\n }\n else {\n y = Math.acos(y);\n }\n\n if (lat < 0) {\n y = -y;\n }\n\n y = this.a * this.k0 * (y - this.lat0) + this.y0;\n }\n }\n else {\n var al = cos_phi * delta_lon;\n var als = Math.pow(al, 2);\n var c = this.ep2 * Math.pow(cos_phi, 2);\n var cs = Math.pow(c, 2);\n var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0;\n var t = Math.pow(tq, 2);\n var ts = Math.pow(t, 2);\n con = 1 - this.es * Math.pow(sin_phi, 2);\n al = al / Math.sqrt(con);\n var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en);\n\n x = this.a * (this.k0 * al * (1 +\n als / 6 * (1 - t + c +\n als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c +\n als / 42 * (61 + 179 * ts - ts * t - 479 * t))))) +\n this.x0;\n\n y = this.a * (this.k0 * (ml - this.ml0 +\n sin_phi * delta_lon * al / 2 * (1 +\n als / 12 * (5 - t + 9 * c + 4 * cs +\n als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c +\n als / 56 * (1385 + 543 * ts - ts * t - 3111 * t)))))) +\n this.y0;\n }\n\n p.x = x;\n p.y = y;\n\n return p;\n}\n\n/**\n Transverse Mercator Inverse - x/y to long/lat\n */\nexport function inverse(p) {\n var con, phi;\n var lat, lon;\n var x = (p.x - this.x0) * (1 / this.a);\n var y = (p.y - this.y0) * (1 / this.a);\n\n if (!this.es) {\n var f = Math.exp(x / this.k0);\n var g = 0.5 * (f - 1 / f);\n var temp = this.lat0 + y / this.k0;\n var h = Math.cos(temp);\n con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2)));\n lat = Math.asin(con);\n\n if (y < 0) {\n lat = -lat;\n }\n\n if ((g === 0) && (h === 0)) {\n lon = 0;\n }\n else {\n lon = adjust_lon(Math.atan2(g, h) + this.long0);\n }\n }\n else { // ellipsoidal form\n con = this.ml0 + y / this.k0;\n phi = pj_inv_mlfn(con, this.es, this.en);\n\n if (Math.abs(phi) < HALF_PI) {\n var sin_phi = Math.sin(phi);\n var cos_phi = Math.cos(phi);\n var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0;\n var c = this.ep2 * Math.pow(cos_phi, 2);\n var cs = Math.pow(c, 2);\n var t = Math.pow(tan_phi, 2);\n var ts = Math.pow(t, 2);\n con = 1 - this.es * Math.pow(sin_phi, 2);\n var d = x * Math.sqrt(con) / this.k0;\n var ds = Math.pow(d, 2);\n con = con * tan_phi;\n\n lat = phi - (con * ds / (1 - this.es)) * 0.5 * (1 -\n ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs -\n ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c -\n ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t))));\n\n lon = adjust_lon(this.long0 + (d * (1 -\n ds / 6 * (1 + 2 * t + c -\n ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c -\n ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi));\n }\n else {\n lat = HALF_PI * sign(y);\n lon = 0;\n }\n }\n\n p.x = lon;\n p.y = lat;\n\n return p;\n}\n\nexport var names = [\"Fast_Transverse_Mercator\", \"Fast Transverse Mercator\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","export default function(x) {\n var r = Math.exp(x);\n r = (r - 1 / r) / 2;\n return r;\n}","export default function(x, y) {\n x = Math.abs(x);\n y = Math.abs(y);\n var a = Math.max(x, y);\n var b = Math.min(x, y) / (a ? a : 1);\n\n return a * Math.sqrt(1 + Math.pow(b, 2));\n}\n","import hypot from './hypot';\nimport log1py from './log1py';\n\nexport default function(x) {\n var y = Math.abs(x);\n y = log1py(y * (1 + y / (hypot(1, y) + 1)));\n\n return x < 0 ? -y : y;\n}\n","export default function(x) {\n var y = 1 + x;\n var z = y - 1;\n\n return z === 0 ? x : x * Math.log(y) / z;\n}\n","export default function(pp, B) {\n var cos_2B = 2 * Math.cos(2 * B);\n var i = pp.length - 1;\n var h1 = pp[i];\n var h2 = 0;\n var h;\n\n while (--i >= 0) {\n h = -h2 + cos_2B * h1 + pp[i];\n h2 = h1;\n h1 = h;\n }\n\n return (B + h * Math.sin(2 * B));\n}\n","import sinh from './sinh';\nimport cosh from './cosh';\n\nexport default function(pp, arg_r, arg_i) {\n var sin_arg_r = Math.sin(arg_r);\n var cos_arg_r = Math.cos(arg_r);\n var sinh_arg_i = sinh(arg_i);\n var cosh_arg_i = cosh(arg_i);\n var r = 2 * cos_arg_r * cosh_arg_i;\n var i = -2 * sin_arg_r * sinh_arg_i;\n var j = pp.length - 1;\n var hr = pp[j];\n var hi1 = 0;\n var hr1 = 0;\n var hi = 0;\n var hr2;\n var hi2;\n\n while (--j >= 0) {\n hr2 = hr1;\n hi2 = hi1;\n hr1 = hr;\n hi1 = hi;\n hr = -hr2 + r * hr1 - i * hi1 + pp[j];\n hi = -hi2 + i * hr1 + r * hi1;\n }\n\n r = sin_arg_r * cosh_arg_i;\n i = cos_arg_r * sinh_arg_i;\n\n return [r * hr - i * hi, r * hi + i * hr];\n}\n","export default function(x) {\n var r = Math.exp(x);\n r = (r + 1 / r) / 2;\n return r;\n}","// Heavily based on this etmerc projection implementation\n// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/etmerc.js\n\nimport tmerc from '../projections/tmerc';\nimport sinh from '../common/sinh';\nimport hypot from '../common/hypot';\nimport asinhy from '../common/asinhy';\nimport gatg from '../common/gatg';\nimport clens from '../common/clens';\nimport clens_cmplx from '../common/clens_cmplx';\nimport adjust_lon from '../common/adjust_lon';\n\nexport function init() {\n if (!this.approx && (isNaN(this.es) || this.es <= 0)) {\n throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION[\"Fast_Transverse_Mercator\"] in the WKT.');\n }\n if (this.approx) {\n // When '+approx' is set, use tmerc instead\n tmerc.init.apply(this);\n this.forward = tmerc.forward;\n this.inverse = tmerc.inverse;\n }\n\n this.x0 = this.x0 !== undefined ? this.x0 : 0;\n this.y0 = this.y0 !== undefined ? this.y0 : 0;\n this.long0 = this.long0 !== undefined ? this.long0 : 0;\n this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;\n\n this.cgb = [];\n this.cbg = [];\n this.utg = [];\n this.gtu = [];\n\n var f = this.es / (1 + Math.sqrt(1 - this.es));\n var n = f / (2 - f);\n var np = n;\n\n this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675 ))))));\n this.cbg[0] = n * (-2 + n * ( 2 / 3 + n * ( 4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725))))));\n\n np = np * n;\n this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945)))));\n this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * ( -13 / 9 + n * (904 / 315 + n * (-1522 / 945)))));\n\n np = np * n;\n this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835))));\n this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835))));\n\n np = np * n;\n this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175)));\n this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * ( -24832 / 14175)));\n\n np = np * n;\n this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237));\n this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185));\n\n np = np * n;\n this.cgb[5] = np * (601676 / 22275);\n this.cbg[5] = np * (444337 / 155925);\n\n np = Math.pow(n, 2);\n this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256)));\n\n this.utg[0] = n * (-0.5 + n * ( 2 / 3 + n * (-37 / 96 + n * ( 1 / 360 + n * (81 / 512 + n * (-96199 / 604800))))));\n this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800))))));\n\n this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720)))));\n this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360)))));\n\n np = np * n;\n this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720 ))));\n this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440))));\n\n np = np * n;\n this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600)));\n this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600)));\n\n np = np * n;\n this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680));\n this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840));\n\n np = np * n;\n this.utg[5] = np * (-20648693 / 638668800);\n this.gtu[5] = np * (212378941 / 319334400);\n\n var Z = gatg(this.cbg, this.lat0);\n this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z));\n}\n\nexport function forward(p) {\n var Ce = adjust_lon(p.x - this.long0);\n var Cn = p.y;\n\n Cn = gatg(this.cbg, Cn);\n var sin_Cn = Math.sin(Cn);\n var cos_Cn = Math.cos(Cn);\n var sin_Ce = Math.sin(Ce);\n var cos_Ce = Math.cos(Ce);\n\n Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn);\n Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce));\n Ce = asinhy(Math.tan(Ce));\n\n var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce);\n\n Cn = Cn + tmp[0];\n Ce = Ce + tmp[1];\n\n var x;\n var y;\n\n if (Math.abs(Ce) <= 2.623395162778) {\n x = this.a * (this.Qn * Ce) + this.x0;\n y = this.a * (this.Qn * Cn + this.Zb) + this.y0;\n }\n else {\n x = Infinity;\n y = Infinity;\n }\n\n p.x = x;\n p.y = y;\n\n return p;\n}\n\nexport function inverse(p) {\n var Ce = (p.x - this.x0) * (1 / this.a);\n var Cn = (p.y - this.y0) * (1 / this.a);\n\n Cn = (Cn - this.Zb) / this.Qn;\n Ce = Ce / this.Qn;\n\n var lon;\n var lat;\n\n if (Math.abs(Ce) <= 2.623395162778) {\n var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce);\n\n Cn = Cn + tmp[0];\n Ce = Ce + tmp[1];\n Ce = Math.atan(sinh(Ce));\n\n var sin_Cn = Math.sin(Cn);\n var cos_Cn = Math.cos(Cn);\n var sin_Ce = Math.sin(Ce);\n var cos_Ce = Math.cos(Ce);\n\n Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn));\n Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn);\n\n lon = adjust_lon(Ce + this.long0);\n lat = gatg(this.cgb, Cn);\n }\n else {\n lon = Infinity;\n lat = Infinity;\n }\n\n p.x = lon;\n p.y = lat;\n\n return p;\n}\n\nexport var names = [\"Extended_Transverse_Mercator\", \"Extended Transverse Mercator\", \"etmerc\", \"Transverse_Mercator\", \"Transverse Mercator\", \"tmerc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","export default function(pp, arg_r) {\n var r = 2 * Math.cos(arg_r);\n var i = pp.length - 1;\n var hr1 = pp[i];\n var hr2 = 0;\n var hr;\n\n while (--i >= 0) {\n hr = -hr2 + r * hr1 + pp[i];\n hr2 = hr1;\n hr1 = hr;\n }\n\n return Math.sin(arg_r) * hr;\n}\n","import adjust_zone from '../common/adjust_zone';\nimport etmerc from './etmerc';\nexport var dependsOn = 'etmerc';\nimport {D2R} from '../constants/values';\n\n\nexport function init() {\n var zone = adjust_zone(this.zone, this.long0);\n if (zone === undefined) {\n throw new Error('unknown utm zone');\n }\n this.lat0 = 0;\n this.long0 = ((6 * Math.abs(zone)) - 183) * D2R;\n this.x0 = 500000;\n this.y0 = this.utmSouth ? 10000000 : 0;\n this.k0 = 0.9996;\n\n etmerc.init.apply(this);\n this.forward = etmerc.forward;\n this.inverse = etmerc.inverse;\n}\n\nexport var names = [\"Universal Transverse Mercator System\", \"utm\"];\nexport default {\n init: init,\n names: names,\n dependsOn: dependsOn\n};\n","import adjust_lon from './adjust_lon';\n\nexport default function(zone, lon) {\n if (zone === undefined) {\n zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1;\n\n if (zone < 0) {\n return 0;\n } else if (zone > 60) {\n return 60;\n }\n }\n return zone;\n}\n","export default function(esinp, exp) {\n return (Math.pow((1 - esinp) / (1 + esinp), exp));\n}","import srat from '../common/srat';\nvar MAX_ITER = 20;\nimport {HALF_PI, FORTPI} from '../constants/values';\n\nexport function init() {\n var sphi = Math.sin(this.lat0);\n var cphi = Math.cos(this.lat0);\n cphi *= cphi;\n this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi);\n this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es));\n this.phic0 = Math.asin(sphi / this.C);\n this.ratexp = 0.5 * this.C * this.e;\n 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));\n}\n\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n\n 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;\n p.x = this.C * lon;\n return p;\n}\n\nexport function inverse(p) {\n var DEL_TOL = 1e-14;\n var lon = p.x / this.C;\n var lat = p.y;\n var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C);\n for (var i = MAX_ITER; i > 0; --i) {\n lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI;\n if (Math.abs(lat - p.y) < DEL_TOL) {\n break;\n }\n p.y = lat;\n }\n /* convergence failed */\n if (!i) {\n return null;\n }\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"gauss\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import gauss from './gauss';\nimport adjust_lon from '../common/adjust_lon';\n\nexport function init() {\n gauss.init.apply(this);\n if (!this.rc) {\n return;\n }\n this.sinc0 = Math.sin(this.phic0);\n this.cosc0 = Math.cos(this.phic0);\n this.R2 = 2 * this.rc;\n if (!this.title) {\n this.title = \"Oblique Stereographic Alternative\";\n }\n}\n\nexport function forward(p) {\n var sinc, cosc, cosl, k;\n p.x = adjust_lon(p.x - this.long0);\n gauss.forward.apply(this, [p]);\n sinc = Math.sin(p.y);\n cosc = Math.cos(p.y);\n cosl = Math.cos(p.x);\n k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl);\n p.x = k * cosc * Math.sin(p.x);\n p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl);\n p.x = this.a * p.x + this.x0;\n p.y = this.a * p.y + this.y0;\n return p;\n}\n\nexport function inverse(p) {\n var sinc, cosc, lon, lat, rho;\n p.x = (p.x - this.x0) / this.a;\n p.y = (p.y - this.y0) / this.a;\n\n p.x /= this.k0;\n p.y /= this.k0;\n if ((rho = Math.sqrt(p.x * p.x + p.y * p.y))) {\n var c = 2 * Math.atan2(rho, this.R2);\n sinc = Math.sin(c);\n cosc = Math.cos(c);\n lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho);\n lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc);\n }\n else {\n lat = this.phic0;\n lon = 0;\n }\n\n p.x = lon;\n p.y = lat;\n gauss.inverse.apply(this, [p]);\n p.x = adjust_lon(p.x + this.long0);\n return p;\n}\n\nexport var names = [\"Stereographic_North_Pole\", \"Oblique_Stereographic\", \"Polar_Stereographic\", \"sterea\",\"Oblique Stereographic Alternative\",\"Double_Stereographic\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import {EPSLN, HALF_PI} from '../constants/values';\n\nimport sign from '../common/sign';\nimport msfnz from '../common/msfnz';\nimport tsfnz from '../common/tsfnz';\nimport phi2z from '../common/phi2z';\nimport adjust_lon from '../common/adjust_lon';\n\nexport function ssfn_(phit, sinphi, eccen) {\n sinphi *= eccen;\n return (Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen));\n}\n\nexport function init() {\n this.coslat0 = Math.cos(this.lat0);\n this.sinlat0 = Math.sin(this.lat0);\n if (this.sphere) {\n if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {\n this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts));\n }\n }\n else {\n if (Math.abs(this.coslat0) <= EPSLN) {\n if (this.lat0 > 0) {\n //North pole\n //trace('stere:north pole');\n this.con = 1;\n }\n else {\n //South pole\n //trace('stere:south pole');\n this.con = -1;\n }\n }\n this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e));\n if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {\n 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));\n }\n this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0);\n this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI;\n this.cosX0 = Math.cos(this.X0);\n this.sinX0 = Math.sin(this.X0);\n }\n}\n\n// Stereographic forward equations--mapping lat,long to x,y\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n var sinlat = Math.sin(lat);\n var coslat = Math.cos(lat);\n var A, X, sinX, cosX, ts, rh;\n var dlon = adjust_lon(lon - this.long0);\n\n if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) {\n //case of the origine point\n //trace('stere:this is the origin point');\n p.x = NaN;\n p.y = NaN;\n return p;\n }\n if (this.sphere) {\n //trace('stere:sphere case');\n A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon));\n p.x = this.a * A * coslat * Math.sin(dlon) + this.x0;\n p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0;\n return p;\n }\n else {\n X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI;\n cosX = Math.cos(X);\n sinX = Math.sin(X);\n if (Math.abs(this.coslat0) <= EPSLN) {\n ts = tsfnz(this.e, lat * this.con, this.con * sinlat);\n rh = 2 * this.a * this.k0 * ts / this.cons;\n p.x = this.x0 + rh * Math.sin(lon - this.long0);\n p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0);\n //trace(p.toString());\n return p;\n }\n else if (Math.abs(this.sinlat0) < EPSLN) {\n //Eq\n //trace('stere:equateur');\n A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon));\n p.y = A * sinX;\n }\n else {\n //other case\n //trace('stere:normal case');\n A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon)));\n p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0;\n }\n p.x = A * cosX * Math.sin(dlon) + this.x0;\n }\n //trace(p.toString());\n return p;\n}\n\n//* Stereographic inverse equations--mapping x,y to lat/long\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n var lon, lat, ts, ce, Chi;\n var rh = Math.sqrt(p.x * p.x + p.y * p.y);\n if (this.sphere) {\n var c = 2 * Math.atan(rh / (2 * this.a * this.k0));\n lon = this.long0;\n lat = this.lat0;\n if (rh <= EPSLN) {\n p.x = lon;\n p.y = lat;\n return p;\n }\n lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh);\n if (Math.abs(this.coslat0) < EPSLN) {\n if (this.lat0 > 0) {\n lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y));\n }\n else {\n lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));\n }\n }\n else {\n 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)));\n }\n p.x = lon;\n p.y = lat;\n return p;\n }\n else {\n if (Math.abs(this.coslat0) <= EPSLN) {\n if (rh <= EPSLN) {\n lat = this.lat0;\n lon = this.long0;\n p.x = lon;\n p.y = lat;\n //trace(p.toString());\n return p;\n }\n p.x *= this.con;\n p.y *= this.con;\n ts = rh * this.cons / (2 * this.a * this.k0);\n lat = this.con * phi2z(this.e, ts);\n lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, - 1 * p.y));\n }\n else {\n ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1));\n lon = this.long0;\n if (rh <= EPSLN) {\n Chi = this.X0;\n }\n else {\n Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh);\n 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)));\n }\n lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi)));\n }\n }\n p.x = lon;\n p.y = lat;\n\n //trace(p.toString());\n return p;\n\n}\n\nexport var names = [\"stere\", \"Stereographic_South_Pole\", \"Polar Stereographic (variant B)\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names,\n ssfn_: ssfn_\n};\n","/*\n references:\n Formules et constantes pour le Calcul pour la\n projection cylindrique conforme à axe oblique et pour la transformation entre\n des systèmes de référence.\n http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf\n */\n\nexport function init() {\n var phy0 = this.lat0;\n this.lambda0 = this.long0;\n var sinPhy0 = Math.sin(phy0);\n var semiMajorAxis = this.a;\n var invF = this.rf;\n var flattening = 1 / invF;\n var e2 = 2 * flattening - Math.pow(flattening, 2);\n var e = this.e = Math.sqrt(e2);\n this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2));\n this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4));\n this.b0 = Math.asin(sinPhy0 / this.alpha);\n var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2));\n var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2));\n var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0));\n this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3;\n}\n\nexport function forward(p) {\n var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2));\n var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y)));\n var S = -this.alpha * (Sa1 + Sa2) + this.K;\n\n // spheric latitude\n var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4);\n\n // spheric longitude\n var I = this.alpha * (p.x - this.lambda0);\n\n // psoeudo equatorial rotation\n var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I)));\n\n var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I));\n\n p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0;\n p.x = this.R * rotI + this.x0;\n return p;\n}\n\nexport function inverse(p) {\n var Y = p.x - this.x0;\n var X = p.y - this.y0;\n\n var rotI = Y / this.R;\n var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4);\n\n var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));\n var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB)));\n\n var lambda = this.lambda0 + I / this.alpha;\n\n var S = 0;\n var phy = b;\n var prevPhy = -1000;\n var iteration = 0;\n while (Math.abs(phy - prevPhy) > 0.0000001) {\n if (++iteration > 20) {\n //...reportError(\"omercFwdInfinity\");\n return;\n }\n //S = Math.log(Math.tan(Math.PI / 4 + phy / 2));\n 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));\n prevPhy = phy;\n phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2;\n }\n\n p.x = lambda;\n p.y = phy;\n return p;\n}\n\nexport var names = [\"somerc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import tsfnz from '../common/tsfnz';\nimport adjust_lon from '../common/adjust_lon';\nimport phi2z from '../common/phi2z';\nimport { D2R, EPSLN, HALF_PI, TWO_PI, FORTPI } from '../constants/values';\n\nvar TOL = 1e-7;\n\nfunction isTypeA(P) {\n var typeAProjections = ['Hotine_Oblique_Mercator','Hotine_Oblique_Mercator_Azimuth_Natural_Origin'];\n var projectionName = typeof P.PROJECTION === \"object\" ? Object.keys(P.PROJECTION)[0] : P.PROJECTION;\n \n return 'no_uoff' in P || 'no_off' in P || typeAProjections.indexOf(projectionName) !== -1;\n}\n\n\n/* Initialize the Oblique Mercator projection\n ------------------------------------------*/\nexport function init() { \n var con, com, cosph0, D, F, H, L, sinph0, p, J, gamma = 0,\n gamma0, lamc = 0, lam1 = 0, lam2 = 0, phi1 = 0, phi2 = 0, alpha_c = 0, AB;\n \n // only Type A uses the no_off or no_uoff property\n // https://github.com/OSGeo/proj.4/issues/104\n this.no_off = isTypeA(this);\n this.no_rot = 'no_rot' in this;\n \n var alp = false;\n if (\"alpha\" in this) {\n alp = true;\n }\n\n var gam = false;\n if (\"rectified_grid_angle\" in this) {\n gam = true;\n }\n\n if (alp) {\n alpha_c = this.alpha;\n }\n \n if (gam) {\n gamma = (this.rectified_grid_angle * D2R);\n }\n \n if (alp || gam) {\n lamc = this.longc;\n } else {\n lam1 = this.long1;\n phi1 = this.lat1;\n lam2 = this.long2;\n phi2 = this.lat2;\n \n if (Math.abs(phi1 - phi2) <= TOL || (con = Math.abs(phi1)) <= TOL ||\n Math.abs(con - HALF_PI) <= TOL || Math.abs(Math.abs(this.lat0) - HALF_PI) <= TOL ||\n Math.abs(Math.abs(phi2) - HALF_PI) <= TOL) {\n throw new Error();\n }\n }\n \n var one_es = 1.0 - this.es;\n com = Math.sqrt(one_es);\n \n if (Math.abs(this.lat0) > EPSLN) {\n sinph0 = Math.sin(this.lat0);\n cosph0 = Math.cos(this.lat0);\n con = 1 - this.es * sinph0 * sinph0;\n this.B = cosph0 * cosph0;\n this.B = Math.sqrt(1 + this.es * this.B * this.B / one_es);\n this.A = this.B * this.k0 * com / con;\n D = this.B * com / (cosph0 * Math.sqrt(con));\n F = D * D -1;\n \n if (F <= 0) {\n F = 0;\n } else {\n F = Math.sqrt(F);\n if (this.lat0 < 0) {\n F = -F;\n }\n }\n \n this.E = F += D;\n this.E *= Math.pow(tsfnz(this.e, this.lat0, sinph0), this.B);\n } else {\n this.B = 1 / com;\n this.A = this.k0;\n this.E = D = F = 1;\n }\n \n if (alp || gam) {\n if (alp) {\n gamma0 = Math.asin(Math.sin(alpha_c) / D);\n if (!gam) {\n gamma = alpha_c;\n }\n } else {\n gamma0 = gamma;\n alpha_c = Math.asin(D * Math.sin(gamma0));\n }\n this.lam0 = lamc - Math.asin(0.5 * (F - 1 / F) * Math.tan(gamma0)) / this.B;\n } else {\n H = Math.pow(tsfnz(this.e, phi1, Math.sin(phi1)), this.B);\n L = Math.pow(tsfnz(this.e, phi2, Math.sin(phi2)), this.B);\n F = this.E / H;\n p = (L - H) / (L + H);\n J = this.E * this.E;\n J = (J - L * H) / (J + L * H);\n con = lam1 - lam2;\n \n if (con < -Math.pi) {\n lam2 -=TWO_PI;\n } else if (con > Math.pi) {\n lam2 += TWO_PI;\n }\n \n this.lam0 = adjust_lon(0.5 * (lam1 + lam2) - Math.atan(J * Math.tan(0.5 * this.B * (lam1 - lam2)) / p) / this.B);\n gamma0 = Math.atan(2 * Math.sin(this.B * adjust_lon(lam1 - this.lam0)) / (F - 1 / F));\n gamma = alpha_c = Math.asin(D * Math.sin(gamma0));\n }\n \n this.singam = Math.sin(gamma0);\n this.cosgam = Math.cos(gamma0);\n this.sinrot = Math.sin(gamma);\n this.cosrot = Math.cos(gamma);\n \n this.rB = 1 / this.B;\n this.ArB = this.A * this.rB;\n this.BrA = 1 / this.ArB;\n AB = this.A * this.B;\n \n if (this.no_off) {\n this.u_0 = 0;\n } else {\n this.u_0 = Math.abs(this.ArB * Math.atan(Math.sqrt(D * D - 1) / Math.cos(alpha_c)));\n \n if (this.lat0 < 0) {\n this.u_0 = - this.u_0;\n } \n }\n \n F = 0.5 * gamma0;\n this.v_pole_n = this.ArB * Math.log(Math.tan(FORTPI - F));\n this.v_pole_s = this.ArB * Math.log(Math.tan(FORTPI + F));\n}\n\n\n/* Oblique Mercator forward equations--mapping lat,long to x,y\n ----------------------------------------------------------*/\nexport function forward(p) {\n var coords = {};\n var S, T, U, V, W, temp, u, v;\n p.x = p.x - this.lam0;\n \n if (Math.abs(Math.abs(p.y) - HALF_PI) > EPSLN) {\n W = this.E / Math.pow(tsfnz(this.e, p.y, Math.sin(p.y)), this.B);\n \n temp = 1 / W;\n S = 0.5 * (W - temp);\n T = 0.5 * (W + temp);\n V = Math.sin(this.B * p.x);\n U = (S * this.singam - V * this.cosgam) / T;\n \n if (Math.abs(Math.abs(U) - 1.0) < EPSLN) {\n throw new Error();\n }\n \n v = 0.5 * this.ArB * Math.log((1 - U)/(1 + U));\n temp = Math.cos(this.B * p.x);\n \n if (Math.abs(temp) < TOL) {\n u = this.A * p.x;\n } else {\n u = this.ArB * Math.atan2((S * this.cosgam + V * this.singam), temp);\n } \n } else {\n v = p.y > 0 ? this.v_pole_n : this.v_pole_s;\n u = this.ArB * p.y;\n }\n \n if (this.no_rot) {\n coords.x = u;\n coords.y = v;\n } else {\n u -= this.u_0;\n coords.x = v * this.cosrot + u * this.sinrot;\n coords.y = u * this.cosrot - v * this.sinrot;\n }\n \n coords.x = (this.a * coords.x + this.x0);\n coords.y = (this.a * coords.y + this.y0);\n \n return coords;\n}\n\nexport function inverse(p) {\n var u, v, Qp, Sp, Tp, Vp, Up;\n var coords = {};\n \n p.x = (p.x - this.x0) * (1.0 / this.a);\n p.y = (p.y - this.y0) * (1.0 / this.a);\n\n if (this.no_rot) {\n v = p.y;\n u = p.x;\n } else {\n v = p.x * this.cosrot - p.y * this.sinrot;\n u = p.y * this.cosrot + p.x * this.sinrot + this.u_0;\n }\n \n Qp = Math.exp(-this.BrA * v);\n Sp = 0.5 * (Qp - 1 / Qp);\n Tp = 0.5 * (Qp + 1 / Qp);\n Vp = Math.sin(this.BrA * u);\n Up = (Vp * this.cosgam + Sp * this.singam) / Tp;\n \n if (Math.abs(Math.abs(Up) - 1) < EPSLN) {\n coords.x = 0;\n coords.y = Up < 0 ? -HALF_PI : HALF_PI;\n } else {\n coords.y = this.E / Math.sqrt((1 + Up) / (1 - Up));\n coords.y = phi2z(this.e, Math.pow(coords.y, 1 / this.B));\n \n if (coords.y === Infinity) {\n throw new Error();\n }\n \n coords.x = -this.rB * Math.atan2((Sp * this.cosgam - Vp * this.singam), Math.cos(this.BrA * u));\n }\n \n coords.x += this.lam0;\n \n return coords;\n}\n\nexport var names = [\"Hotine_Oblique_Mercator\", \"Hotine Oblique Mercator\", \"Hotine_Oblique_Mercator_Azimuth_Natural_Origin\", \"Hotine_Oblique_Mercator_Two_Point_Natural_Origin\", \"Hotine_Oblique_Mercator_Azimuth_Center\", \"Oblique_Mercator\", \"omerc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import msfnz from '../common/msfnz';\nimport tsfnz from '../common/tsfnz';\nimport sign from '../common/sign';\nimport adjust_lon from '../common/adjust_lon';\nimport phi2z from '../common/phi2z';\nimport {HALF_PI, EPSLN} from '../constants/values';\nexport function init() {\n \n //double lat0; /* the reference latitude */\n //double long0; /* the reference longitude */\n //double lat1; /* first standard parallel */\n //double lat2; /* second standard parallel */\n //double r_maj; /* major axis */\n //double r_min; /* minor axis */\n //double false_east; /* x offset in meters */\n //double false_north; /* y offset in meters */\n \n //the above value can be set with proj4.defs\n //example: proj4.defs(\"EPSG:2154\",\"+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs\");\n\n if (!this.lat2) {\n this.lat2 = this.lat1;\n } //if lat2 is not defined\n if (!this.k0) {\n this.k0 = 1;\n }\n this.x0 = this.x0 || 0;\n this.y0 = this.y0 || 0;\n // Standard Parallels cannot be equal and on opposite sides of the equator\n if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n return;\n }\n\n var temp = this.b / this.a;\n this.e = Math.sqrt(1 - temp * temp);\n\n var sin1 = Math.sin(this.lat1);\n var cos1 = Math.cos(this.lat1);\n var ms1 = msfnz(this.e, sin1, cos1);\n var ts1 = tsfnz(this.e, this.lat1, sin1);\n\n var sin2 = Math.sin(this.lat2);\n var cos2 = Math.cos(this.lat2);\n var ms2 = msfnz(this.e, sin2, cos2);\n var ts2 = tsfnz(this.e, this.lat2, sin2);\n\n var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0));\n\n if (Math.abs(this.lat1 - this.lat2) > EPSLN) {\n this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2);\n }\n else {\n this.ns = sin1;\n }\n if (isNaN(this.ns)) {\n this.ns = sin1;\n }\n this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));\n this.rh = this.a * this.f0 * Math.pow(ts0, this.ns);\n if (!this.title) {\n this.title = \"Lambert Conformal Conic\";\n }\n}\n\n// Lambert Conformal conic forward equations--mapping lat,long to x,y\n// -----------------------------------------------------------------\nexport function forward(p) {\n\n var lon = p.x;\n var lat = p.y;\n\n // singular cases :\n if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) {\n lat = sign(lat) * (HALF_PI - 2 * EPSLN);\n }\n\n var con = Math.abs(Math.abs(lat) - HALF_PI);\n var ts, rh1;\n if (con > EPSLN) {\n ts = tsfnz(this.e, lat, Math.sin(lat));\n rh1 = this.a * this.f0 * Math.pow(ts, this.ns);\n }\n else {\n con = lat * this.ns;\n if (con <= 0) {\n return null;\n }\n rh1 = 0;\n }\n var theta = this.ns * adjust_lon(lon - this.long0);\n p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;\n p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;\n\n return p;\n}\n\n// Lambert Conformal Conic inverse equations--mapping x,y to lat/long\n// -----------------------------------------------------------------\nexport function inverse(p) {\n\n var rh1, con, ts;\n var lat, lon;\n var x = (p.x - this.x0) / this.k0;\n var y = (this.rh - (p.y - this.y0) / this.k0);\n if (this.ns > 0) {\n rh1 = Math.sqrt(x * x + y * y);\n con = 1;\n }\n else {\n rh1 = -Math.sqrt(x * x + y * y);\n con = -1;\n }\n var theta = 0;\n if (rh1 !== 0) {\n theta = Math.atan2((con * x), (con * y));\n }\n if ((rh1 !== 0) || (this.ns > 0)) {\n con = 1 / this.ns;\n ts = Math.pow((rh1 / (this.a * this.f0)), con);\n lat = phi2z(this.e, ts);\n if (lat === -9999) {\n return null;\n }\n }\n else {\n lat = -HALF_PI;\n }\n lon = adjust_lon(theta / this.ns + this.long0);\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\n \"Lambert Tangential Conformal Conic Projection\",\n \"Lambert_Conformal_Conic\",\n \"Lambert_Conformal_Conic_1SP\",\n \"Lambert_Conformal_Conic_2SP\",\n \"lcc\",\n \"Lambert Conic Conformal (1SP)\",\n \"Lambert Conic Conformal (2SP)\"\n];\n\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\n\nexport function init() {\n this.a = 6377397.155;\n this.es = 0.006674372230614;\n this.e = Math.sqrt(this.es);\n if (!this.lat0) {\n this.lat0 = 0.863937979737193;\n }\n if (!this.long0) {\n this.long0 = 0.7417649320975901 - 0.308341501185665;\n }\n /* if scale not set default to 0.9999 */\n if (!this.k0) {\n this.k0 = 0.9999;\n }\n this.s45 = 0.785398163397448; /* 45 */\n this.s90 = 2 * this.s45;\n this.fi0 = this.lat0;\n this.e2 = this.es;\n this.e = Math.sqrt(this.e2);\n this.alfa = Math.sqrt(1 + (this.e2 * Math.pow(Math.cos(this.fi0), 4)) / (1 - this.e2));\n this.uq = 1.04216856380474;\n this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa);\n this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2);\n this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g;\n this.k1 = this.k0;\n this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2));\n this.s0 = 1.37008346281555;\n this.n = Math.sin(this.s0);\n this.ro0 = this.k1 * this.n0 / Math.tan(this.s0);\n this.ad = this.s90 - this.uq;\n}\n\n/* ellipsoid */\n/* calculate xy from lat/lon */\n/* Constants, identical to inverse transform function */\nexport function forward(p) {\n var gfi, u, deltav, s, d, eps, ro;\n var lon = p.x;\n var lat = p.y;\n var delta_lon = adjust_lon(lon - this.long0);\n /* Transformation */\n gfi = Math.pow(((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat))), (this.alfa * this.e / 2));\n u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45);\n deltav = -delta_lon * this.alfa;\n s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav));\n d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s));\n eps = this.n * d;\n ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n);\n p.y = ro * Math.cos(eps) / 1;\n p.x = ro * Math.sin(eps) / 1;\n\n if (!this.czech) {\n p.y *= -1;\n p.x *= -1;\n }\n return (p);\n}\n\n/* calculate lat/lon from xy */\nexport function inverse(p) {\n var u, deltav, s, d, eps, ro, fi1;\n var ok;\n\n /* Transformation */\n /* revert y, x*/\n var tmp = p.x;\n p.x = p.y;\n p.y = tmp;\n if (!this.czech) {\n p.y *= -1;\n p.x *= -1;\n }\n ro = Math.sqrt(p.x * p.x + p.y * p.y);\n eps = Math.atan2(p.y, p.x);\n d = eps / Math.sin(this.s0);\n s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45);\n u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d));\n deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u));\n p.x = this.long0 - deltav / this.alfa;\n fi1 = u;\n ok = 0;\n var iter = 0;\n do {\n 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);\n if (Math.abs(fi1 - p.y) < 0.0000000001) {\n ok = 1;\n }\n fi1 = p.y;\n iter += 1;\n } while (ok === 0 && iter < 15);\n if (iter >= 15) {\n return null;\n }\n\n return (p);\n}\n\nexport var names = [\"Krovak\", \"krovak\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","export default function(e0, e1, e2, e3, phi) {\n return (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi));\n}","export default function(x) {\n return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x)));\n}","export default function(x) {\n return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x)));\n}","export default function(x) {\n return (0.05859375 * x * x * (1 + 0.75 * x));\n}","export default function(x) {\n return (x * x * x * (35 / 3072));\n}","export default function(a, e, sinphi) {\n var temp = e * sinphi;\n return a / Math.sqrt(1 - temp * temp);\n}","import {HALF_PI} from '../constants/values';\nimport sign from './sign';\n\nexport default function(x) {\n return (Math.abs(x) < HALF_PI) ? x : (x - (sign(x) * Math.PI));\n}\n","export default function(ml, e0, e1, e2, e3) {\n var phi;\n var dphi;\n\n phi = ml / e0;\n for (var i = 0; i < 15; i++) {\n 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));\n phi += dphi;\n if (Math.abs(dphi) <= 0.0000000001) {\n return phi;\n }\n }\n\n //..reportError(\"IMLFN-CONV:Latitude failed to converge after 15 iterations\");\n return NaN;\n}","import mlfn from '../common/mlfn';\nimport e0fn from '../common/e0fn';\nimport e1fn from '../common/e1fn';\nimport e2fn from '../common/e2fn';\nimport e3fn from '../common/e3fn';\nimport gN from '../common/gN';\nimport adjust_lon from '../common/adjust_lon';\nimport adjust_lat from '../common/adjust_lat';\nimport imlfn from '../common/imlfn';\nimport {HALF_PI, EPSLN} from '../constants/values';\n\nexport function init() {\n if (!this.sphere) {\n this.e0 = e0fn(this.es);\n this.e1 = e1fn(this.es);\n this.e2 = e2fn(this.es);\n this.e3 = e3fn(this.es);\n this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);\n }\n}\n\n/* Cassini forward equations--mapping lat,long to x,y\n -----------------------------------------------------------------------*/\nexport function forward(p) {\n\n /* Forward equations\n -----------------*/\n var x, y;\n var lam = p.x;\n var phi = p.y;\n lam = adjust_lon(lam - this.long0);\n\n if (this.sphere) {\n x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam));\n y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0);\n }\n else {\n //ellipsoid\n var sinphi = Math.sin(phi);\n var cosphi = Math.cos(phi);\n var nl = gN(this.a, this.e, sinphi);\n var tl = Math.tan(phi) * Math.tan(phi);\n var al = lam * Math.cos(phi);\n var asq = al * al;\n var cl = this.es * cosphi * cosphi / (1 - this.es);\n var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);\n\n x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120));\n y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24);\n\n\n }\n\n p.x = x + this.x0;\n p.y = y + this.y0;\n return p;\n}\n\n/* Inverse equations\n -----------------*/\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n var x = p.x / this.a;\n var y = p.y / this.a;\n var phi, lam;\n\n if (this.sphere) {\n var dd = y + this.lat0;\n phi = Math.asin(Math.sin(dd) * Math.cos(x));\n lam = Math.atan2(Math.tan(x), Math.cos(dd));\n }\n else {\n /* ellipsoid */\n var ml1 = this.ml0 / this.a + y;\n var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3);\n if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) {\n p.x = this.long0;\n p.y = HALF_PI;\n if (y < 0) {\n p.y *= -1;\n }\n return p;\n }\n var nl1 = gN(this.a, this.e, Math.sin(phi1));\n\n var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es);\n var tl1 = Math.pow(Math.tan(phi1), 2);\n var dl = x * this.a / nl1;\n var dsq = dl * dl;\n phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24);\n lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1);\n\n }\n\n p.x = adjust_lon(lam + this.long0);\n p.y = adjust_lat(phi);\n return p;\n\n}\n\nexport var names = [\"Cassini\", \"Cassini_Soldner\", \"cass\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","export default function(eccent, sinphi) {\n var con;\n if (eccent > 1.0e-7) {\n con = eccent * sinphi;\n return ((1 - eccent * eccent) * (sinphi / (1 - con * con) - (0.5 / eccent) * Math.log((1 - con) / (1 + con))));\n }\n else {\n return (2 * sinphi);\n }\n}","\nimport {HALF_PI, EPSLN, FORTPI} from '../constants/values';\n\nimport qsfnz from '../common/qsfnz';\nimport adjust_lon from '../common/adjust_lon';\n\n/*\n reference\n \"New Equal-Area Map Projections for Noncircular Regions\", John P. Snyder,\n The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.\n */\n\nexport var S_POLE = 1;\n\nexport var N_POLE = 2;\nexport var EQUIT = 3;\nexport var OBLIQ = 4;\n\n/* Initialize the Lambert Azimuthal Equal Area projection\n ------------------------------------------------------*/\nexport function init() {\n var t = Math.abs(this.lat0);\n if (Math.abs(t - HALF_PI) < EPSLN) {\n this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE;\n }\n else if (Math.abs(t) < EPSLN) {\n this.mode = this.EQUIT;\n }\n else {\n this.mode = this.OBLIQ;\n }\n if (this.es > 0) {\n var sinphi;\n\n this.qp = qsfnz(this.e, 1);\n this.mmf = 0.5 / (1 - this.es);\n this.apa = authset(this.es);\n switch (this.mode) {\n case this.N_POLE:\n this.dd = 1;\n break;\n case this.S_POLE:\n this.dd = 1;\n break;\n case this.EQUIT:\n this.rq = Math.sqrt(0.5 * this.qp);\n this.dd = 1 / this.rq;\n this.xmf = 1;\n this.ymf = 0.5 * this.qp;\n break;\n case this.OBLIQ:\n this.rq = Math.sqrt(0.5 * this.qp);\n sinphi = Math.sin(this.lat0);\n this.sinb1 = qsfnz(this.e, sinphi) / this.qp;\n this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1);\n this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1);\n this.ymf = (this.xmf = this.rq) / this.dd;\n this.xmf *= this.dd;\n break;\n }\n }\n else {\n if (this.mode === this.OBLIQ) {\n this.sinph0 = Math.sin(this.lat0);\n this.cosph0 = Math.cos(this.lat0);\n }\n }\n}\n\n/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y\n -----------------------------------------------------------------------*/\nexport function forward(p) {\n\n /* Forward equations\n -----------------*/\n var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi;\n var lam = p.x;\n var phi = p.y;\n\n lam = adjust_lon(lam - this.long0);\n if (this.sphere) {\n sinphi = Math.sin(phi);\n cosphi = Math.cos(phi);\n coslam = Math.cos(lam);\n if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n y = (this.mode === this.EQUIT) ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;\n if (y <= EPSLN) {\n return null;\n }\n y = Math.sqrt(2 / y);\n x = y * cosphi * Math.sin(lam);\n y *= (this.mode === this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;\n }\n else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {\n if (this.mode === this.N_POLE) {\n coslam = -coslam;\n }\n if (Math.abs(phi + this.lat0) < EPSLN) {\n return null;\n }\n y = FORTPI - phi * 0.5;\n y = 2 * ((this.mode === this.S_POLE) ? Math.cos(y) : Math.sin(y));\n x = y * Math.sin(lam);\n y *= coslam;\n }\n }\n else {\n sinb = 0;\n cosb = 0;\n b = 0;\n coslam = Math.cos(lam);\n sinlam = Math.sin(lam);\n sinphi = Math.sin(phi);\n q = qsfnz(this.e, sinphi);\n if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n sinb = q / this.qp;\n cosb = Math.sqrt(1 - sinb * sinb);\n }\n switch (this.mode) {\n case this.OBLIQ:\n b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam;\n break;\n case this.EQUIT:\n b = 1 + cosb * coslam;\n break;\n case this.N_POLE:\n b = HALF_PI + phi;\n q = this.qp - q;\n break;\n case this.S_POLE:\n b = phi - HALF_PI;\n q = this.qp + q;\n break;\n }\n if (Math.abs(b) < EPSLN) {\n return null;\n }\n switch (this.mode) {\n case this.OBLIQ:\n case this.EQUIT:\n b = Math.sqrt(2 / b);\n if (this.mode === this.OBLIQ) {\n y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam);\n }\n else {\n y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf;\n }\n x = this.xmf * b * cosb * sinlam;\n break;\n case this.N_POLE:\n case this.S_POLE:\n if (q >= 0) {\n x = (b = Math.sqrt(q)) * sinlam;\n y = coslam * ((this.mode === this.S_POLE) ? b : -b);\n }\n else {\n x = y = 0;\n }\n break;\n }\n }\n\n p.x = this.a * x + this.x0;\n p.y = this.a * y + this.y0;\n return p;\n}\n\n/* Inverse equations\n -----------------*/\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n var x = p.x / this.a;\n var y = p.y / this.a;\n var lam, phi, cCe, sCe, q, rho, ab;\n if (this.sphere) {\n var cosz = 0,\n rh, sinz = 0;\n\n rh = Math.sqrt(x * x + y * y);\n phi = rh * 0.5;\n if (phi > 1) {\n return null;\n }\n phi = 2 * Math.asin(phi);\n if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n sinz = Math.sin(phi);\n cosz = Math.cos(phi);\n }\n switch (this.mode) {\n case this.EQUIT:\n phi = (Math.abs(rh) <= EPSLN) ? 0 : Math.asin(y * sinz / rh);\n x *= sinz;\n y = cosz * rh;\n break;\n case this.OBLIQ:\n phi = (Math.abs(rh) <= EPSLN) ? this.lat0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh);\n x *= sinz * this.cosph0;\n y = (cosz - Math.sin(phi) * this.sinph0) * rh;\n break;\n case this.N_POLE:\n y = -y;\n phi = HALF_PI - phi;\n break;\n case this.S_POLE:\n phi -= HALF_PI;\n break;\n }\n lam = (y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ)) ? 0 : Math.atan2(x, y);\n }\n else {\n ab = 0;\n if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n x /= this.dd;\n y *= this.dd;\n rho = Math.sqrt(x * x + y * y);\n if (rho < EPSLN) {\n p.x = this.long0;\n p.y = this.lat0;\n return p;\n }\n sCe = 2 * Math.asin(0.5 * rho / this.rq);\n cCe = Math.cos(sCe);\n x *= (sCe = Math.sin(sCe));\n if (this.mode === this.OBLIQ) {\n ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho;\n q = this.qp * ab;\n y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe;\n }\n else {\n ab = y * sCe / rho;\n q = this.qp * ab;\n y = rho * cCe;\n }\n }\n else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {\n if (this.mode === this.N_POLE) {\n y = -y;\n }\n q = (x * x + y * y);\n if (!q) {\n p.x = this.long0;\n p.y = this.lat0;\n return p;\n }\n ab = 1 - q / this.qp;\n if (this.mode === this.S_POLE) {\n ab = -ab;\n }\n }\n lam = Math.atan2(x, y);\n phi = authlat(Math.asin(ab), this.apa);\n }\n\n p.x = adjust_lon(this.long0 + lam);\n p.y = phi;\n return p;\n}\n\n/* determine latitude from authalic latitude */\nvar P00 = 0.33333333333333333333;\n\nvar P01 = 0.17222222222222222222;\nvar P02 = 0.10257936507936507936;\nvar P10 = 0.06388888888888888888;\nvar P11 = 0.06640211640211640211;\nvar P20 = 0.01641501294219154443;\n\nfunction authset(es) {\n var t;\n var APA = [];\n APA[0] = es * P00;\n t = es * es;\n APA[0] += t * P01;\n APA[1] = t * P10;\n t *= es;\n APA[0] += t * P02;\n APA[1] += t * P11;\n APA[2] = t * P20;\n return APA;\n}\n\nfunction authlat(beta, APA) {\n var t = beta + beta;\n return (beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t));\n}\n\nexport var names = [\"Lambert Azimuthal Equal Area\", \"Lambert_Azimuthal_Equal_Area\", \"laea\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names,\n S_POLE: S_POLE,\n N_POLE: N_POLE,\n EQUIT: EQUIT,\n OBLIQ: OBLIQ\n};\n","export default function(x) {\n if (Math.abs(x) > 1) {\n x = (x > 1) ? 1 : -1;\n }\n return Math.asin(x);\n}","import msfnz from '../common/msfnz';\nimport qsfnz from '../common/qsfnz';\nimport adjust_lon from '../common/adjust_lon';\nimport asinz from '../common/asinz';\nimport {EPSLN} from '../constants/values';\n\nexport function init() {\n\n if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n return;\n }\n this.temp = this.b / this.a;\n this.es = 1 - Math.pow(this.temp, 2);\n this.e3 = Math.sqrt(this.es);\n\n this.sin_po = Math.sin(this.lat1);\n this.cos_po = Math.cos(this.lat1);\n this.t1 = this.sin_po;\n this.con = this.sin_po;\n this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po);\n this.qs1 = qsfnz(this.e3, this.sin_po);\n\n this.sin_po = Math.sin(this.lat2);\n this.cos_po = Math.cos(this.lat2);\n this.t2 = this.sin_po;\n this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po);\n this.qs2 = qsfnz(this.e3, this.sin_po);\n\n this.sin_po = Math.sin(this.lat0);\n this.cos_po = Math.cos(this.lat0);\n this.t3 = this.sin_po;\n this.qs0 = qsfnz(this.e3, this.sin_po);\n\n if (Math.abs(this.lat1 - this.lat2) > EPSLN) {\n this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1);\n }\n else {\n this.ns0 = this.con;\n }\n this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1;\n this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0;\n}\n\n/* Albers Conical Equal Area forward equations--mapping lat,long to x,y\n -------------------------------------------------------------------*/\nexport function forward(p) {\n\n var lon = p.x;\n var lat = p.y;\n\n this.sin_phi = Math.sin(lat);\n this.cos_phi = Math.cos(lat);\n\n var qs = qsfnz(this.e3, this.sin_phi);\n var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0;\n var theta = this.ns0 * adjust_lon(lon - this.long0);\n var x = rh1 * Math.sin(theta) + this.x0;\n var y = this.rh - rh1 * Math.cos(theta) + this.y0;\n\n p.x = x;\n p.y = y;\n return p;\n}\n\nexport function inverse(p) {\n var rh1, qs, con, theta, lon, lat;\n\n p.x -= this.x0;\n p.y = this.rh - p.y + this.y0;\n if (this.ns0 >= 0) {\n rh1 = Math.sqrt(p.x * p.x + p.y * p.y);\n con = 1;\n }\n else {\n rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);\n con = -1;\n }\n theta = 0;\n if (rh1 !== 0) {\n theta = Math.atan2(con * p.x, con * p.y);\n }\n con = rh1 * this.ns0 / this.a;\n if (this.sphere) {\n lat = Math.asin((this.c - con * con) / (2 * this.ns0));\n }\n else {\n qs = (this.c - con * con) / this.ns0;\n lat = this.phi1z(this.e3, qs);\n }\n\n lon = adjust_lon(theta / this.ns0 + this.long0);\n p.x = lon;\n p.y = lat;\n return p;\n}\n\n/* Function to compute phi1, the latitude for the inverse of the\n Albers Conical Equal-Area projection.\n-------------------------------------------*/\nexport function phi1z(eccent, qs) {\n var sinphi, cosphi, con, com, dphi;\n var phi = asinz(0.5 * qs);\n if (eccent < EPSLN) {\n return phi;\n }\n\n var eccnts = eccent * eccent;\n for (var i = 1; i <= 25; i++) {\n sinphi = Math.sin(phi);\n cosphi = Math.cos(phi);\n con = eccent * sinphi;\n com = 1 - con * con;\n dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con)));\n phi = phi + dphi;\n if (Math.abs(dphi) <= 1e-7) {\n return phi;\n }\n }\n return null;\n}\n\nexport var names = [\"Albers_Conic_Equal_Area\", \"Albers\", \"aea\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names,\n phi1z: phi1z\n};\n","import adjust_lon from '../common/adjust_lon';\nimport asinz from '../common/asinz';\nimport {EPSLN} from '../constants/values';\n\n/*\n reference:\n Wolfram Mathworld \"Gnomonic Projection\"\n http://mathworld.wolfram.com/GnomonicProjection.html\n Accessed: 12th November 2009\n */\nexport function init() {\n\n /* Place parameters in static storage for common use\n -------------------------------------------------*/\n this.sin_p14 = Math.sin(this.lat0);\n this.cos_p14 = Math.cos(this.lat0);\n // Approximation for projecting points to the horizon (infinity)\n this.infinity_dist = 1000 * this.a;\n this.rc = 1;\n}\n\n/* Gnomonic forward equations--mapping lat,long to x,y\n ---------------------------------------------------*/\nexport function forward(p) {\n var sinphi, cosphi; /* sin and cos value */\n var dlon; /* delta longitude value */\n var coslon; /* cos of longitude */\n var ksp; /* scale factor */\n var g;\n var x, y;\n var lon = p.x;\n var lat = p.y;\n /* Forward equations\n -----------------*/\n dlon = adjust_lon(lon - this.long0);\n\n sinphi = Math.sin(lat);\n cosphi = Math.cos(lat);\n\n coslon = Math.cos(dlon);\n g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;\n ksp = 1;\n if ((g > 0) || (Math.abs(g) <= EPSLN)) {\n x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g;\n y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g;\n }\n else {\n\n // Point is in the opposing hemisphere and is unprojectable\n // We still need to return a reasonable point, so we project\n // to infinity, on a bearing\n // equivalent to the northern hemisphere equivalent\n // This is a reasonable approximation for short shapes and lines that\n // straddle the horizon.\n\n x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon);\n y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);\n\n }\n p.x = x;\n p.y = y;\n return p;\n}\n\nexport function inverse(p) {\n var rh; /* Rho */\n var sinc, cosc;\n var c;\n var lon, lat;\n\n /* Inverse equations\n -----------------*/\n p.x = (p.x - this.x0) / this.a;\n p.y = (p.y - this.y0) / this.a;\n\n p.x /= this.k0;\n p.y /= this.k0;\n\n if ((rh = Math.sqrt(p.x * p.x + p.y * p.y))) {\n c = Math.atan2(rh, this.rc);\n sinc = Math.sin(c);\n cosc = Math.cos(c);\n\n lat = asinz(cosc * this.sin_p14 + (p.y * sinc * this.cos_p14) / rh);\n lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc);\n lon = adjust_lon(this.long0 + lon);\n }\n else {\n lat = this.phic0;\n lon = 0;\n }\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"gnom\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\nimport qsfnz from '../common/qsfnz';\nimport msfnz from '../common/msfnz';\nimport iqsfnz from '../common/iqsfnz';\n\n/*\n reference:\n \"Cartographic Projection Procedures for the UNIX Environment-\n A User's Manual\" by Gerald I. Evenden,\n USGS Open File Report 90-284and Release 4 Interim Reports (2003)\n*/\nexport function init() {\n //no-op\n if (!this.sphere) {\n this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));\n }\n}\n\n/* Cylindrical Equal Area forward equations--mapping lat,long to x,y\n ------------------------------------------------------------*/\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n var x, y;\n /* Forward equations\n -----------------*/\n var dlon = adjust_lon(lon - this.long0);\n if (this.sphere) {\n x = this.x0 + this.a * dlon * Math.cos(this.lat_ts);\n y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts);\n }\n else {\n var qs = qsfnz(this.e, Math.sin(lat));\n x = this.x0 + this.a * this.k0 * dlon;\n y = this.y0 + this.a * qs * 0.5 / this.k0;\n }\n\n p.x = x;\n p.y = y;\n return p;\n}\n\n/* Cylindrical Equal Area inverse equations--mapping x,y to lat/long\n ------------------------------------------------------------*/\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n var lon, lat;\n\n if (this.sphere) {\n lon = adjust_lon(this.long0 + (p.x / this.a) / Math.cos(this.lat_ts));\n lat = Math.asin((p.y / this.a) * Math.cos(this.lat_ts));\n }\n else {\n lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a);\n lon = adjust_lon(this.long0 + p.x / (this.a * this.k0));\n }\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"cea\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import {HALF_PI} from '../constants/values';\n\nexport default function(eccent, q) {\n var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent));\n if (Math.abs(Math.abs(q) - temp) < 1.0E-6) {\n if (q < 0) {\n return (-1 * HALF_PI);\n }\n else {\n return HALF_PI;\n }\n }\n //var phi = 0.5* q/(1-eccent*eccent);\n var phi = Math.asin(0.5 * q);\n var dphi;\n var sin_phi;\n var cos_phi;\n var con;\n for (var i = 0; i < 30; i++) {\n sin_phi = Math.sin(phi);\n cos_phi = Math.cos(phi);\n con = eccent * sin_phi;\n 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)));\n phi += dphi;\n if (Math.abs(dphi) <= 0.0000000001) {\n return phi;\n }\n }\n\n //console.log(\"IQSFN-CONV:Latitude failed to converge after 30 iterations\");\n return NaN;\n}\n","import adjust_lon from '../common/adjust_lon';\nimport adjust_lat from '../common/adjust_lat';\n\nexport function init() {\n\n this.x0 = this.x0 || 0;\n this.y0 = this.y0 || 0;\n this.lat0 = this.lat0 || 0;\n this.long0 = this.long0 || 0;\n this.lat_ts = this.lat_ts || 0;\n this.title = this.title || \"Equidistant Cylindrical (Plate Carre)\";\n\n this.rc = Math.cos(this.lat_ts);\n}\n\n// forward equations--mapping lat,long to x,y\n// -----------------------------------------------------------------\nexport function forward(p) {\n\n var lon = p.x;\n var lat = p.y;\n\n var dlon = adjust_lon(lon - this.long0);\n var dlat = adjust_lat(lat - this.lat0);\n p.x = this.x0 + (this.a * dlon * this.rc);\n p.y = this.y0 + (this.a * dlat);\n return p;\n}\n\n// inverse equations--mapping x,y to lat/long\n// -----------------------------------------------------------------\nexport function inverse(p) {\n\n var x = p.x;\n var y = p.y;\n\n p.x = adjust_lon(this.long0 + ((x - this.x0) / (this.a * this.rc)));\n p.y = adjust_lat(this.lat0 + ((y - this.y0) / (this.a)));\n return p;\n}\n\nexport var names = [\"Equirectangular\", \"Equidistant_Cylindrical\", \"eqc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import e0fn from '../common/e0fn';\nimport e1fn from '../common/e1fn';\nimport e2fn from '../common/e2fn';\nimport e3fn from '../common/e3fn';\nimport adjust_lon from '../common/adjust_lon';\nimport adjust_lat from '../common/adjust_lat';\nimport mlfn from '../common/mlfn';\nimport {EPSLN} from '../constants/values';\n\nimport gN from '../common/gN';\nvar MAX_ITER = 20;\n\nexport function init() {\n /* Place parameters in static storage for common use\n -------------------------------------------------*/\n this.temp = this.b / this.a;\n 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\n this.e = Math.sqrt(this.es);\n this.e0 = e0fn(this.es);\n this.e1 = e1fn(this.es);\n this.e2 = e2fn(this.es);\n this.e3 = e3fn(this.es);\n 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\n}\n\n/* Polyconic forward equations--mapping lat,long to x,y\n ---------------------------------------------------*/\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n var x, y, el;\n var dlon = adjust_lon(lon - this.long0);\n el = dlon * Math.sin(lat);\n if (this.sphere) {\n if (Math.abs(lat) <= EPSLN) {\n x = this.a * dlon;\n y = -1 * this.a * this.lat0;\n }\n else {\n x = this.a * Math.sin(el) / Math.tan(lat);\n y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat));\n }\n }\n else {\n if (Math.abs(lat) <= EPSLN) {\n x = this.a * dlon;\n y = -1 * this.ml0;\n }\n else {\n var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat);\n x = nl * Math.sin(el);\n y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el));\n }\n\n }\n p.x = x + this.x0;\n p.y = y + this.y0;\n return p;\n}\n\n/* Inverse equations\n -----------------*/\nexport function inverse(p) {\n var lon, lat, x, y, i;\n var al, bl;\n var phi, dphi;\n x = p.x - this.x0;\n y = p.y - this.y0;\n\n if (this.sphere) {\n if (Math.abs(y + this.a * this.lat0) <= EPSLN) {\n lon = adjust_lon(x / this.a + this.long0);\n lat = 0;\n }\n else {\n al = this.lat0 + y / this.a;\n bl = x * x / this.a / this.a + al * al;\n phi = al;\n var tanphi;\n for (i = MAX_ITER; i; --i) {\n tanphi = Math.tan(phi);\n dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1);\n phi += dphi;\n if (Math.abs(dphi) <= EPSLN) {\n lat = phi;\n break;\n }\n }\n lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat));\n }\n }\n else {\n if (Math.abs(y + this.ml0) <= EPSLN) {\n lat = 0;\n lon = adjust_lon(this.long0 + x / this.a);\n }\n else {\n\n al = (this.ml0 + y) / this.a;\n bl = x * x / this.a / this.a + al * al;\n phi = al;\n var cl, mln, mlnp, ma;\n var con;\n for (i = MAX_ITER; i; --i) {\n con = this.e * Math.sin(phi);\n cl = Math.sqrt(1 - con * con) * Math.tan(phi);\n mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);\n mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi);\n ma = mln / this.a;\n 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);\n phi -= dphi;\n if (Math.abs(dphi) <= EPSLN) {\n lat = phi;\n break;\n }\n }\n\n //lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0);\n cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat);\n lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat));\n }\n }\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Polyconic\", \"poly\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import {SEC_TO_RAD} from '../constants/values';\n\n/*\n reference\n Department of Land and Survey Technical Circular 1973/32\n http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf\n OSG Technical Report 4.1\n http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf\n */\n\n/**\n * iterations: Number of iterations to refine inverse transform.\n * 0 -> km accuracy\n * 1 -> m accuracy -- suitable for most mapping applications\n * 2 -> mm accuracy\n */\nexport var iterations = 1;\n\nexport function init() {\n this.A = [];\n this.A[1] = 0.6399175073;\n this.A[2] = -0.1358797613;\n this.A[3] = 0.063294409;\n this.A[4] = -0.02526853;\n this.A[5] = 0.0117879;\n this.A[6] = -0.0055161;\n this.A[7] = 0.0026906;\n this.A[8] = -0.001333;\n this.A[9] = 0.00067;\n this.A[10] = -0.00034;\n\n this.B_re = [];\n this.B_im = [];\n this.B_re[1] = 0.7557853228;\n this.B_im[1] = 0;\n this.B_re[2] = 0.249204646;\n this.B_im[2] = 0.003371507;\n this.B_re[3] = -0.001541739;\n this.B_im[3] = 0.041058560;\n this.B_re[4] = -0.10162907;\n this.B_im[4] = 0.01727609;\n this.B_re[5] = -0.26623489;\n this.B_im[5] = -0.36249218;\n this.B_re[6] = -0.6870983;\n this.B_im[6] = -1.1651967;\n\n this.C_re = [];\n this.C_im = [];\n this.C_re[1] = 1.3231270439;\n this.C_im[1] = 0;\n this.C_re[2] = -0.577245789;\n this.C_im[2] = -0.007809598;\n this.C_re[3] = 0.508307513;\n this.C_im[3] = -0.112208952;\n this.C_re[4] = -0.15094762;\n this.C_im[4] = 0.18200602;\n this.C_re[5] = 1.01418179;\n this.C_im[5] = 1.64497696;\n this.C_re[6] = 1.9660549;\n this.C_im[6] = 2.5127645;\n\n this.D = [];\n this.D[1] = 1.5627014243;\n this.D[2] = 0.5185406398;\n this.D[3] = -0.03333098;\n this.D[4] = -0.1052906;\n this.D[5] = -0.0368594;\n this.D[6] = 0.007317;\n this.D[7] = 0.01220;\n this.D[8] = 0.00394;\n this.D[9] = -0.0013;\n}\n\n/**\n New Zealand Map Grid Forward - long/lat to x/y\n long/lat in radians\n */\nexport function forward(p) {\n var n;\n var lon = p.x;\n var lat = p.y;\n\n var delta_lat = lat - this.lat0;\n var delta_lon = lon - this.long0;\n\n // 1. Calculate d_phi and d_psi ... // and d_lambda\n // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians.\n var d_phi = delta_lat / SEC_TO_RAD * 1E-5;\n var d_lambda = delta_lon;\n var d_phi_n = 1; // d_phi^0\n\n var d_psi = 0;\n for (n = 1; n <= 10; n++) {\n d_phi_n = d_phi_n * d_phi;\n d_psi = d_psi + this.A[n] * d_phi_n;\n }\n\n // 2. Calculate theta\n var th_re = d_psi;\n var th_im = d_lambda;\n\n // 3. Calculate z\n var th_n_re = 1;\n var th_n_im = 0; // theta^0\n var th_n_re1;\n var th_n_im1;\n\n var z_re = 0;\n var z_im = 0;\n for (n = 1; n <= 6; n++) {\n th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n th_n_re = th_n_re1;\n th_n_im = th_n_im1;\n z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im;\n z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im;\n }\n\n // 4. Calculate easting and northing\n p.x = (z_im * this.a) + this.x0;\n p.y = (z_re * this.a) + this.y0;\n\n return p;\n}\n\n/**\n New Zealand Map Grid Inverse - x/y to long/lat\n */\nexport function inverse(p) {\n var n;\n var x = p.x;\n var y = p.y;\n\n var delta_x = x - this.x0;\n var delta_y = y - this.y0;\n\n // 1. Calculate z\n var z_re = delta_y / this.a;\n var z_im = delta_x / this.a;\n\n // 2a. Calculate theta - first approximation gives km accuracy\n var z_n_re = 1;\n var z_n_im = 0; // z^0\n var z_n_re1;\n var z_n_im1;\n\n var th_re = 0;\n var th_im = 0;\n for (n = 1; n <= 6; n++) {\n z_n_re1 = z_n_re * z_re - z_n_im * z_im;\n z_n_im1 = z_n_im * z_re + z_n_re * z_im;\n z_n_re = z_n_re1;\n z_n_im = z_n_im1;\n th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im;\n th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im;\n }\n\n // 2b. Iterate to refine the accuracy of the calculation\n // 0 iterations gives km accuracy\n // 1 iteration gives m accuracy -- good enough for most mapping applications\n // 2 iterations bives mm accuracy\n for (var i = 0; i < this.iterations; i++) {\n var th_n_re = th_re;\n var th_n_im = th_im;\n var th_n_re1;\n var th_n_im1;\n\n var num_re = z_re;\n var num_im = z_im;\n for (n = 2; n <= 6; n++) {\n th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n th_n_re = th_n_re1;\n th_n_im = th_n_im1;\n num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);\n num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);\n }\n\n th_n_re = 1;\n th_n_im = 0;\n var den_re = this.B_re[1];\n var den_im = this.B_im[1];\n for (n = 2; n <= 6; n++) {\n th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n th_n_re = th_n_re1;\n th_n_im = th_n_im1;\n den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);\n den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);\n }\n\n // Complex division\n var den2 = den_re * den_re + den_im * den_im;\n th_re = (num_re * den_re + num_im * den_im) / den2;\n th_im = (num_im * den_re - num_re * den_im) / den2;\n }\n\n // 3. Calculate d_phi ... // and d_lambda\n var d_psi = th_re;\n var d_lambda = th_im;\n var d_psi_n = 1; // d_psi^0\n\n var d_phi = 0;\n for (n = 1; n <= 9; n++) {\n d_psi_n = d_psi_n * d_psi;\n d_phi = d_phi + this.D[n] * d_psi_n;\n }\n\n // 4. Calculate latitude and longitude\n // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians.\n var lat = this.lat0 + (d_phi * SEC_TO_RAD * 1E5);\n var lon = this.long0 + d_lambda;\n\n p.x = lon;\n p.y = lat;\n\n return p;\n}\n\nexport var names = [\"New_Zealand_Map_Grid\", \"nzmg\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\n\n/*\n reference\n \"New Equal-Area Map Projections for Noncircular Regions\", John P. Snyder,\n The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.\n */\n\n\n/* Initialize the Miller Cylindrical projection\n -------------------------------------------*/\nexport function init() {\n //no-op\n}\n\n/* Miller Cylindrical forward equations--mapping lat,long to x,y\n ------------------------------------------------------------*/\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n /* Forward equations\n -----------------*/\n var dlon = adjust_lon(lon - this.long0);\n var x = this.x0 + this.a * dlon;\n var y = this.y0 + this.a * Math.log(Math.tan((Math.PI / 4) + (lat / 2.5))) * 1.25;\n\n p.x = x;\n p.y = y;\n return p;\n}\n\n/* Miller Cylindrical inverse equations--mapping x,y to lat/long\n ------------------------------------------------------------*/\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n\n var lon = adjust_lon(this.long0 + p.x / this.a);\n var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4);\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Miller_Cylindrical\", \"mill\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\nimport adjust_lat from '../common/adjust_lat';\nimport pj_enfn from '../common/pj_enfn';\nvar MAX_ITER = 20;\nimport pj_mlfn from '../common/pj_mlfn';\nimport pj_inv_mlfn from '../common/pj_inv_mlfn';\nimport {EPSLN, HALF_PI} from '../constants/values';\n\nimport asinz from '../common/asinz';\n\n\nexport function init() {\n /* Place parameters in static storage for common use\n -------------------------------------------------*/\n\n\n if (!this.sphere) {\n this.en = pj_enfn(this.es);\n }\n else {\n this.n = 1;\n this.m = 0;\n this.es = 0;\n this.C_y = Math.sqrt((this.m + 1) / this.n);\n this.C_x = this.C_y / (this.m + 1);\n }\n\n}\n\n/* Sinusoidal forward equations--mapping lat,long to x,y\n -----------------------------------------------------*/\nexport function forward(p) {\n var x, y;\n var lon = p.x;\n var lat = p.y;\n /* Forward equations\n -----------------*/\n lon = adjust_lon(lon - this.long0);\n\n if (this.sphere) {\n if (!this.m) {\n lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat;\n }\n else {\n var k = this.n * Math.sin(lat);\n for (var i = MAX_ITER; i; --i) {\n var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat));\n lat -= V;\n if (Math.abs(V) < EPSLN) {\n break;\n }\n }\n }\n x = this.a * this.C_x * lon * (this.m + Math.cos(lat));\n y = this.a * this.C_y * lat;\n\n }\n else {\n\n var s = Math.sin(lat);\n var c = Math.cos(lat);\n y = this.a * pj_mlfn(lat, s, c, this.en);\n x = this.a * lon * c / Math.sqrt(1 - this.es * s * s);\n }\n\n p.x = x;\n p.y = y;\n return p;\n}\n\nexport function inverse(p) {\n var lat, temp, lon, s;\n\n p.x -= this.x0;\n lon = p.x / this.a;\n p.y -= this.y0;\n lat = p.y / this.a;\n\n if (this.sphere) {\n lat /= this.C_y;\n lon = lon / (this.C_x * (this.m + Math.cos(lat)));\n if (this.m) {\n lat = asinz((this.m * lat + Math.sin(lat)) / this.n);\n }\n else if (this.n !== 1) {\n lat = asinz(Math.sin(lat) / this.n);\n }\n lon = adjust_lon(lon + this.long0);\n lat = adjust_lat(lat);\n }\n else {\n lat = pj_inv_mlfn(p.y / this.a, this.es, this.en);\n s = Math.abs(lat);\n if (s < HALF_PI) {\n s = Math.sin(lat);\n temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat));\n //temp = this.long0 + p.x / (this.a * Math.cos(lat));\n lon = adjust_lon(temp);\n }\n else if ((s - EPSLN) < HALF_PI) {\n lon = this.long0;\n }\n }\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Sinusoidal\", \"sinu\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\nexport function init() {}\nimport {EPSLN} from '../constants/values';\n/* Mollweide forward equations--mapping lat,long to x,y\n ----------------------------------------------------*/\nexport function forward(p) {\n\n /* Forward equations\n -----------------*/\n var lon = p.x;\n var lat = p.y;\n\n var delta_lon = adjust_lon(lon - this.long0);\n var theta = lat;\n var con = Math.PI * Math.sin(lat);\n\n /* Iterate using the Newton-Raphson method to find theta\n -----------------------------------------------------*/\n while (true) {\n var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta));\n theta += delta_theta;\n if (Math.abs(delta_theta) < EPSLN) {\n break;\n }\n }\n theta /= 2;\n\n /* If the latitude is 90 deg, force the x coordinate to be \"0 + false easting\"\n this is done here because of precision problems with \"cos(theta)\"\n --------------------------------------------------------------------------*/\n if (Math.PI / 2 - Math.abs(lat) < EPSLN) {\n delta_lon = 0;\n }\n var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0;\n var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0;\n\n p.x = x;\n p.y = y;\n return p;\n}\n\nexport function inverse(p) {\n var theta;\n var arg;\n\n /* Inverse equations\n -----------------*/\n p.x -= this.x0;\n p.y -= this.y0;\n arg = p.y / (1.4142135623731 * this.a);\n\n /* Because of division by zero problems, 'arg' can not be 1. Therefore\n a number very close to one is used instead.\n -------------------------------------------------------------------*/\n if (Math.abs(arg) > 0.999999999999) {\n arg = 0.999999999999;\n }\n theta = Math.asin(arg);\n var lon = adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta))));\n if (lon < (-Math.PI)) {\n lon = -Math.PI;\n }\n if (lon > Math.PI) {\n lon = Math.PI;\n }\n arg = (2 * theta + Math.sin(2 * theta)) / Math.PI;\n if (Math.abs(arg) > 1) {\n arg = 1;\n }\n var lat = Math.asin(arg);\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Mollweide\", \"moll\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import e0fn from '../common/e0fn';\nimport e1fn from '../common/e1fn';\nimport e2fn from '../common/e2fn';\nimport e3fn from '../common/e3fn';\nimport msfnz from '../common/msfnz';\nimport mlfn from '../common/mlfn';\nimport adjust_lon from '../common/adjust_lon';\nimport adjust_lat from '../common/adjust_lat';\nimport imlfn from '../common/imlfn';\nimport {EPSLN} from '../constants/values';\n\nexport function init() {\n\n /* Place parameters in static storage for common use\n -------------------------------------------------*/\n // Standard Parallels cannot be equal and on opposite sides of the equator\n if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n return;\n }\n this.lat2 = this.lat2 || this.lat1;\n this.temp = this.b / this.a;\n this.es = 1 - Math.pow(this.temp, 2);\n this.e = Math.sqrt(this.es);\n this.e0 = e0fn(this.es);\n this.e1 = e1fn(this.es);\n this.e2 = e2fn(this.es);\n this.e3 = e3fn(this.es);\n\n this.sinphi = Math.sin(this.lat1);\n this.cosphi = Math.cos(this.lat1);\n\n this.ms1 = msfnz(this.e, this.sinphi, this.cosphi);\n this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1);\n\n if (Math.abs(this.lat1 - this.lat2) < EPSLN) {\n this.ns = this.sinphi;\n }\n else {\n this.sinphi = Math.sin(this.lat2);\n this.cosphi = Math.cos(this.lat2);\n this.ms2 = msfnz(this.e, this.sinphi, this.cosphi);\n this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);\n this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);\n }\n this.g = this.ml1 + this.ms1 / this.ns;\n this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);\n this.rh = this.a * (this.g - this.ml0);\n}\n\n/* Equidistant Conic forward equations--mapping lat,long to x,y\n -----------------------------------------------------------*/\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n var rh1;\n\n /* Forward equations\n -----------------*/\n if (this.sphere) {\n rh1 = this.a * (this.g - lat);\n }\n else {\n var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat);\n rh1 = this.a * (this.g - ml);\n }\n var theta = this.ns * adjust_lon(lon - this.long0);\n var x = this.x0 + rh1 * Math.sin(theta);\n var y = this.y0 + this.rh - rh1 * Math.cos(theta);\n p.x = x;\n p.y = y;\n return p;\n}\n\n/* Inverse equations\n -----------------*/\nexport function inverse(p) {\n p.x -= this.x0;\n p.y = this.rh - p.y + this.y0;\n var con, rh1, lat, lon;\n if (this.ns >= 0) {\n rh1 = Math.sqrt(p.x * p.x + p.y * p.y);\n con = 1;\n }\n else {\n rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);\n con = -1;\n }\n var theta = 0;\n if (rh1 !== 0) {\n theta = Math.atan2(con * p.x, con * p.y);\n }\n\n if (this.sphere) {\n lon = adjust_lon(this.long0 + theta / this.ns);\n lat = adjust_lat(this.g - rh1 / this.a);\n p.x = lon;\n p.y = lat;\n return p;\n }\n else {\n var ml = this.g - rh1 / this.a;\n lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3);\n lon = adjust_lon(this.long0 + theta / this.ns);\n p.x = lon;\n p.y = lat;\n return p;\n }\n\n}\n\nexport var names = [\"Equidistant_Conic\", \"eqdc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\n\nimport {HALF_PI, EPSLN} from '../constants/values';\n\nimport asinz from '../common/asinz';\n\n/* Initialize the Van Der Grinten projection\n ----------------------------------------*/\nexport function init() {\n //this.R = 6370997; //Radius of earth\n this.R = this.a;\n}\n\nexport function forward(p) {\n\n var lon = p.x;\n var lat = p.y;\n\n /* Forward equations\n -----------------*/\n var dlon = adjust_lon(lon - this.long0);\n var x, y;\n\n if (Math.abs(lat) <= EPSLN) {\n x = this.x0 + this.R * dlon;\n y = this.y0;\n }\n var theta = asinz(2 * Math.abs(lat / Math.PI));\n if ((Math.abs(dlon) <= EPSLN) || (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN)) {\n x = this.x0;\n if (lat >= 0) {\n y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta);\n }\n else {\n y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta);\n }\n // return(OK);\n }\n var al = 0.5 * Math.abs((Math.PI / dlon) - (dlon / Math.PI));\n var asq = al * al;\n var sinth = Math.sin(theta);\n var costh = Math.cos(theta);\n\n var g = costh / (sinth + costh - 1);\n var gsq = g * g;\n var m = g * (2 / sinth - 1);\n var msq = m * m;\n var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq);\n if (dlon < 0) {\n con = -con;\n }\n x = this.x0 + con;\n //con = Math.abs(con / (Math.PI * this.R));\n var q = asq + g;\n con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq);\n if (lat >= 0) {\n //y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);\n y = this.y0 + con;\n }\n else {\n //y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);\n y = this.y0 - con;\n }\n p.x = x;\n p.y = y;\n return p;\n}\n\n/* Van Der Grinten inverse equations--mapping x,y to lat/long\n ---------------------------------------------------------*/\nexport function inverse(p) {\n var lon, lat;\n var xx, yy, xys, c1, c2, c3;\n var a1;\n var m1;\n var con;\n var th1;\n var d;\n\n /* inverse equations\n -----------------*/\n p.x -= this.x0;\n p.y -= this.y0;\n con = Math.PI * this.R;\n xx = p.x / con;\n yy = p.y / con;\n xys = xx * xx + yy * yy;\n c1 = -Math.abs(yy) * (1 + xys);\n c2 = c1 - 2 * yy * yy + xx * xx;\n c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys;\n d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27;\n a1 = (c1 - c2 * c2 / 3 / c3) / c3;\n m1 = 2 * Math.sqrt(-a1 / 3);\n con = ((3 * d) / a1) / m1;\n if (Math.abs(con) > 1) {\n if (con >= 0) {\n con = 1;\n }\n else {\n con = -1;\n }\n }\n th1 = Math.acos(con) / 3;\n if (p.y >= 0) {\n lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;\n }\n else {\n lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;\n }\n\n if (Math.abs(xx) < EPSLN) {\n lon = this.long0;\n }\n else {\n lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx);\n }\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Van_der_Grinten_I\", \"VanDerGrinten\", \"vandg\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\nimport {HALF_PI, EPSLN} from '../constants/values';\n\nimport mlfn from '../common/mlfn';\nimport e0fn from '../common/e0fn';\nimport e1fn from '../common/e1fn';\nimport e2fn from '../common/e2fn';\nimport e3fn from '../common/e3fn';\nimport gN from '../common/gN';\nimport asinz from '../common/asinz';\nimport imlfn from '../common/imlfn';\n\n\n\nexport function init() {\n this.sin_p12 = Math.sin(this.lat0);\n this.cos_p12 = Math.cos(this.lat0);\n}\n\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n var sinphi = Math.sin(p.y);\n var cosphi = Math.cos(p.y);\n var dlon = adjust_lon(lon - this.long0);\n 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;\n if (this.sphere) {\n if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n //North Pole case\n p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon);\n p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon);\n return p;\n }\n else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n //South Pole case\n p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon);\n p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon);\n return p;\n }\n else {\n //default case\n cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon);\n c = Math.acos(cos_c);\n kp = c ? c / Math.sin(c) : 1;\n p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon);\n p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon));\n return p;\n }\n }\n else {\n e0 = e0fn(this.es);\n e1 = e1fn(this.es);\n e2 = e2fn(this.es);\n e3 = e3fn(this.es);\n if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n //North Pole case\n Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n Ml = this.a * mlfn(e0, e1, e2, e3, lat);\n p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon);\n p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon);\n return p;\n }\n else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n //South Pole case\n Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n Ml = this.a * mlfn(e0, e1, e2, e3, lat);\n p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon);\n p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon);\n return p;\n }\n else {\n //Default case\n tanphi = sinphi / cosphi;\n Nl1 = gN(this.a, this.e, this.sin_p12);\n Nl = gN(this.a, this.e, sinphi);\n psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi));\n Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon));\n if (Az === 0) {\n s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));\n }\n else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) {\n s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));\n }\n else {\n s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az));\n }\n G = this.e * this.sin_p12 / Math.sqrt(1 - this.es);\n H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es);\n GH = G * H;\n Hs = H * H;\n s2 = s * s;\n s3 = s2 * s;\n s4 = s3 * s;\n s5 = s4 * s;\n 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);\n p.x = this.x0 + c * Math.sin(Az);\n p.y = this.y0 + c * Math.cos(Az);\n return p;\n }\n }\n\n\n}\n\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F, sinpsi;\n if (this.sphere) {\n rh = Math.sqrt(p.x * p.x + p.y * p.y);\n if (rh > (2 * HALF_PI * this.a)) {\n return;\n }\n z = rh / this.a;\n\n sinz = Math.sin(z);\n cosz = Math.cos(z);\n\n lon = this.long0;\n if (Math.abs(rh) <= EPSLN) {\n lat = this.lat0;\n }\n else {\n lat = asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh);\n con = Math.abs(this.lat0) - HALF_PI;\n if (Math.abs(con) <= EPSLN) {\n if (this.lat0 >= 0) {\n lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y));\n }\n else {\n lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));\n }\n }\n else {\n /*con = cosz - this.sin_p12 * Math.sin(lat);\n if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) {\n //no-op, just keep the lon value as is\n } else {\n var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh));\n lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh)));\n }*/\n lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz));\n }\n }\n\n p.x = lon;\n p.y = lat;\n return p;\n }\n else {\n e0 = e0fn(this.es);\n e1 = e1fn(this.es);\n e2 = e2fn(this.es);\n e3 = e3fn(this.es);\n if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n //North pole case\n Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n rh = Math.sqrt(p.x * p.x + p.y * p.y);\n M = Mlp - rh;\n lat = imlfn(M / this.a, e0, e1, e2, e3);\n lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y));\n p.x = lon;\n p.y = lat;\n return p;\n }\n else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n //South pole case\n Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n rh = Math.sqrt(p.x * p.x + p.y * p.y);\n M = rh - Mlp;\n\n lat = imlfn(M / this.a, e0, e1, e2, e3);\n lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));\n p.x = lon;\n p.y = lat;\n return p;\n }\n else {\n //default case\n rh = Math.sqrt(p.x * p.x + p.y * p.y);\n Az = Math.atan2(p.x, p.y);\n N1 = gN(this.a, this.e, this.sin_p12);\n cosAz = Math.cos(Az);\n tmp = this.e * this.cos_p12 * cosAz;\n A = -tmp * tmp / (1 - this.es);\n B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es);\n D = rh / N1;\n Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24;\n F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6;\n psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz);\n lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi)));\n sinpsi = Math.sin(psi);\n lat = Math.atan2((sinpsi - this.es * F * this.sin_p12) * Math.tan(psi), sinpsi * (1 - this.es));\n p.x = lon;\n p.y = lat;\n return p;\n }\n }\n\n}\n\nexport var names = [\"Azimuthal_Equidistant\", \"aeqd\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\nimport asinz from '../common/asinz';\nimport {EPSLN, HALF_PI} from '../constants/values';\n\nexport function init() {\n //double temp; /* temporary variable */\n\n /* Place parameters in static storage for common use\n -------------------------------------------------*/\n this.sin_p14 = Math.sin(this.lat0);\n this.cos_p14 = Math.cos(this.lat0);\n}\n\n/* Orthographic forward equations--mapping lat,long to x,y\n ---------------------------------------------------*/\nexport function forward(p) {\n var sinphi, cosphi; /* sin and cos value */\n var dlon; /* delta longitude value */\n var coslon; /* cos of longitude */\n var ksp; /* scale factor */\n var g, x, y;\n var lon = p.x;\n var lat = p.y;\n /* Forward equations\n -----------------*/\n dlon = adjust_lon(lon - this.long0);\n\n sinphi = Math.sin(lat);\n cosphi = Math.cos(lat);\n\n coslon = Math.cos(dlon);\n g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;\n ksp = 1;\n if ((g > 0) || (Math.abs(g) <= EPSLN)) {\n x = this.a * ksp * cosphi * Math.sin(dlon);\n y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);\n }\n p.x = x;\n p.y = y;\n return p;\n}\n\nexport function inverse(p) {\n var rh; /* height above ellipsoid */\n var z; /* angle */\n var sinz, cosz; /* sin of z and cos of z */\n var con;\n var lon, lat;\n /* Inverse equations\n -----------------*/\n p.x -= this.x0;\n p.y -= this.y0;\n rh = Math.sqrt(p.x * p.x + p.y * p.y);\n z = asinz(rh / this.a);\n\n sinz = Math.sin(z);\n cosz = Math.cos(z);\n\n lon = this.long0;\n if (Math.abs(rh) <= EPSLN) {\n lat = this.lat0;\n p.x = lon;\n p.y = lat;\n return p;\n }\n lat = asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14) / rh);\n con = Math.abs(this.lat0) - HALF_PI;\n if (Math.abs(con) <= EPSLN) {\n if (this.lat0 >= 0) {\n lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y));\n }\n else {\n lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));\n }\n p.x = lon;\n p.y = lat;\n return p;\n }\n lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz), rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz));\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"ortho\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","// QSC projection rewritten from the original PROJ4\n// https://github.com/OSGeo/proj.4/blob/master/src/PJ_qsc.c\n\nimport {EPSLN, TWO_PI, SPI, HALF_PI, FORTPI} from '../constants/values';\n\n/* constants */\nvar FACE_ENUM = {\n FRONT: 1,\n RIGHT: 2,\n BACK: 3,\n LEFT: 4,\n TOP: 5,\n BOTTOM: 6\n};\n\nvar AREA_ENUM = {\n AREA_0: 1,\n AREA_1: 2,\n AREA_2: 3,\n AREA_3: 4\n};\n\nexport function init() {\n\n this.x0 = this.x0 || 0;\n this.y0 = this.y0 || 0;\n this.lat0 = this.lat0 || 0;\n this.long0 = this.long0 || 0;\n this.lat_ts = this.lat_ts || 0;\n this.title = this.title || \"Quadrilateralized Spherical Cube\";\n\n /* Determine the cube face from the center of projection. */\n if (this.lat0 >= HALF_PI - FORTPI / 2.0) {\n this.face = FACE_ENUM.TOP;\n } else if (this.lat0 <= -(HALF_PI - FORTPI / 2.0)) {\n this.face = FACE_ENUM.BOTTOM;\n } else if (Math.abs(this.long0) <= FORTPI) {\n this.face = FACE_ENUM.FRONT;\n } else if (Math.abs(this.long0) <= HALF_PI + FORTPI) {\n this.face = this.long0 > 0.0 ? FACE_ENUM.RIGHT : FACE_ENUM.LEFT;\n } else {\n this.face = FACE_ENUM.BACK;\n }\n\n /* Fill in useful values for the ellipsoid <-> sphere shift\n * described in [LK12]. */\n if (this.es !== 0) {\n this.one_minus_f = 1 - (this.a - this.b) / this.a;\n this.one_minus_f_squared = this.one_minus_f * this.one_minus_f;\n }\n}\n\n// QSC forward equations--mapping lat,long to x,y\n// -----------------------------------------------------------------\nexport function forward(p) {\n var xy = {x: 0, y: 0};\n var lat, lon;\n var theta, phi;\n var t, mu;\n /* nu; */\n var area = {value: 0};\n\n // move lon according to projection's lon\n p.x -= this.long0;\n\n /* Convert the geodetic latitude to a geocentric latitude.\n * This corresponds to the shift from the ellipsoid to the sphere\n * described in [LK12]. */\n if (this.es !== 0) {//if (P->es != 0) {\n lat = Math.atan(this.one_minus_f_squared * Math.tan(p.y));\n } else {\n lat = p.y;\n }\n\n /* Convert the input lat, lon into theta, phi as used by QSC.\n * This depends on the cube face and the area on it.\n * For the top and bottom face, we can compute theta and phi\n * directly from phi, lam. For the other faces, we must use\n * unit sphere cartesian coordinates as an intermediate step. */\n lon = p.x; //lon = lp.lam;\n if (this.face === FACE_ENUM.TOP) {\n phi = HALF_PI - lat;\n if (lon >= FORTPI && lon <= HALF_PI + FORTPI) {\n area.value = AREA_ENUM.AREA_0;\n theta = lon - HALF_PI;\n } else if (lon > HALF_PI + FORTPI || lon <= -(HALF_PI + FORTPI)) {\n area.value = AREA_ENUM.AREA_1;\n theta = (lon > 0.0 ? lon - SPI : lon + SPI);\n } else if (lon > -(HALF_PI + FORTPI) && lon <= -FORTPI) {\n area.value = AREA_ENUM.AREA_2;\n theta = lon + HALF_PI;\n } else {\n area.value = AREA_ENUM.AREA_3;\n theta = lon;\n }\n } else if (this.face === FACE_ENUM.BOTTOM) {\n phi = HALF_PI + lat;\n if (lon >= FORTPI && lon <= HALF_PI + FORTPI) {\n area.value = AREA_ENUM.AREA_0;\n theta = -lon + HALF_PI;\n } else if (lon < FORTPI && lon >= -FORTPI) {\n area.value = AREA_ENUM.AREA_1;\n theta = -lon;\n } else if (lon < -FORTPI && lon >= -(HALF_PI + FORTPI)) {\n area.value = AREA_ENUM.AREA_2;\n theta = -lon - HALF_PI;\n } else {\n area.value = AREA_ENUM.AREA_3;\n theta = (lon > 0.0 ? -lon + SPI : -lon - SPI);\n }\n } else {\n var q, r, s;\n var sinlat, coslat;\n var sinlon, coslon;\n\n if (this.face === FACE_ENUM.RIGHT) {\n lon = qsc_shift_lon_origin(lon, +HALF_PI);\n } else if (this.face === FACE_ENUM.BACK) {\n lon = qsc_shift_lon_origin(lon, +SPI);\n } else if (this.face === FACE_ENUM.LEFT) {\n lon = qsc_shift_lon_origin(lon, -HALF_PI);\n }\n sinlat = Math.sin(lat);\n coslat = Math.cos(lat);\n sinlon = Math.sin(lon);\n coslon = Math.cos(lon);\n q = coslat * coslon;\n r = coslat * sinlon;\n s = sinlat;\n\n if (this.face === FACE_ENUM.FRONT) {\n phi = Math.acos(q);\n theta = qsc_fwd_equat_face_theta(phi, s, r, area);\n } else if (this.face === FACE_ENUM.RIGHT) {\n phi = Math.acos(r);\n theta = qsc_fwd_equat_face_theta(phi, s, -q, area);\n } else if (this.face === FACE_ENUM.BACK) {\n phi = Math.acos(-q);\n theta = qsc_fwd_equat_face_theta(phi, s, -r, area);\n } else if (this.face === FACE_ENUM.LEFT) {\n phi = Math.acos(-r);\n theta = qsc_fwd_equat_face_theta(phi, s, q, area);\n } else {\n /* Impossible */\n phi = theta = 0;\n area.value = AREA_ENUM.AREA_0;\n }\n }\n\n /* Compute mu and nu for the area of definition.\n * For mu, see Eq. (3-21) in [OL76], but note the typos:\n * compare with Eq. (3-14). For nu, see Eq. (3-38). */\n mu = Math.atan((12 / SPI) * (theta + Math.acos(Math.sin(theta) * Math.cos(FORTPI)) - HALF_PI));\n t = Math.sqrt((1 - Math.cos(phi)) / (Math.cos(mu) * Math.cos(mu)) / (1 - Math.cos(Math.atan(1 / Math.cos(theta)))));\n\n /* Apply the result to the real area. */\n if (area.value === AREA_ENUM.AREA_1) {\n mu += HALF_PI;\n } else if (area.value === AREA_ENUM.AREA_2) {\n mu += SPI;\n } else if (area.value === AREA_ENUM.AREA_3) {\n mu += 1.5 * SPI;\n }\n\n /* Now compute x, y from mu and nu */\n xy.x = t * Math.cos(mu);\n xy.y = t * Math.sin(mu);\n xy.x = xy.x * this.a + this.x0;\n xy.y = xy.y * this.a + this.y0;\n\n p.x = xy.x;\n p.y = xy.y;\n return p;\n}\n\n// QSC inverse equations--mapping x,y to lat/long\n// -----------------------------------------------------------------\nexport function inverse(p) {\n var lp = {lam: 0, phi: 0};\n var mu, nu, cosmu, tannu;\n var tantheta, theta, cosphi, phi;\n var t;\n var area = {value: 0};\n\n /* de-offset */\n p.x = (p.x - this.x0) / this.a;\n p.y = (p.y - this.y0) / this.a;\n\n /* Convert the input x, y to the mu and nu angles as used by QSC.\n * This depends on the area of the cube face. */\n nu = Math.atan(Math.sqrt(p.x * p.x + p.y * p.y));\n mu = Math.atan2(p.y, p.x);\n if (p.x >= 0.0 && p.x >= Math.abs(p.y)) {\n area.value = AREA_ENUM.AREA_0;\n } else if (p.y >= 0.0 && p.y >= Math.abs(p.x)) {\n area.value = AREA_ENUM.AREA_1;\n mu -= HALF_PI;\n } else if (p.x < 0.0 && -p.x >= Math.abs(p.y)) {\n area.value = AREA_ENUM.AREA_2;\n mu = (mu < 0.0 ? mu + SPI : mu - SPI);\n } else {\n area.value = AREA_ENUM.AREA_3;\n mu += HALF_PI;\n }\n\n /* Compute phi and theta for the area of definition.\n * The inverse projection is not described in the original paper, but some\n * good hints can be found here (as of 2011-12-14):\n * http://fits.gsfc.nasa.gov/fitsbits/saf.93/saf.9302\n * (search for \"Message-Id: <9302181759.AA25477 at fits.cv.nrao.edu>\") */\n t = (SPI / 12) * Math.tan(mu);\n tantheta = Math.sin(t) / (Math.cos(t) - (1 / Math.sqrt(2)));\n theta = Math.atan(tantheta);\n cosmu = Math.cos(mu);\n tannu = Math.tan(nu);\n cosphi = 1 - cosmu * cosmu * tannu * tannu * (1 - Math.cos(Math.atan(1 / Math.cos(theta))));\n if (cosphi < -1) {\n cosphi = -1;\n } else if (cosphi > +1) {\n cosphi = +1;\n }\n\n /* Apply the result to the real area on the cube face.\n * For the top and bottom face, we can compute phi and lam directly.\n * For the other faces, we must use unit sphere cartesian coordinates\n * as an intermediate step. */\n if (this.face === FACE_ENUM.TOP) {\n phi = Math.acos(cosphi);\n lp.phi = HALF_PI - phi;\n if (area.value === AREA_ENUM.AREA_0) {\n lp.lam = theta + HALF_PI;\n } else if (area.value === AREA_ENUM.AREA_1) {\n lp.lam = (theta < 0.0 ? theta + SPI : theta - SPI);\n } else if (area.value === AREA_ENUM.AREA_2) {\n lp.lam = theta - HALF_PI;\n } else /* area.value == AREA_ENUM.AREA_3 */ {\n lp.lam = theta;\n }\n } else if (this.face === FACE_ENUM.BOTTOM) {\n phi = Math.acos(cosphi);\n lp.phi = phi - HALF_PI;\n if (area.value === AREA_ENUM.AREA_0) {\n lp.lam = -theta + HALF_PI;\n } else if (area.value === AREA_ENUM.AREA_1) {\n lp.lam = -theta;\n } else if (area.value === AREA_ENUM.AREA_2) {\n lp.lam = -theta - HALF_PI;\n } else /* area.value == AREA_ENUM.AREA_3 */ {\n lp.lam = (theta < 0.0 ? -theta - SPI : -theta + SPI);\n }\n } else {\n /* Compute phi and lam via cartesian unit sphere coordinates. */\n var q, r, s;\n q = cosphi;\n t = q * q;\n if (t >= 1) {\n s = 0;\n } else {\n s = Math.sqrt(1 - t) * Math.sin(theta);\n }\n t += s * s;\n if (t >= 1) {\n r = 0;\n } else {\n r = Math.sqrt(1 - t);\n }\n /* Rotate q,r,s into the correct area. */\n if (area.value === AREA_ENUM.AREA_1) {\n t = r;\n r = -s;\n s = t;\n } else if (area.value === AREA_ENUM.AREA_2) {\n r = -r;\n s = -s;\n } else if (area.value === AREA_ENUM.AREA_3) {\n t = r;\n r = s;\n s = -t;\n }\n /* Rotate q,r,s into the correct cube face. */\n if (this.face === FACE_ENUM.RIGHT) {\n t = q;\n q = -r;\n r = t;\n } else if (this.face === FACE_ENUM.BACK) {\n q = -q;\n r = -r;\n } else if (this.face === FACE_ENUM.LEFT) {\n t = q;\n q = r;\n r = -t;\n }\n /* Now compute phi and lam from the unit sphere coordinates. */\n lp.phi = Math.acos(-s) - HALF_PI;\n lp.lam = Math.atan2(r, q);\n if (this.face === FACE_ENUM.RIGHT) {\n lp.lam = qsc_shift_lon_origin(lp.lam, -HALF_PI);\n } else if (this.face === FACE_ENUM.BACK) {\n lp.lam = qsc_shift_lon_origin(lp.lam, -SPI);\n } else if (this.face === FACE_ENUM.LEFT) {\n lp.lam = qsc_shift_lon_origin(lp.lam, +HALF_PI);\n }\n }\n\n /* Apply the shift from the sphere to the ellipsoid as described\n * in [LK12]. */\n if (this.es !== 0) {\n var invert_sign;\n var tanphi, xa;\n invert_sign = (lp.phi < 0 ? 1 : 0);\n tanphi = Math.tan(lp.phi);\n xa = this.b / Math.sqrt(tanphi * tanphi + this.one_minus_f_squared);\n lp.phi = Math.atan(Math.sqrt(this.a * this.a - xa * xa) / (this.one_minus_f * xa));\n if (invert_sign) {\n lp.phi = -lp.phi;\n }\n }\n\n lp.lam += this.long0;\n p.x = lp.lam;\n p.y = lp.phi;\n return p;\n}\n\n/* Helper function for forward projection: compute the theta angle\n * and determine the area number. */\nfunction qsc_fwd_equat_face_theta(phi, y, x, area) {\n var theta;\n if (phi < EPSLN) {\n area.value = AREA_ENUM.AREA_0;\n theta = 0.0;\n } else {\n theta = Math.atan2(y, x);\n if (Math.abs(theta) <= FORTPI) {\n area.value = AREA_ENUM.AREA_0;\n } else if (theta > FORTPI && theta <= HALF_PI + FORTPI) {\n area.value = AREA_ENUM.AREA_1;\n theta -= HALF_PI;\n } else if (theta > HALF_PI + FORTPI || theta <= -(HALF_PI + FORTPI)) {\n area.value = AREA_ENUM.AREA_2;\n theta = (theta >= 0.0 ? theta - SPI : theta + SPI);\n } else {\n area.value = AREA_ENUM.AREA_3;\n theta += HALF_PI;\n }\n }\n return theta;\n}\n\n/* Helper function: shift the longitude. */\nfunction qsc_shift_lon_origin(lon, offset) {\n var slon = lon + offset;\n if (slon < -SPI) {\n slon += TWO_PI;\n } else if (slon > +SPI) {\n slon -= TWO_PI;\n }\n return slon;\n}\n\nexport var names = [\"Quadrilateralized Spherical Cube\", \"Quadrilateralized_Spherical_Cube\", \"qsc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n\n","// Robinson projection\n// Based on https://github.com/OSGeo/proj.4/blob/master/src/PJ_robin.c\n// Polynomial coeficients from http://article.gmane.org/gmane.comp.gis.proj-4.devel/6039\n\nimport {HALF_PI, D2R, R2D, EPSLN} from '../constants/values';\nimport adjust_lon from '../common/adjust_lon';\n\nvar COEFS_X = [\n [1.0000, 2.2199e-17, -7.15515e-05, 3.1103e-06],\n [0.9986, -0.000482243, -2.4897e-05, -1.3309e-06],\n [0.9954, -0.00083103, -4.48605e-05, -9.86701e-07],\n [0.9900, -0.00135364, -5.9661e-05, 3.6777e-06],\n [0.9822, -0.00167442, -4.49547e-06, -5.72411e-06],\n [0.9730, -0.00214868, -9.03571e-05, 1.8736e-08],\n [0.9600, -0.00305085, -9.00761e-05, 1.64917e-06],\n [0.9427, -0.00382792, -6.53386e-05, -2.6154e-06],\n [0.9216, -0.00467746, -0.00010457, 4.81243e-06],\n [0.8962, -0.00536223, -3.23831e-05, -5.43432e-06],\n [0.8679, -0.00609363, -0.000113898, 3.32484e-06],\n [0.8350, -0.00698325, -6.40253e-05, 9.34959e-07],\n [0.7986, -0.00755338, -5.00009e-05, 9.35324e-07],\n [0.7597, -0.00798324, -3.5971e-05, -2.27626e-06],\n [0.7186, -0.00851367, -7.01149e-05, -8.6303e-06],\n [0.6732, -0.00986209, -0.000199569, 1.91974e-05],\n [0.6213, -0.010418, 8.83923e-05, 6.24051e-06],\n [0.5722, -0.00906601, 0.000182, 6.24051e-06],\n [0.5322, -0.00677797, 0.000275608, 6.24051e-06]\n];\n\nvar COEFS_Y = [\n [-5.20417e-18, 0.0124, 1.21431e-18, -8.45284e-11],\n [0.0620, 0.0124, -1.26793e-09, 4.22642e-10],\n [0.1240, 0.0124, 5.07171e-09, -1.60604e-09],\n [0.1860, 0.0123999, -1.90189e-08, 6.00152e-09],\n [0.2480, 0.0124002, 7.10039e-08, -2.24e-08],\n [0.3100, 0.0123992, -2.64997e-07, 8.35986e-08],\n [0.3720, 0.0124029, 9.88983e-07, -3.11994e-07],\n [0.4340, 0.0123893, -3.69093e-06, -4.35621e-07],\n [0.4958, 0.0123198, -1.02252e-05, -3.45523e-07],\n [0.5571, 0.0121916, -1.54081e-05, -5.82288e-07],\n [0.6176, 0.0119938, -2.41424e-05, -5.25327e-07],\n [0.6769, 0.011713, -3.20223e-05, -5.16405e-07],\n [0.7346, 0.0113541, -3.97684e-05, -6.09052e-07],\n [0.7903, 0.0109107, -4.89042e-05, -1.04739e-06],\n [0.8435, 0.0103431, -6.4615e-05, -1.40374e-09],\n [0.8936, 0.00969686, -6.4636e-05, -8.547e-06],\n [0.9394, 0.00840947, -0.000192841, -4.2106e-06],\n [0.9761, 0.00616527, -0.000256, -4.2106e-06],\n [1.0000, 0.00328947, -0.000319159, -4.2106e-06]\n];\n\nvar FXC = 0.8487;\nvar FYC = 1.3523;\nvar C1 = R2D/5; // rad to 5-degree interval\nvar RC1 = 1/C1;\nvar NODES = 18;\n\nvar poly3_val = function(coefs, x) {\n return coefs[0] + x * (coefs[1] + x * (coefs[2] + x * coefs[3]));\n};\n\nvar poly3_der = function(coefs, x) {\n return coefs[1] + x * (2 * coefs[2] + x * 3 * coefs[3]);\n};\n\nfunction newton_rapshon(f_df, start, max_err, iters) {\n var x = start;\n for (; iters; --iters) {\n var upd = f_df(x);\n x -= upd;\n if (Math.abs(upd) < max_err) {\n break;\n }\n }\n return x;\n}\n\nexport function init() {\n this.x0 = this.x0 || 0;\n this.y0 = this.y0 || 0;\n this.long0 = this.long0 || 0;\n this.es = 0;\n this.title = this.title || \"Robinson\";\n}\n\nexport function forward(ll) {\n var lon = adjust_lon(ll.x - this.long0);\n\n var dphi = Math.abs(ll.y);\n var i = Math.floor(dphi * C1);\n if (i < 0) {\n i = 0;\n } else if (i >= NODES) {\n i = NODES - 1;\n }\n dphi = R2D * (dphi - RC1 * i);\n var xy = {\n x: poly3_val(COEFS_X[i], dphi) * lon,\n y: poly3_val(COEFS_Y[i], dphi)\n };\n if (ll.y < 0) {\n xy.y = -xy.y;\n }\n\n xy.x = xy.x * this.a * FXC + this.x0;\n xy.y = xy.y * this.a * FYC + this.y0;\n return xy;\n}\n\nexport function inverse(xy) {\n var ll = {\n x: (xy.x - this.x0) / (this.a * FXC),\n y: Math.abs(xy.y - this.y0) / (this.a * FYC)\n };\n\n if (ll.y >= 1) { // pathologic case\n ll.x /= COEFS_X[NODES][0];\n ll.y = xy.y < 0 ? -HALF_PI : HALF_PI;\n } else {\n // find table interval\n var i = Math.floor(ll.y * NODES);\n if (i < 0) {\n i = 0;\n } else if (i >= NODES) {\n i = NODES - 1;\n }\n for (;;) {\n if (COEFS_Y[i][0] > ll.y) {\n --i;\n } else if (COEFS_Y[i+1][0] <= ll.y) {\n ++i;\n } else {\n break;\n }\n }\n // linear interpolation in 5 degree interval\n var coefs = COEFS_Y[i];\n var t = 5 * (ll.y - coefs[0]) / (COEFS_Y[i+1][0] - coefs[0]);\n // find t so that poly3_val(coefs, t) = ll.y\n t = newton_rapshon(function(x) {\n return (poly3_val(coefs, x) - ll.y) / poly3_der(coefs, x);\n }, t, EPSLN, 100);\n\n ll.x /= poly3_val(COEFS_X[i], t);\n ll.y = (5 * i + t) * D2R;\n if (xy.y < 0) {\n ll.y = -ll.y;\n }\n }\n\n ll.x = adjust_lon(ll.x + this.long0);\n return ll;\n}\n\nexport var names = [\"Robinson\", \"robin\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import {\n geodeticToGeocentric,\n geocentricToGeodetic\n} from '../datumUtils';\n\nexport function init() {\n this.name = 'geocent';\n\n}\n\nexport function forward(p) {\n var point = geodeticToGeocentric(p, this.es, this.a);\n return point;\n}\n\nexport function inverse(p) {\n var point = geocentricToGeodetic(p, this.es, this.a, this.b);\n return point;\n}\n\nexport var names = [\"Geocentric\", 'geocentric', \"geocent\", \"Geocent\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};","\nvar mode = {\n N_POLE: 0,\n S_POLE: 1,\n EQUIT: 2,\n OBLIQ: 3\n};\n\nimport { D2R, HALF_PI, EPSLN } from \"../constants/values\";\nimport hypot from \"../common/hypot\";\n\nvar params = {\n h: { def: 100000, num: true }, // default is Karman line, no default in PROJ.7\n azi: { def: 0, num: true, degrees: true }, // default is North\n tilt: { def: 0, num: true, degrees: true }, // default is Nadir\n long0: { def: 0, num: true }, // default is Greenwich, conversion to rad is automatic\n lat0: { def: 0, num: true } // default is Equator, conversion to rad is automatic\n};\n\nexport function init() {\n Object.keys(params).forEach(function (p) {\n if (typeof this[p] === \"undefined\") {\n this[p] = params[p].def;\n } else if (params[p].num && isNaN(this[p])) {\n throw new Error(\"Invalid parameter value, must be numeric \" + p + \" = \" + this[p]);\n } else if (params[p].num) {\n this[p] = parseFloat(this[p]);\n }\n if (params[p].degrees) {\n this[p] = this[p] * D2R;\n }\n }.bind(this));\n\n if (Math.abs((Math.abs(this.lat0) - HALF_PI)) < EPSLN) {\n this.mode = this.lat0 < 0 ? mode.S_POLE : mode.N_POLE;\n } else if (Math.abs(this.lat0) < EPSLN) {\n this.mode = mode.EQUIT;\n } else {\n this.mode = mode.OBLIQ;\n this.sinph0 = Math.sin(this.lat0);\n this.cosph0 = Math.cos(this.lat0);\n }\n\n this.pn1 = this.h / this.a; // Normalize relative to the Earth's radius\n\n if (this.pn1 <= 0 || this.pn1 > 1e10) {\n throw new Error(\"Invalid height\");\n }\n \n this.p = 1 + this.pn1;\n this.rp = 1 / this.p;\n this.h1 = 1 / this.pn1;\n this.pfact = (this.p + 1) * this.h1;\n this.es = 0;\n\n var omega = this.tilt;\n var gamma = this.azi;\n this.cg = Math.cos(gamma);\n this.sg = Math.sin(gamma);\n this.cw = Math.cos(omega);\n this.sw = Math.sin(omega);\n}\n\nexport function forward(p) {\n p.x -= this.long0;\n var sinphi = Math.sin(p.y);\n var cosphi = Math.cos(p.y);\n var coslam = Math.cos(p.x);\n var x, y;\n switch (this.mode) {\n case mode.OBLIQ:\n y = this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;\n break;\n case mode.EQUIT:\n y = cosphi * coslam;\n break;\n case mode.S_POLE:\n y = -sinphi;\n break;\n case mode.N_POLE:\n y = sinphi;\n break;\n }\n y = this.pn1 / (this.p - y);\n x = y * cosphi * Math.sin(p.x);\n\n switch (this.mode) {\n case mode.OBLIQ:\n y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;\n break;\n case mode.EQUIT:\n y *= sinphi;\n break;\n case mode.N_POLE:\n y *= -(cosphi * coslam);\n break;\n case mode.S_POLE:\n y *= cosphi * coslam;\n break;\n }\n\n // Tilt \n var yt, ba;\n yt = y * this.cg + x * this.sg;\n ba = 1 / (yt * this.sw * this.h1 + this.cw);\n x = (x * this.cg - y * this.sg) * this.cw * ba;\n y = yt * ba;\n\n p.x = x * this.a;\n p.y = y * this.a;\n return p;\n}\n\nexport function inverse(p) {\n p.x /= this.a;\n p.y /= this.a;\n var r = { x: p.x, y: p.y };\n\n // Un-Tilt\n var bm, bq, yt;\n yt = 1 / (this.pn1 - p.y * this.sw);\n bm = this.pn1 * p.x * yt;\n bq = this.pn1 * p.y * this.cw * yt;\n p.x = bm * this.cg + bq * this.sg;\n p.y = bq * this.cg - bm * this.sg;\n\n var rh = hypot(p.x, p.y);\n if (Math.abs(rh) < EPSLN) {\n r.x = 0;\n r.y = p.y;\n } else {\n var cosz, sinz;\n sinz = 1 - rh * rh * this.pfact;\n sinz = (this.p - Math.sqrt(sinz)) / (this.pn1 / rh + rh / this.pn1);\n cosz = Math.sqrt(1 - sinz * sinz);\n switch (this.mode) {\n case mode.OBLIQ:\n r.y = Math.asin(cosz * this.sinph0 + p.y * sinz * this.cosph0 / rh);\n p.y = (cosz - this.sinph0 * Math.sin(r.y)) * rh;\n p.x *= sinz * this.cosph0;\n break;\n case mode.EQUIT:\n r.y = Math.asin(p.y * sinz / rh);\n p.y = cosz * rh;\n p.x *= sinz;\n break;\n case mode.N_POLE:\n r.y = Math.asin(cosz);\n p.y = -p.y;\n break;\n case mode.S_POLE:\n r.y = -Math.asin(cosz);\n break;\n }\n r.x = Math.atan2(p.x, p.y);\n }\n\n p.x = r.x + this.long0;\n p.y = r.y;\n return p;\n}\n\nexport var names = [\"Tilted_Perspective\", \"tpers\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import hypot from '../common/hypot';\n\nexport function init() {\n this.flip_axis = (this.sweep === 'x' ? 1 : 0);\n this.h = Number(this.h);\n this.radius_g_1 = this.h / this.a;\n\n if (this.radius_g_1 <= 0 || this.radius_g_1 > 1e10) {\n throw new Error();\n }\n\n this.radius_g = 1.0 + this.radius_g_1;\n this.C = this.radius_g * this.radius_g - 1.0;\n\n if (this.es !== 0.0) {\n var one_es = 1.0 - this.es;\n var rone_es = 1 / one_es;\n\n this.radius_p = Math.sqrt(one_es);\n this.radius_p2 = one_es;\n this.radius_p_inv2 = rone_es;\n\n this.shape = 'ellipse'; // Use as a condition in the forward and inverse functions.\n } else {\n this.radius_p = 1.0;\n this.radius_p2 = 1.0;\n this.radius_p_inv2 = 1.0;\n\n this.shape = 'sphere'; // Use as a condition in the forward and inverse functions.\n }\n\n if (!this.title) {\n this.title = \"Geostationary Satellite View\";\n }\n}\n\nfunction forward(p) {\n var lon = p.x;\n var lat = p.y;\n var tmp, v_x, v_y, v_z;\n lon = lon - this.long0;\n\n if (this.shape === 'ellipse') {\n lat = Math.atan(this.radius_p2 * Math.tan(lat));\n var r = this.radius_p / hypot(this.radius_p * Math.cos(lat), Math.sin(lat));\n\n v_x = r * Math.cos(lon) * Math.cos(lat);\n v_y = r * Math.sin(lon) * Math.cos(lat);\n v_z = r * Math.sin(lat);\n\n if (((this.radius_g - v_x) * v_x - v_y * v_y - v_z * v_z * this.radius_p_inv2) < 0.0) {\n p.x = Number.NaN;\n p.y = Number.NaN;\n return p;\n }\n\n tmp = this.radius_g - v_x;\n if (this.flip_axis) {\n p.x = this.radius_g_1 * Math.atan(v_y / hypot(v_z, tmp));\n p.y = this.radius_g_1 * Math.atan(v_z / tmp);\n } else {\n p.x = this.radius_g_1 * Math.atan(v_y / tmp);\n p.y = this.radius_g_1 * Math.atan(v_z / hypot(v_y, tmp));\n }\n } else if (this.shape === 'sphere') {\n tmp = Math.cos(lat);\n v_x = Math.cos(lon) * tmp;\n v_y = Math.sin(lon) * tmp;\n v_z = Math.sin(lat);\n tmp = this.radius_g - v_x;\n\n if (this.flip_axis) {\n p.x = this.radius_g_1 * Math.atan(v_y / hypot(v_z, tmp));\n p.y = this.radius_g_1 * Math.atan(v_z / tmp);\n } else {\n p.x = this.radius_g_1 * Math.atan(v_y / tmp);\n p.y = this.radius_g_1 * Math.atan(v_z / hypot(v_y, tmp));\n }\n }\n p.x = p.x * this.a;\n p.y = p.y * this.a;\n return p;\n}\n\nfunction inverse(p) {\n var v_x = -1.0;\n var v_y = 0.0;\n var v_z = 0.0;\n var a, b, det, k;\n\n p.x = p.x / this.a;\n p.y = p.y / this.a;\n\n if (this.shape === 'ellipse') {\n if (this.flip_axis) {\n v_z = Math.tan(p.y / this.radius_g_1);\n v_y = Math.tan(p.x / this.radius_g_1) * hypot(1.0, v_z);\n } else {\n v_y = Math.tan(p.x / this.radius_g_1);\n v_z = Math.tan(p.y / this.radius_g_1) * hypot(1.0, v_y);\n }\n\n var v_zp = v_z / this.radius_p;\n a = v_y * v_y + v_zp * v_zp + v_x * v_x;\n b = 2 * this.radius_g * v_x;\n det = (b * b) - 4 * a * this.C;\n\n if (det < 0.0) {\n p.x = Number.NaN;\n p.y = Number.NaN;\n return p;\n }\n\n k = (-b - Math.sqrt(det)) / (2.0 * a);\n v_x = this.radius_g + k * v_x;\n v_y *= k;\n v_z *= k;\n\n p.x = Math.atan2(v_y, v_x);\n p.y = Math.atan(v_z * Math.cos(p.x) / v_x);\n p.y = Math.atan(this.radius_p_inv2 * Math.tan(p.y));\n } else if (this.shape === 'sphere') {\n if (this.flip_axis) {\n v_z = Math.tan(p.y / this.radius_g_1);\n v_y = Math.tan(p.x / this.radius_g_1) * Math.sqrt(1.0 + v_z * v_z);\n } else {\n v_y = Math.tan(p.x / this.radius_g_1);\n v_z = Math.tan(p.y / this.radius_g_1) * Math.sqrt(1.0 + v_y * v_y);\n }\n\n a = v_y * v_y + v_z * v_z + v_x * v_x;\n b = 2 * this.radius_g * v_x;\n det = (b * b) - 4 * a * this.C;\n if (det < 0.0) {\n p.x = Number.NaN;\n p.y = Number.NaN;\n return p;\n }\n\n k = (-b - Math.sqrt(det)) / (2.0 * a);\n v_x = this.radius_g + k * v_x;\n v_y *= k;\n v_z *= k;\n\n p.x = Math.atan2(v_y, v_x);\n p.y = Math.atan(v_z * Math.cos(p.x) / v_x);\n }\n p.x = p.x + this.long0;\n return p;\n}\n\nexport var names = [\"Geostationary Satellite View\", \"Geostationary_Satellite\", \"geos\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names,\n};\n\n","import proj4 from './core';\nimport Proj from \"./Proj\";\nimport Point from \"./Point\";\nimport common from \"./common/toPoint\";\nimport defs from \"./defs\";\nimport nadgrid from \"./nadgrid\";\nimport transform from \"./transform\";\nimport mgrs from \"mgrs\";\nimport includedProjections from \"../projs\";\n\nproj4.defaultDatum = 'WGS84'; //default datum\nproj4.Proj = Proj;\nproj4.WGS84 = new proj4.Proj('WGS84');\nproj4.Point = Point;\nproj4.toPoint = common;\nproj4.defs = defs;\nproj4.nadgrid = nadgrid;\nproj4.transform = transform;\nproj4.mgrs = mgrs;\nproj4.version = '__VERSION__';\nincludedProjections(proj4);\nexport default proj4;\n","import tmerc from './lib/projections/tmerc';\nimport etmerc from './lib/projections/etmerc';\nimport utm from './lib/projections/utm';\nimport sterea from './lib/projections/sterea';\nimport stere from './lib/projections/stere';\nimport somerc from './lib/projections/somerc';\nimport omerc from './lib/projections/omerc';\nimport lcc from './lib/projections/lcc';\nimport krovak from './lib/projections/krovak';\nimport cass from './lib/projections/cass';\nimport laea from './lib/projections/laea';\nimport aea from './lib/projections/aea';\nimport gnom from './lib/projections/gnom';\nimport cea from './lib/projections/cea';\nimport eqc from './lib/projections/eqc';\nimport poly from './lib/projections/poly';\nimport nzmg from './lib/projections/nzmg';\nimport mill from './lib/projections/mill';\nimport sinu from './lib/projections/sinu';\nimport moll from './lib/projections/moll';\nimport eqdc from './lib/projections/eqdc';\nimport vandg from './lib/projections/vandg';\nimport aeqd from './lib/projections/aeqd';\nimport ortho from './lib/projections/ortho';\nimport qsc from './lib/projections/qsc';\nimport robin from './lib/projections/robin';\nimport geocent from './lib/projections/geocent';\nimport tpers from './lib/projections/tpers';\nimport geos from './lib/projections/geos';\nexport default function(proj4){\n proj4.Proj.projections.add(tmerc);\n proj4.Proj.projections.add(etmerc);\n proj4.Proj.projections.add(utm);\n proj4.Proj.projections.add(sterea);\n proj4.Proj.projections.add(stere);\n proj4.Proj.projections.add(somerc);\n proj4.Proj.projections.add(omerc);\n proj4.Proj.projections.add(lcc);\n proj4.Proj.projections.add(krovak);\n proj4.Proj.projections.add(cass);\n proj4.Proj.projections.add(laea);\n proj4.Proj.projections.add(aea);\n proj4.Proj.projections.add(gnom);\n proj4.Proj.projections.add(cea);\n proj4.Proj.projections.add(eqc);\n proj4.Proj.projections.add(poly);\n proj4.Proj.projections.add(nzmg);\n proj4.Proj.projections.add(mill);\n proj4.Proj.projections.add(sinu);\n proj4.Proj.projections.add(moll);\n proj4.Proj.projections.add(eqdc);\n proj4.Proj.projections.add(vandg);\n proj4.Proj.projections.add(aeqd);\n proj4.Proj.projections.add(ortho);\n proj4.Proj.projections.add(qsc);\n proj4.Proj.projections.add(robin);\n proj4.Proj.projections.add(geocent);\n proj4.Proj.projections.add(tpers);\n proj4.Proj.projections.add(geos);\n}","import proj4 from 'proj4';\nimport pkg from 'point-in-polygon';\n\n/** @module src/km100 */\n\n/** @constant\n * @description This the array from which the default object is derived. If you\n * need to work with an array of objects where the 100 km grid reference is a property\n * of the object alongside x, y, and proj, you can use this.\n * @type {array}\n*/\nconst a100km = [\n {\n \"GridRef\": \"SV\",\n \"x\": 0,\n \"y\": 0,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NL\",\n \"x\": 0,\n \"y\": 7,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NF\",\n \"x\": 0,\n \"y\": 8,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NA\",\n \"x\": 0,\n \"y\": 9,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SW\",\n \"x\": 1,\n \"y\": 0,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SR\",\n \"x\": 1,\n \"y\": 1,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SM\",\n \"x\": 1,\n \"y\": 2,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NW\",\n \"x\": 1,\n \"y\": 5,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NR\",\n \"x\": 1,\n \"y\": 6,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NM\",\n \"x\": 1,\n \"y\": 7,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NG\",\n \"x\": 1,\n \"y\": 8,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NB\",\n \"x\": 1,\n \"y\": 9,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"HW\",\n \"x\": 1,\n \"y\": 10,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SX\",\n \"x\": 2,\n \"y\": 0,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SS\",\n \"x\": 2,\n \"y\": 1,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SN\",\n \"x\": 2,\n \"y\": 2,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SH\",\n \"x\": 2,\n \"y\": 3,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SC\",\n \"x\": 2,\n \"y\": 4,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NX\",\n \"x\": 2,\n \"y\": 5,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NS\",\n \"x\": 2,\n \"y\": 6,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NN\",\n \"x\": 2,\n \"y\": 7,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NH\",\n \"x\": 2,\n \"y\": 8,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NC\",\n \"x\": 2,\n \"y\": 9,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"HX\",\n \"x\": 2,\n \"y\": 10,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SY\",\n \"x\": 3,\n \"y\": 0,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"ST\",\n \"x\": 3,\n \"y\": 1,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SO\",\n \"x\": 3,\n \"y\": 2,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SJ\",\n \"x\": 3,\n \"y\": 3,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SD\",\n \"x\": 3,\n \"y\": 4,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NY\",\n \"x\": 3,\n \"y\": 5,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NT\",\n \"x\": 3,\n \"y\": 6,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NO\",\n \"x\": 3,\n \"y\": 7,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NJ\",\n \"x\": 3,\n \"y\": 8,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"ND\",\n \"x\": 3,\n \"y\": 9,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"HY\",\n \"x\": 3,\n \"y\": 10,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"HT\",\n \"x\": 3,\n \"y\": 11,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SZ\",\n \"x\": 4,\n \"y\": 0,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SU\",\n \"x\": 4,\n \"y\": 1,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SP\",\n \"x\": 4,\n \"y\": 2,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SK\",\n \"x\": 4,\n \"y\": 3,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"SE\",\n \"x\": 4,\n \"y\": 4,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NZ\",\n \"x\": 4,\n \"y\": 5,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NU\",\n \"x\": 4,\n \"y\": 6,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"NK\",\n \"x\": 4,\n \"y\": 8,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"HZ\",\n \"x\": 4,\n \"y\": 10,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"HU\",\n \"x\": 4,\n \"y\": 11,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"HP\",\n \"x\": 4,\n \"y\": 12,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"TV\",\n \"x\": 5,\n \"y\": 0,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"TQ\",\n \"x\": 5,\n \"y\": 1,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"TL\",\n \"x\": 5,\n \"y\": 2,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"TF\",\n \"x\": 5,\n \"y\": 3,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"TA\",\n \"x\": 5,\n \"y\": 4,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"OV\",\n \"x\": 5,\n \"y\": 5,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"TR\",\n \"x\": 6,\n \"y\": 1,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"TM\",\n \"x\": 6,\n \"y\": 2,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"TG\",\n \"x\": 6,\n \"y\": 3,\n \"proj\": \"gb\"\n },\n {\n \"GridRef\": \"V\",\n \"x\": 0,\n \"y\": 0,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"Q\",\n \"x\": 0,\n \"y\": 1,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"L\",\n \"x\": 0,\n \"y\": 2,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"F\",\n \"x\": 0,\n \"y\": 3,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"A\",\n \"x\": 0,\n \"y\": 4,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"W\",\n \"x\": 1,\n \"y\": 0,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"R\",\n \"x\": 1,\n \"y\": 1,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"M\",\n \"x\": 1,\n \"y\": 2,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"G\",\n \"x\": 1,\n \"y\": 3,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"B\",\n \"x\": 1,\n \"y\": 4,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"X\",\n \"x\": 2,\n \"y\": 0,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"S\",\n \"x\": 2,\n \"y\": 1,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"N\",\n \"x\": 2,\n \"y\": 2,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"H\",\n \"x\": 2,\n \"y\": 3,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"C\",\n \"x\": 2,\n \"y\": 4,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"Y\",\n \"x\": 3,\n \"y\": 0,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"T\",\n \"x\": 3,\n \"y\": 1,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"O\",\n \"x\": 3,\n \"y\": 2,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"J\",\n \"x\": 3,\n \"y\": 3,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"D\",\n \"x\": 3,\n \"y\": 4,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"Z\",\n \"x\": 4,\n \"y\": 0,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"U\",\n \"x\": 4,\n \"y\": 1,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"P\",\n \"x\": 4,\n \"y\": 2,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"K\",\n \"x\": 4,\n \"y\": 3,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"E\",\n \"x\": 4,\n \"y\": 4,\n \"proj\": \"ir\"\n },\n {\n \"GridRef\": \"WV\",\n \"x\": 5,\n \"y\": 54,\n \"proj\": \"ci\"\n },\n {\n \"GridRef\": \"WA\",\n \"x\": 5,\n \"y\": 55,\n \"proj\": \"ci\"\n }\n];\n\n/** @constant\n * @description The default export from this module is an object with a property\n * for every 100 km square reference for Britain (Brtish National Grid),\n * Ireland (Irish National Grid) and the Channel Islands (abbreviated UTM 30N).\n * Each grid reference references an object that has properties x, y and proj.\n * The x and y coordinates represent the centroid of the 100 km square in the\n * coordinate reference system corresponding to the aforementioned areas, respectively\n * epsg:27700, epsg:29903 and epsg:32630. Another property, proj, indicates the region/CRS\n * with two letter codes, respectively gb, ir and ci.\n *

    An example of the object referenced through the property 'SO' is shown below:

    \n *
    \n  * {\n  *   \"x\": 3,\n  *   \"y\": 2,\n  *   \"proj\": \"gb\"\n  * }\n  * 
    \n * @type {object}\n*/\nvar km100s = a100km.reduce(function(acc, km100) {\n acc[km100.GridRef] = {\n x: km100.x,\n y: km100.y,\n proj: km100.proj\n };\n return acc\n }, {});\n\n/** @module src/checkGr */\n\nfunction invalidGridRef(gr) {\n throw `The value '${gr}' is not recognised as a valid grid reference.` \n}\n\n/**\n * Given a grid reference (British National Grid, Irish Grid or UTM zone 30N shorthand),\n * check that ths is a valid GR. If it is, return an object which includes the \n * GR precision in metres, the prefix and the two-letter projection code.\n * If an invalid grid reference is supplied throws an error.\n * @param {string} gr - the grid reference.\n * @returns {object} Object of the form {precision: n, prefix: 'prefix', projection: 'code'}.\n */\nfunction checkGr (gr) {\n\n const r100km = RegExp('^[a-zA-Z]{1,2}$');\n const rHectad = RegExp('^[a-zA-Z]{1,2}[0-9]{2}$');\n const rQuandrant = RegExp('^[a-zA-Z]{1,2}[0-9]{2}[SsNn][WwEe]$');\n const rTetrad = RegExp('^[a-zA-Z]{1,2}[0-9]{2}[a-np-zA-NP-Z]$');\n const rMonad = RegExp('^[a-zA-Z]{1,2}[0-9]{4}$');\n const r6fig = RegExp('^[a-zA-Z]{1,2}[0-9]{6}$');\n const r8fig = RegExp('^[a-zA-Z]{1,2}[0-9]{8}$');\n const r10fig = RegExp('^[a-zA-Z]{1,2}[0-9]{10}$');\n\n const match = gr.match(/^[A-Za-z]+/);\n if (!match) invalidGridRef(gr); \n\n const prefix = match[0].toUpperCase();\n const km100 = km100s[prefix];\n \n if (!km100) invalidGridRef(gr); \n\n const ret = {precision: null, prefix: prefix, projection: km100.proj};\n\n if (r100km.test(gr)) {\n\n // The GR is a 100 km square reference\n ret.precision = 100000;\n\n } else if (rHectad.test(gr)) {\n\n // The GR is a hectad\n ret.precision = 10000;\n\n } else if (rQuandrant.test(gr)) {\n\n // The GR is a quandrant\n ret.precision = 5000;\n\n } else if (rTetrad.test(gr)) {\n \n // The GR is a tetrad\n ret.precision = 2000;\n\n } else if (rMonad.test(gr)) {\n\n // The GR is a monad\n ret.precision = 1000;\n \n } else if (r6fig.test(gr)) {\n\n // The GR is a 6 figure GR\n ret.precision = 100;\n \n } else if (r8fig.test(gr)) {\n\n // The GR is a 8 figure GR\n ret.precision = 10;\n \n } else if (r10fig.test(gr)) {\n\n // The GR is a 10 figure GR\n ret.precision = 1;\n \n } else {\n invalidGridRef(gr); \n }\n\n return ret\n}\n\n/** @module src/projections */\n\n/** @constant\n * @description This object describes the coordinate reference systems used in this project corresponding\n * to the British National Grid, Irish Grid, UTM zone 30N (used for the Channel Islands) and WGS 84. The object contains\n * four properties, each named with the two letter code used throughout this package to represent one of the\n * three systems: gb, ir, ci and wg. Each of these properties provides access to an object defining the name,\n * epsg code and proj4 string for the CRS.\n * @type {array}\n*/\n\nvar projections = {\n gb: {\n name: 'OSGB 1936 / British National Grid',\n epsg: '27700',\n proj4: '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489 +units=m +no_defs',\n },\n ir: {\n name: 'TM75 / Irish Grid',\n epsg: '29903',\n proj4: '+proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +ellps=mod_airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15 +units=m +no_defs',\n },\n ci: {\n name: 'WGS 84 / UTM zone 30N',\n epsg: '32630',\n proj4: '+proj=utm +zone=30 +datum=WGS84 +units=m +no_defs',\n },\n wg: {\n name: 'WGS 84',\n epsg: '4326',\n proj4: '+proj=longlat +datum=WGS84 +no_defs',\n }\n};\n\n/** @module src/quadrants */\n\n/** @constant\n * @description This object specifies the x, y offsets associated with suffixes for quandrant grid refs.\n * @type {Object}\n*/\n\nvar qOffsets = {\n sw: {\n x: 0,\n y: 0\n },\n se: {\n x: 5000,\n y: 0\n },\n nw: {\n x: 0,\n y: 5000\n },\n ne: {\n x: 5000,\n y: 5000\n }\n};\n\n/** @module src/tetrads */\n\n/** @constant\n * @description This object specifies the x, y offsets associated with suffixes for tetrad grid refs.\n * @type {Object}\n*/\n\nvar tOffsets = {\n a: {\n x: 0,\n y: 0\n },\n b: {\n x: 0,\n y: 2000\n },\n c: {\n x: 0,\n y: 4000\n },\n d: {\n x: 0,\n y: 6000\n },\n e: {\n x: 0,\n y: 8000\n },\n f: {\n x: 2000,\n y: 0\n },\n g: {\n x: 2000,\n y: 2000\n },\n h: {\n x: 2000,\n y: 4000\n },\n i: {\n x: 2000,\n y: 6000\n },\n j: {\n x: 2000,\n y: 8000\n },\n k: {\n x: 4000,\n y: 0\n },\n l: {\n x: 4000,\n y: 2000\n },\n m: {\n x: 4000,\n y: 4000\n },\n n: {\n x: 4000,\n y: 6000\n },\n p: {\n x: 4000,\n y: 8000\n },\n q: {\n x: 6000,\n y: 0\n },\n r: {\n x: 6000,\n y: 2000\n },\n s: {\n x: 6000,\n y: 4000\n },\n t: {\n x: 6000,\n y: 6000\n },\n u: {\n x: 6000,\n y: 8000\n },\n v: {\n x: 8000,\n y: 0\n },\n w: {\n x: 8000,\n y: 2000\n },\n x: {\n x: 8000,\n y: 4000\n },\n y: {\n x: 8000,\n y: 6000\n },\n z: {\n x: 8000,\n y: 8000\n }\n};\n\n/** @module src/getCentroid */\n\n/**\n * Given a grid reference (British National Grid, Irish Grid or UTM zone 30N shorthand),\n * and a two-letter code defining the requested output projection, this function\n * returns the centroid of the grid reference.\n * @param {string} gr - the grid reference\n * @param {string} toProjection - two letter code specifying the required output CRS.\n * @returns {object} - of the form {centroid: [x, y], proj: 'code'}; x and y are \n * coordinates in CRS specified by toProjection. The proj code indicates the source projection.\n */\nfunction getCentroid (gr, toProjection) {\n\n let x, y, outCoords, suffix;\n const grType = checkGr(gr);\n const prefix = grType.prefix;\n const km100 = km100s[prefix];\n\n switch(grType.precision) {\n case 100000:\n x = km100.x * 100000 + 50000;\n y = km100.y * 100000 + 50000;\n break;\n case 10000:\n x = km100.x * 100000 + Number(gr.substr(prefix.length,1)) * 10000 + 5000;\n y = km100.y * 100000 + Number(gr.substr(prefix.length+1,1)) * 10000 + 5000;\n break;\n case 5000:\n suffix = gr.substr(prefix.length+2,2).toLowerCase();\n x = km100.x * 100000 + Number(gr.substr(prefix.length,1)) * 10000 + qOffsets[suffix].x + 2500;\n y = km100.y * 100000 + Number(gr.substr(prefix.length+1,1)) * 10000 + qOffsets[suffix].y + 2500;\n break\n case 2000:\n suffix = gr.substr(prefix.length+2,1).toLowerCase();\n x = km100.x * 100000 + Number(gr.substr(prefix.length,1)) * 10000 + tOffsets[suffix].x + 1000;\n y = km100.y * 100000 + Number(gr.substr(prefix.length+1,1)) * 10000 + tOffsets[suffix].y + 1000;\n break\n case 1000:\n x = km100.x * 100000 + Number(gr.substr(prefix.length,2)) * 1000 + 500;\n y = km100.y * 100000 + Number(gr.substr(prefix.length+2,2)) * 1000 + 500;\n break\n case 100:\n x = km100.x * 100000 + Number(gr.substr(prefix.length,3)) * 100 + 50;\n y = km100.y * 100000 + Number(gr.substr(prefix.length+3,3)) * 100 + 50;\n break\n case 10:\n x = km100.x * 100000 + Number(gr.substr(prefix.length,4)) * 10 + 5;\n y = km100.y * 100000 + Number(gr.substr(prefix.length+4,4)) * 10 + 5;\n break\n default:\n x = km100.x * 100000 + Number(gr.substr(prefix.length,5)) + 0.5;\n y = km100.y * 100000 + Number(gr.substr(prefix.length+5,5)) + 0.5;\n }\n\n // If the required output projection does not match the projection of the input GR\n // then use proj4 to reproject\n if (toProjection !== km100.proj) {\n outCoords = proj4(projections[km100.proj].proj4, projections[toProjection].proj4, [x, y]);\n } else {\n outCoords = [x, y];\n }\n return {\n centroid: outCoords,\n proj: km100.proj\n }\n}\n\n/** @module src/getGjson */\n\nfunction convertCoords(fromProjection, toProjection, x, y) {\n\n let outCoords;\n // If the required output projection does not match the projection of the input GR\n // then use proj4 to reproject\n if (toProjection !== fromProjection) {\n outCoords = proj4(projections[fromProjection].proj4, projections[toProjection].proj4, [x, y]);\n } else {\n outCoords = [x, y];\n }\n return outCoords\n}\n\n/**\n * Given a grid reference (British National Grid, Irish Grid or UTM zone 30N shorthand),\n * a two-letter code defining the requested output projection, and a string indicating\n * the shape of the required 'symbol', this function returns a GeoJson pth geometry object.\n * @param {string} gr - the grid reference.\n * @param {string} toProjection - two letter code specifying the required output CRS.\n * @param {string} shape - string specifying the requested output shape type.\n * @param {number} scale - number between 0 and 1 to scale the output object.\n * @returns {object} - a GeoJson path geometry object.\n * @todo Extend to return all symbol types\n */\nfunction getGjson (gr, toProjection, shape, scale) {\n\n const size = scale ? scale : 1; \n const grType = checkGr(gr);\n const km100 = km100s[grType.prefix];\n const centroid = getCentroid(gr, km100.proj).centroid;\n const xmin = centroid[0] - grType.precision / 2 * size;\n const xmax = centroid[0] + grType.precision / 2 * size;\n const ymin = centroid[1] - grType.precision / 2 * size;\n const ymax = centroid[1] + grType.precision / 2 * size;\n const xmid = xmin + (xmax-xmin)/2;\n const ymid = ymin + (ymax-ymin)/2;\n\n let coords;\n let type = \"Polygon\";\n if (shape === \"square\") {\n coords = [[\n convertCoords(km100.proj, toProjection, xmin, ymin),\n convertCoords(km100.proj, toProjection, xmax, ymin),\n convertCoords(km100.proj, toProjection, xmax, ymax),\n convertCoords(km100.proj, toProjection, xmin, ymax),\n convertCoords(km100.proj, toProjection, xmin, ymin)\n ]];\n } else if (shape === \"triangle-up\") {\n coords = [[\n convertCoords(km100.proj, toProjection, xmin, ymin),\n convertCoords(km100.proj, toProjection, xmax, ymin),\n convertCoords(km100.proj, toProjection, xmid, ymax),\n convertCoords(km100.proj, toProjection, xmin, ymin)\n ]];\n } else if (shape === \"triangle-down\") {\n coords = [[\n convertCoords(km100.proj, toProjection, xmid, ymin),\n convertCoords(km100.proj, toProjection, xmax, ymax),\n convertCoords(km100.proj, toProjection, xmin, ymax),\n convertCoords(km100.proj, toProjection, xmid, ymin)\n ]];\n } else if (shape === \"diamond\") {\n coords = [[\n convertCoords(km100.proj, toProjection, xmid, ymin),\n convertCoords(km100.proj, toProjection, xmax, ymid),\n convertCoords(km100.proj, toProjection, xmid, ymax),\n convertCoords(km100.proj, toProjection, xmin, ymid),\n convertCoords(km100.proj, toProjection, xmid, ymin)\n ]];\n } else if (shape === \"circle\") {\n const rad = grType.precision / 2 * size;\n coords = [[]];\n for(let deg = 0; deg <= 360; deg += 15){\n const angle = deg * Math.PI / 180;\n const x = rad * Math.cos(angle) + centroid[0];\n const y = rad * Math.sin(angle) + centroid[1];\n coords[0].push(convertCoords(km100.proj, toProjection, x, y));\n }\n } else if (shape === \"circlerad\") {\n coords = [[\n convertCoords(km100.proj, toProjection, centroid[0], centroid[1]),\n convertCoords(km100.proj, toProjection, xmax, centroid[1])\n ]];\n } else if (shape === \"cross\") {\n type = \"MultiLineString\";\n coords = [\n [convertCoords(km100.proj, toProjection, xmin, ymin),\n convertCoords(km100.proj, toProjection, xmax, ymin),\n convertCoords(km100.proj, toProjection, xmax, ymax),\n convertCoords(km100.proj, toProjection, xmin, ymax),\n convertCoords(km100.proj, toProjection, xmin, ymin)],\n [convertCoords(km100.proj, toProjection, xmin, ymin),\n convertCoords(km100.proj, toProjection, xmax, ymax)],\n [convertCoords(km100.proj, toProjection, xmin, ymax),\n convertCoords(km100.proj, toProjection, xmax, ymin)]\n ];\n } else if (shape === \"point\") {\n type = \"Point\";\n coords = convertCoords(km100.proj, toProjection, centroid[0], centroid[1]);\n }\n\n return {\n \"type\": type,\n \"coordinates\": coords\n }\n}\n\n/** @module src/pntToArea */\nconst inside = pkg;\n\nconst polyGb = [[-5.079346,54.356181],[-5.218856,54.352538],[-5.238015,54.577735],[-5.594707,55.067578],[-5.85957,55.233056],[-6.1989,55.442175],[-6.754907,55.520643],[-6.826016,56.098271],[-8.4242,56.025199],[-8.577402,56.917818],[-8.739734,57.810026],[-8.911963,58.7018],[-7.193942,58.782764],[-7.332053,59.676983],[-5.560279,59.737099],[-3.782533,59.77326],[-3.831945,60.670683],[-2.001839,60.683214],[-2.0019,61.58096],[-0.119146,61.568018],[-0.17173,60.67074],[-0.22103,59.773315],[-0.267328,58.875744],[-2.00173,58.887355],[-2.00168,57.989238],[-0.310874,57.978026],[-0.351892,57.080161],[-2.001633,57.090993],[-2.001588,56.192619],[-0.390579,56.182148],[-0.427115,55.283988],[1.145328,55.253591],[1.076342,54.356271],[1.011037,53.458761],[2.513016,53.411393],[2.420466,52.515203],[2.332666,51.618767],[2.249301,50.722093],[0.834724,50.76511],[0.781771,49.866861],[-0.609132,49.891897],[-2.001337,49.900236],[-3.39354,49.891859],[-4.784439,49.866784],[-6.172738,49.825069],[-7.55716,49.766807],[-7.662447,50.661841],[-6.252021,50.721974],[-6.33545,51.618645],[-5.822792,52.024604],[-5.051366,52.558456],[-5.051366,52.558457],[-4.952011,52.560978],[-5.013966,53.458674],[-5.079346,54.356181]];\nconst polyIr = [[-10.863443,51.218565],[-10.920638,52.116175],[-10.980909,53.013601],[-11.044479,53.91084],[-11.111595,54.80789],[-11.182531,55.704747],[-9.592679,55.735662],[-8.000759,55.74598],[-6.781597,55.739941],[-6.754907,55.520643],[-6.419264,55.473617],[-6.1989,55.442175],[-5.85957,55.233056],[-5.594707,55.067578],[-5.413363,54.820209],[-5.238015,54.577735],[-5.218856,54.352538],[-5.079346,54.356181],[-5.046624,53.9131],[-5.013966,53.458674],[-5.001631,53.283731],[-5.020559,53.013619],[-5.051336,52.558457],[-5.051366,52.558457],[-5.051366,52.558456],[-5.673366,52.129388],[-5.822792,52.024604],[-6.33545,51.618645],[-6.299809,51.241244],[-6.568641,51.244838],[-8.000721,51.253594],[-9.432801,51.24483],[-10.863443,51.218565]];\nconst polyCi = [[-1.614831,49.644257],[-1.639721,48.744984],[-3,48.753013],[-3,49.652543],[-3,49.895922],[-2.001337,49.900236],[-1.607534,49.899573],[-1.614831,49.644257]];\n\n/**\n * Given a WGS 84 lon, lat pair, return the two letter code corresponding to the area\n * that the point is in. The three polygons describe the regions covered by the 100 km\n * squares for the British, Irish and Channel Island coordinate systems. These areas are\n * exclusive. Where they overlap, e.g. British and Irish, they have been divided by a line\n * through the Irish see roughly midway between the land masses. For the Channel Islands\n * and Britain, the CI UTM 30 grid is truncated where it overlaps the British grid. The\n * function returns the two-letter code corresponding to the area: gb, ir or ci.\n * It returns null if the point doesn't fall within any of these areas.\n * @param {number} lon - Longitude.\n * @param {number} lat - Latitude.\n * @returns {string} - Two-letter code corresponding to the area, or null.\n */\nfunction pntToArea (lon, lat) {\n if (inside([ lon, lat ], polyGb)) return 'gb'\n if (inside([ lon, lat ], polyIr)) return 'ir'\n if (inside([ lon, lat ], polyCi)) return 'ci'\n return null\n}\n\n/** @module src/getGrFromCoords */\n\n/**\n * Given a coordinate pair (British National Grid, Irish Grid, UTM zone 30N shorthand or WGS84),\n * a two-letter code defining the projection of the passed in coordinates,\n * a two-letter code defining the required output projection, and an array of numbers\n * indicating the required output precisions, returns an object with the grid references\n * at the requested precisions in the requested projection. If the requested projection is\n * an empty string, automatic selection will be used based on location of input coords.\n * @param {number} x - the x coordinate (longitude if in WGS 84).\n * @param {number} y - the y coordinate (latitude if in WGS 84).\n * @param {string} fromProjection - two letter code for projection of the passed in coords.\n * @param {string} toProjection - two letter code specifying the required output projection - leave empty for automatic selection.\n * @param {array} precisions - array of numbers corresponding to the precisions of the requested grid references.\n * @returns {object} - of the form {p10000: 'gr-hectad', p100: 'gr-6fig'} etc, with a property for each of the requested grid reference precisions.\n */\nfunction getGrFromCoords (x, y, fromProjection, toProjection, precisions) {\n\n // Set the output projection automatically if not aleady set\n if (!toProjection) {\n if (fromProjection === 'wg') {\n toProjection = pntToArea(x, y);\n } else {\n const lonlat = proj4(projections[fromProjection].proj4, projections['wg'].proj4, [x, y]);\n toProjection = pntToArea(lonlat[0], lonlat[1]);\n }\n }\n\n if (!toProjection) {\n const grs = {};\n precisions.forEach(p => {\n grs[`p${p}`] = null;\n });\n return grs\n }\n \n // Convert input coordinates if the input projection does not match requested output projection\n if (fromProjection !== toProjection) {\n const outCoords = proj4(projections[fromProjection].proj4, projections[toProjection].proj4, [x, y]);\n x = outCoords[0];\n y = outCoords[1];\n }\n\n let km100;\n for (let i = 0; i < a100km.length; i++) {\n if (a100km[i].proj === toProjection &&\n x >= a100km[i].x * 100000 &&\n x < (a100km[i].x + 1) * 100000 &&\n y >= a100km[i].y * 100000 &&\n y < (a100km[i].y + 1) * 100000) {\n\n km100 = a100km[i];\n break\n }\n }\n\n if(!km100) {\n // The output coordinates do not fall within the range of 100 km grid squares defined for the output projection.\n // Return an empty array.\n return {\n p100000: null,\n p10000: null,\n p5000: null,\n p2000: null,\n p1000: null,\n p100: null,\n p10: null,\n p1: null\n }\n }\n\n const grs = {};\n precisions.forEach(p => {\n let gr = km100.GridRef;\n if (p < 100000){\n\n let divisor;\n if (p === 5000 || p === 2000) {\n divisor = 10000;\n } else {\n divisor = p;\n }\n\n const pad = {\n 10000: 1,\n 1000: 2,\n 100: 3,\n 10: 4,\n 1: 5\n };\n\n const dx = Math.floor((x - km100.x * 100000) / divisor);\n const dy = Math.floor((y - km100.y * 100000) / divisor);\n const sx = String(dx).padStart(pad[divisor], '0');\n const sy = String(dy).padStart(pad[divisor], '0');\n\n gr = `${gr}${sx}${sy}`;\n\n if (p === 5000 || p === 2000) {\n let rx = (x - km100.x * 100000) % divisor;\n let ry = (y - km100.y * 100000) % divisor;\n if (p === 5000) {\n\n for (const suffix in qOffsets) {\n if (rx >= qOffsets[suffix].x &&\n rx < qOffsets[suffix].x + 5000 && \n ry >= qOffsets[suffix].y &&\n ry < qOffsets[suffix].y + 5000) {\n gr = `${gr}${suffix.toUpperCase()}`;\n break\n }\n }\n } else {\n for (const suffix in tOffsets) {\n if (rx >= tOffsets[suffix].x &&\n rx < tOffsets[suffix].x + 2000 && \n ry >= tOffsets[suffix].y &&\n ry < tOffsets[suffix].y + 2000) {\n gr = `${gr}${suffix.toUpperCase()}`;\n break\n }\n }\n }\n }\n }\n grs[`p${p}`] = gr;\n });\n return grs\n}\n\n/** @module src/getLowerResGrs */\n\n/**\n * Given a grid reference (British National Grid, Irish Grid, UTM zone 30N shorthand),\n * return an object with a corresponsing GR for each precision. For all precisions higher\n * than the precision of the passed in GR, the return GR is set to null. In the special\n * returned Quadrant (5 km) grid references are in an array to allow for the case where\n * the input grid reference is a tetrad and overlaps more than one quadrant.\n * @param {string} gr - Grid reference.\n * @returns {object} - of the form {p100000: 'gr-100km', p10000: 'gr-hectad', p5000: ['gr_quad1', ...], p2000: 'gr-tetrad', ...}, with a property for each precisions.\n */\nfunction getLowerResGrs (gr) {\n\n const grType = checkGr(gr);\n\n const ret = {\n p100000: grType.prefix, \n p10000: null, \n p5000: grType.precision <= 5000 ? [] : null, \n p2000: null, \n p1000: null, \n p100: null, \n p10: null, \n p1: null\n };\n\n // Set the passed in GR in the return value\n if (grType.precision === 5000) {\n ret.p5000.push(gr);\n } else {\n ret[`p${grType.precision}`] = gr;\n }\n \n const c = getCentroid(gr, grType.projection).centroid;\n const precisions = [10000, 5000, 2000, 1000, 100, 10, 1].filter(p => p > grType.precision);\n const grs = getGrFromCoords(c[0], c[1], grType.projection, grType.projection, precisions);\n\n precisions.forEach(p => {\n if (p === 5000) {\n if (grType.precision === 2000) {\n const hectad = gr.substring(0,gr.length-1);\n if ('ABCFGHKLM'.indexOf(gr.substr(-1)) > -1) {\n ret.p5000.push(`${hectad}SW`);\n }\n if ('KLMQRSVWX'.indexOf(gr.substr(-1)) > -1) {\n ret.p5000.push(`${hectad}SE`);\n }\n if ('CDEHIJMNP'.indexOf(gr.substr(-1)) > -1) {\n ret.p5000.push(`${hectad}NW`);\n }\n if ('MNPSTUXYZ'.indexOf(gr.substr(-1)) > -1) {\n ret.p5000.push(`${hectad}NE`);\n }\n } else {\n ret.p5000.push(grs.p5000);\n }\n } else {\n ret[`p${p}`] = grs[`p${p}`];\n }\n });\n return ret\n}\n\nexport { checkGr, getCentroid, getGjson, getGrFromCoords, getLowerResGrs, pntToArea };\n","import * as d3 from 'd3'\nimport { getCentroid, checkGr } from 'brc-atlas-bigr'\nimport { getRadiusPixels } from './svgCoords.js'\n\nexport function removeDots(svg) {\n svg.selectAll('.dotCircle').remove()\n svg.selectAll('.dotSquare').remove()\n svg.selectAll('.dotTriangle').remove()\n svg.selectAll('.dotDiamond').remove()\n}\n\nexport function drawDots(svg, captionId, onclick, transform, accessFunction, taxonIdentifier, proj) {\n function getCaption(d) {\n if (d.caption) {\n return d.caption\n } else {\n return ''\n }\n }\n\n const pTrans = []\n function addPromise(transition) {\n // If the transition has any elements in selection, then\n // create a promise that resolves when the transition of\n // the last element completes. We do the check because it\n // seems that with zero elements, the promise does not resolve\n // (remains pending).\n // The promise is created by\n // using the 'end' method on the transition.\n // The promise rejects if a transition is interrupted\n // so need to handle that. (https://www.npmjs.com/package/d3-transition)\n if (transition.size()) {\n const p = transition.end()\n p.catch(() => null)\n pTrans.push(p)\n }\n }\n\n return new Promise((resolve, reject) => {\n if(typeof accessFunction === 'function') {\n accessFunction(taxonIdentifier).then(data => {\n\n if (!data) return\n\n const radiusPixels = getRadiusPixels(transform, data.precision)\n // circles\n let recCircles\n if (data.shape && (data.shape === 'circle' || data.shape === 'bullseye')) {\n recCircles = data.records\n } else {\n recCircles = data.records.filter(d => d.shape && (d.shape === 'circle' || d.shape === 'bullseye'))\n }\n const circles = svg.selectAll('.dotCircle')\n .data(recCircles, d => d.gr)\n const circlesMerge = circles.enter()\n .append(\"circle\")\n //.classed('dotCircle dot', true)\n .attr(\"cx\", d => transform(getCentroid(d.gr, proj).centroid)[0])\n .attr(\"cy\", d => transform(getCentroid(d.gr, proj).centroid)[1])\n .attr(\"r\", 0)\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .style(\"fill\", d => d.colour ? d.colour : data.colour)\n\n .merge(circles)\n // legendKey can change so this needs to be in merge\n .attr('class', d => {\n let c = 'dotCircle dot'\n if (d.legendKey) {\n c = `${c} legend-key-${d.legendKey}`\n }\n return c\n })\n .transition()\n .ease(d3.easeCubic)\n .duration(500)\n .attr(\"r\", d => {\n const size = d.size ? d.size : data.size\n return size ? radiusPixels * size : radiusPixels\n })\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .style(\"fill\", d => d.colour ? d.colour : data.colour)\n .attr(\"stroke\", d => d.stroke ? d.stroke : data.stroke ? data.stroke : null )\n .attr('clip-path', 'circle()')\n .attr(\"data-caption\", d => getCaption(d))\n\n addPromise(circlesMerge)\n\n const circlesExit = circles.exit()\n .transition()\n .ease(d3.easeCubic)\n .duration(500)\n .attr(\"r\", 0)\n .remove()\n\n addPromise(circlesExit)\n\n\n // bullseye\n let recBullseyes\n if (data.shape && data.shape === 'bullseye') {\n recBullseyes = data.records\n } else {\n recBullseyes = data.records.filter(d => d.shape && d.shape === 'bullseye')\n }\n const bullseyes = svg.selectAll('.dotBullseye')\n .data(recBullseyes, d => d.gr)\n\n const bullseyesMerge = bullseyes.enter()\n .append(\"circle\")\n //.classed('dotBullseye dot', true)\n // .attr('clip-path', 'circle()')\n .attr(\"cx\", d => transform(getCentroid(d.gr, proj).centroid)[0])\n .attr(\"cy\", d => transform(getCentroid(d.gr, proj).centroid)[1])\n .attr(\"r\", 0)\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .style(\"fill\", d => d.colour2 ? d.colour2 : data.colour2)\n .merge(bullseyes)\n // legendKey can change so this needs to be in merge\n .attr('class', d => {\n let c = 'dotBullseye dot'\n if (d.legendKey) {\n c = `${c} legend-key-${d.legendKey}`\n }\n return c\n })\n .transition()\n .ease(d3.easeCubic)\n .duration(500)\n .attr(\"r\", d => {\n const size = d.size ? d.size : data.size\n return radiusPixels * size * 0.5\n })\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .style(\"fill\", d => d.colour2 ? d.colour2 : data.colour2)\n .attr(\"data-caption\", d => getCaption(d))\n\n addPromise(bullseyesMerge)\n\n const bullseyesExit = bullseyes.exit()\n .transition()\n .ease(d3.easeCubic)\n .duration(500)\n .attr(\"r\", 0)\n .remove()\n\n addPromise(bullseyesExit)\n\n // squares\n let recSquares\n if (data.shape && data.shape === 'square') {\n recSquares = data.records\n } else {\n recSquares = data.records.filter(d => d.shape && d.shape === 'square')\n }\n const squares = svg.selectAll('.dotSquare')\n .data(recSquares, d => d.gr)\n const squaresMerge = squares.enter()\n .append(\"rect\")\n //.classed('dotSquare dot', true)\n .attr(\"x\", d => transform(getCentroid(d.gr, proj).centroid)[0])\n .attr(\"y\", d => transform(getCentroid(d.gr, proj).centroid)[1])\n .attr(\"width\", 0)\n .attr(\"height\", 0)\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .style(\"fill\", d => d.colour ? d.colour : data.colour)\n .merge(squares)\n // legendKey can change so this needs to be in merge\n .attr('class', d => {\n let c = 'dotSquare dot'\n if (d.legendKey) {\n c = `${c} legend-key-${d.legendKey}`\n }\n return c\n })\n .transition()\n .ease(d3.easeCubic)\n .duration(500)\n .attr(\"width\", d => {\n const size = d.size ? d.size : data.size\n return 2 * radiusPixels * size\n })\n .attr(\"height\", d => {\n const size = d.size ? d.size : data.size\n return 2 * radiusPixels * size\n })\n .attr(\"transform\", d => {\n const size = d.size ? d.size : data.size\n if (checkGr(d.gr).projection === 'ir' && proj === 'gb') {\n const x = transform(getCentroid(d.gr, proj).centroid)[0]\n const y = transform(getCentroid(d.gr, proj).centroid)[1]\n return `translate(${-radiusPixels * size},${-radiusPixels * size}) rotate(5 ${x} ${y})`\n } else {\n return `translate(${-radiusPixels * size},${-radiusPixels * size})`\n }\n })\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .style(\"fill\", d => d.colour ? d.colour : data.colour)\n .attr(\"stroke\", d => d.stroke ? d.stroke : data.stroke ? data.stroke : null )\n .attr(\"data-caption\", d => getCaption(d))\n\n addPromise(squaresMerge)\n\n const squaresExit = squares.exit()\n .transition()\n .ease(d3.easeCubic)\n .duration(500)\n .attr(\"width\", 0)\n .attr(\"height\", 0)\n .attr(\"transform\", `translate(0,0)`)\n .remove()\n\n addPromise(squaresExit)\n\n // diamonds\n let recDiamonds\n if (data.shape && data.shape === 'diamond') {\n recDiamonds = data.records\n } else {\n recDiamonds = data.records.filter(d => d.shape && d.shape === 'diamond')\n }\n const diamonds = svg.selectAll('.dotDiamond')\n .data(recDiamonds, d => d.gr)\n\n const diamondsEnter = diamonds.enter()\n .append(\"path\")\n //.classed('dotDiamond dot', true)\n .attr(\"d\", d3.symbol().type(d3.symbolSquare).size(0))\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .style(\"fill\", d => d.colour ? d.colour : data.colour)\n .attr(\"transform\", d => {\n const x = transform(getCentroid(d.gr, proj).centroid)[0]\n const y = transform(getCentroid(d.gr, proj).centroid)[1]\n if (checkGr(d.gr).projection === 'ir' && proj === 'gb') {\n return `translate(${x},${y}) rotate(50)`\n } else {\n return `translate(${x},${y}) rotate(45)`\n }\n })\n .merge(diamonds)\n // legendKey can change so this needs to be in merge\n .attr('class', d => {\n let c = 'dotDiamond dot'\n if (d.legendKey) {\n c = `${c} legend-key-${d.legendKey}`\n }\n return c\n })\n .transition()\n .ease(d3.easeCubic)\n .duration(500)\n .attr(\"d\", d3.symbol().type(d3.symbolSquare).size(radiusPixels * radiusPixels * 2))\n .attr(\"transform\", d => {\n const x = transform(getCentroid(d.gr, proj).centroid)[0]\n const y = transform(getCentroid(d.gr, proj).centroid)[1]\n const size = d.size ? d.size : data.size\n if (checkGr(d.gr).projection === 'ir' && proj === 'gb') {\n return `translate(${x},${y}) rotate(50) scale(${size})`\n } else {\n return `translate(${x},${y}) rotate(45) scale(${size})`\n }\n })\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .style(\"fill\", d => d.colour ? d.colour : data.colour)\n .attr(\"stroke\", d => d.stroke ? d.stroke : data.stroke ? data.stroke : null )\n .attr(\"data-caption\", d => getCaption(d))\n\n addPromise(diamondsEnter)\n\n const diamondsExit = diamonds.exit()\n .transition()\n .ease(d3.easeCubic)\n .duration(500)\n .attr(\"d\", d3.symbol().type(d3.symbolSquare).size(0))\n .remove()\n\n addPromise(diamondsExit)\n\n // triangles\n let recTriangles\n if (data.shape && data.shape.startsWith('triangle')) {\n recTriangles = data.records\n } else {\n recTriangles = data.records.filter(d => d.shape && d.shape.startsWith('triangle'))\n }\n const triangle = svg.selectAll('.dotTriangle')\n .data(recTriangles, d => d.gr)\n const triangleEnter = triangle.enter()\n .append(\"path\")\n //.classed('dotTriangle dot', true)\n .attr(\"d\", d3.symbol().type(d3.symbolTriangle).size(0))\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .style(\"fill\", d => d.colour ? d.colour : data.colour)\n .attr(\"transform\", d => {\n const x = transform(getCentroid(d.gr, proj).centroid)[0]\n const y = transform(getCentroid(d.gr, proj).centroid)[1]\n let extraRotate, yOffset\n const shape = d.shape ? d.shape : data.shape\n if (shape === 'triangle-up') {\n extraRotate=0\n yOffset=radiusPixels/3\n } else {\n extraRotate=180\n yOffset=-radiusPixels/3\n }\n if (checkGr(d.gr).projection === 'ir' && proj === 'gb') {\n return `translate(${x},${y + yOffset}) rotate(${5 + extraRotate})`\n } else {\n return `translate(${x},${y + yOffset}) rotate(${extraRotate})`\n }\n })\n .merge(triangle)\n // legendKey can change so this needs to be in merge\n .attr('class', d => {\n let c = 'dotTriangle dot'\n if (d.legendKey) {\n c = `${c} legend-key-${d.legendKey}`\n }\n return c\n })\n .transition()\n .ease(d3.easeCubic)\n .duration(500)\n .attr(\"d\", d3.symbol().type(d3.symbolTriangle).size(radiusPixels * radiusPixels * 1.7))\n .attr(\"transform\", d => {\n const x = transform(getCentroid(d.gr, proj).centroid)[0]\n const y = transform(getCentroid(d.gr, proj).centroid)[1]\n let extraRotate, yOffset\n const shape = d.shape ? d.shape : data.shape\n if (shape === 'triangle-up') {\n extraRotate=0\n yOffset=radiusPixels/3\n } else {\n extraRotate=180\n yOffset=-radiusPixels/3\n }\n const size = d.size ? d.size : data.size\n if (checkGr(d.gr).projection === 'ir' && proj === 'gb') {\n return `translate(${x},${y + yOffset}) rotate(${5 + extraRotate}) scale(${size})`\n } else {\n return `translate(${x},${y + yOffset}) rotate(${extraRotate}) scale(${size})`\n }\n })\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .style(\"fill\", d => d.colour ? d.colour : data.colour)\n .attr(\"stroke\", d => d.stroke ? d.stroke : data.stroke ? data.stroke : null )\n .attr(\"data-caption\", d => getCaption(d))\n\n addPromise(triangleEnter)\n\n const triangleExit = triangle.exit()\n .transition()\n .ease(d3.easeCubic)\n .duration(500)\n .attr(\"d\", d3.symbol().type(d3.symbolTriangle).size(0))\n .remove()\n\n addPromise(triangleExit)\n\n // Dot caption display\n svg.selectAll('.dot')\n .on('mouseover', (a1,a2) => {\n // D3 v5 passes d as first argument but v7 passes\n // d as second argument - event as first.\n let d\n if(a1.type === 'mouseover') {\n d=a2\n } else {\n d=a1\n }\n if (captionId) {\n if (d.caption) {\n d3.select(`#${captionId}`).html(d.caption)\n } else {\n d3.select(`#${captionId}`).html('')\n }\n }\n })\n .on('mouseout', (a1,a2) => {\n // D3 v5 passes d as first argument but v7 passes\n // d as second argument - event as first.\n let d\n if(a1.type === 'mouseout') {\n d=a2\n } else {\n d=a1\n }\n if (captionId) {\n d3.select(`#${captionId}`).html(d.noCaption ? d.noCaption : '')\n }\n })\n .on('click', (a1,a2) => {\n // D3 v5 passes d as first argument but v7 passes\n // d as second argument - event as first.\n let d\n if(a1.type === 'mouseout') {\n d=a2\n } else {\n d=a1\n }\n if (onclick) {\n onclick(d.gr, d.id ? d.id : null, d.caption ? d.caption : null)\n }\n })\n\n // Use Promise.all on pTrans to trigger code after\n // all transitions complete.\n Promise.allSettled(pTrans).then(() => {\n resolve(data)\n })\n // return data\n // }).then (data => {\n // resolve(data)\n }).catch(() => {\n reject(\"Failed to read data\", taxonIdentifier)\n })\n } else {\n reject(\"Data accessor not a function\")\n }\n\n })\n}","/** @module svgLegend */\n\nimport * as d3 from 'd3'\n\n/**\n * @typedef module:svgLegend.legendOpts\n * @type {Object}\n * @property {boolean} display - indicates whether or not a legend is to be drawn.\n * @property {number} scale - a number between 0 and 1 which scales the size of the legend.\n * @property {number} x - an offset of the top-left corner of the legend from the left margin of the SVG.\n * @property {number} y - an offset of the top-left corner of the legend from the top margin of the SVG.\n * @property {number} width - can be used to specify a width (for leaflet legend).\n * @property {number} height - can be used to specify a height (for leaflet legend).\n * @property {legendDefintion} data - a legend defition.\n */\n\n/**\n * @typedef {Object} legendDefintion\n * @property {string} title - a title caption for the legend.\n * @property {string} colour - a colour for the legend symbols which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red. (Can be overriden by individual legend lines.)\n * @property {string} colour2 - second colour for legend symbols of bullseye shape which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red. (Can be overriden by individual legend lines.)\n * @property {string} stroke - a colour for the border of the legend symbols which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red. (Can be overriden by individual legend lines.)\n * If not specified, no border is drawn.\n * @property {string} shape - describes symbol shapes for the legend.\n * Valid values are: circle, bullseye, square, diamond, triangle-up, triangle-down. (Can be overriden by individual legend lines.)\n * @property {number} size - a number between 0 and 1.\n * This can be used to scale the size of the legend dots. (Can be overriden by individual legend lines.)\n * @property {number} opacity - a number between 0 and 1 indicating the opacity of the legend symbols for the whole legend. 0 is completely\n * transparent and 1 is completely opaque. (Can be overriden by individual legend lines.)\n * @property {number} padding - a number that indicates the padding, in pixels, that should be used between the elements\n * of a legend line (e.g. the symbol and the text).\n * @property {boolean[]} raligned - an array of boolean values to indicate whether text elements in a tabulated legend\n * lines should be right-aligned.\n * @property {legendLine[]} lines - an arry of objects representing lines in a legend.\n */\n\n/**\n * @typedef {Object} legendLine\n * @property {string} colour - a colour for the legend symbol which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red. Overrides any value set for the whole legend.\n * @property {string} colour2 - second colour for legend symbols of bullseye symbol which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red. Overrides any value set for the whole legend.\n * @property {string} stroke - a colour for the border of the legend symbol which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red. Overrides any value set for the whole legend.\n * If not specified, no border is drawn.\n * @property {string} shape - describes symbol shape for the legend line.\n * Valid values are: circle, bullseye, square, diamond, triangle-up, triangle-down. Overrides any value set for the whole legend.\n * @property {number} size - a number between 0 and 1.\n * This can be used to scale the size of the legend dots. Overrides any value set for the whole legend.\n * @property {number} opacity - a number between 0 and 1 indicating the opacity of the legend symbol. 0 is completely\n * transparent and 1 is completely opaque. Overrides any value set for the whole legend.\n * @property {boolean} underline - If set to true, indicates that the legend line is to be underlined.\n * @property {string|string[]} text - Specifies the text for the legend line either as a single text string or an\n * array of strings for a tabulated legend layout. For tabulated legend layout, one of the strings can be set\n * to the special value of 'symbol' to indicate the position where the legend symbol should be generated in the\n * tabualted layout. In a tabulated legend layout, the various array elements in each line are aligned with those\n * in the other lines to form columns. You can use the HTML tags '' and ' to italicise and bolden text\n * in the legend lines.\n * @property {string} key - a string key to match legend items to map dots. Only required if legend interactivity is required. If used\n * then each element in the data for the map must have a property called 'legend-key' which is used to match against this value.\n */\n\nexport function svgLegend(svg, legendOpts, legendFontSize, legendFont, legendInteractivity, highlightClass) {\n\n const legendData = legendOpts.data ? legendOpts.data : legendOpts.accessorData\n const legendX = legendOpts.x ? legendOpts.x : 0\n const legendY = legendOpts.y ? legendOpts.y : 0\n const legendScale = legendOpts.scale ? legendOpts.scale : 1\n const lineHeight = 20\n const swatchPixels = lineHeight / 3\n legendData.padding = legendData.padding ? legendData.padding : lineHeight / 3\n legendData.raligned = legendData.raligned ? legendData.raligned : []\n legendData.size = legendData.size ? legendData.size : 1\n legendData.opacity = legendData.opacity ? legendData.opacity : 1\n legendData.shape = legendData.shape ? legendData.shape : 'circle'\n\n const gLegend = svg.append('g').attr('id','legend')\n\n const parseText = (text) => {\n let legText = text\n legText = legText.replaceAll('', '' )\n legText = legText.replaceAll('', '' )\n legText = legText.replaceAll('', '' )\n legText = legText.replaceAll('', '' )\n\n return legText\n }\n\n let iUnderlinePad = 0\n let iOffset\n if (legendData.title) {\n gLegend.append('text')\n .classed('svg-map-legend-title', true)\n .attr('x', 0)\n .attr('y', lineHeight)\n .attr('font-weight', 'bold')\n .style('font-size', legendFontSize)\n .style('font-family', legendFont)\n .text(legendData.title)\n iOffset = 0\n } else {\n iOffset = 1\n }\n\n // If legend line text is not an array, turn into one\n // Also add textWidths array\n legendData.lines.forEach(l => {\n if (!Array.isArray(l.text)) {\n l.text = ['symbol', String(l.text)]\n } else {\n // Coerce all text elements to strings\n l.text = l.text.map(t => String(t))\n }\n l.textWidth=[]\n })\n\n // Set nCells to the max number of elements in line text arrays\n const nCells = legendData.lines.reduce((a, l) => l.text.length > a ? l.text.length : a, 0)\n const maxWidths = Array(nCells).fill(0)\n\n // Calculate the max width of each legend table column.\n // Also add the calculated width of each text item to the legend line\n // array for use in right justifying if required.\n for (let i = 0; i < nCells; i++) {\n legendData.lines.forEach(l => {\n if (l.text[i]) {\n let iLength\n if (l.text[i] === 'symbol') {\n iLength = swatchPixels * 2\n } else {\n // Generate a temporary SVG text object in order to get width\n const t = gLegend\n .append('text')\n .classed('svg-map-legend-text', true)\n .style('font-size', legendFontSize)\n .style('font-family', legendFont)\n .html(parseText(l.text[i]))\n iLength = t.node().getBBox().width\n t.remove()\n l.textWidth[i] = iLength\n }\n maxWidths[i] = maxWidths[i] > iLength ? maxWidths[i] : iLength\n }\n })\n }\n\n // Set offsets\n const offsets = Array(nCells)\n for (let i = 0; i < offsets.length; i++) {\n offsets[i] = 0\n for (let j = 1; j <= i; j++) {\n offsets[i] = offsets[i] + maxWidths[j-1] + legendData.padding\n }\n }\n \n //console.log('max text lengths', maxWidths)\n //console.log('offsets', offsets)\n\n legendData.lines.forEach((l, iLine) => {\n \n const y = iLine - iOffset\n let shape = l.shape ? l.shape : legendData.shape\n let size = l.size ? l.size : legendData.size\n let opacity = l.opacity ? l.opacity : legendData.opacity\n let colour = l.colour ? l.colour : legendData.colour\n let colour2 = l.colour2 ? l.colour2 : legendData.colour2\n let stroke = l.stroke ? l.stroke : legendData.stroke ? legendData.stroke : null\n let dot\n\n for (let i = 0; i < nCells; i++) {\n if (l.text[i]) {\n if (l.text[i] === 'symbol') {\n if (shape === 'circle') {\n dot = gLegend.append('circle')\n .attr(\"r\", swatchPixels * size)\n //.attr(\"cx\", swatchPixels * 1)\n .attr(\"cx\", offsets[i] + swatchPixels)\n .attr(\"cy\", lineHeight * (y + 2.5) - swatchPixels + iUnderlinePad)\n .attr('clip-path', 'circle()')\n } else if (shape === 'bullseye') {\n dot = gLegend.append('circle')\n .attr(\"r\", swatchPixels * size)\n //.attr(\"cx\", swatchPixels * 1)\n .attr(\"cx\", offsets[i] + swatchPixels)\n .attr(\"cy\", lineHeight * (y + 2.5) - swatchPixels + iUnderlinePad)\n gLegend.append('circle')\n .attr(\"r\", swatchPixels * size * 0.5)\n //.attr(\"cx\", swatchPixels * 1)\n .attr(\"cx\", offsets[i] + swatchPixels)\n .attr(\"cy\", lineHeight * (y + 2.5) - swatchPixels + iUnderlinePad)\n .style('fill', colour2)\n .style('fill-opacity', opacity)\n } else if (shape === 'square') {\n dot = gLegend.append('rect')\n .attr (\"width\", swatchPixels * 2 * size)\n .attr (\"height\", swatchPixels * 2 * size)\n //.attr(\"x\", swatchPixels * (1 - size))\n .attr(\"x\", offsets[i] + swatchPixels * (1 - size))\n .attr(\"y\", lineHeight * (y + 2.5) - 2 * swatchPixels + swatchPixels * (1 - size) + iUnderlinePad)\n } else if (shape === 'diamond') {\n dot = gLegend.append('path')\n .attr(\"d\", d3.symbol().type(d3.symbolSquare).size(swatchPixels * swatchPixels * 2 * size))\n //.attr(\"transform\", `translate(${swatchPixels * 1},${lineHeight * (y + 2.5) - swatchPixels}) rotate(45)`)\n .attr(\"transform\", `translate(${offsets[i] + swatchPixels},${lineHeight * (y + 2.5) - swatchPixels}) rotate(45)`)\n } else if (shape === 'triangle-up') {\n dot = gLegend.append('path')\n .attr(\"d\", d3.symbol().type(d3.symbolTriangle).size(swatchPixels * swatchPixels * 1.7 * size))\n //.attr(\"transform\", `translate(${swatchPixels * 1},${lineHeight * (y + 2.5) - swatchPixels})`)\n .attr(\"transform\", `translate(${offsets[i] + swatchPixels},${lineHeight * (y + 2.5) - swatchPixels})`)\n } else if (shape === 'triangle-down') {\n dot = gLegend.append('path')\n .attr(\"d\", d3.symbol().type(d3.symbolTriangle).size(swatchPixels * swatchPixels * 1.7 * size))\n //.attr(\"transform\", `translate(${swatchPixels * 1},${lineHeight * (y + 2.5) - swatchPixels}) rotate(180)`)\n .attr(\"transform\", `translate(${offsets[i] + swatchPixels},${lineHeight * (y + 2.5) - swatchPixels}) rotate(180)`)\n }\n dot.style('fill', colour).style('fill-opacity', opacity).style('stroke', stroke)\n dot.attr('data-fill', colour).attr('data-fill-opacity', opacity).attr('data-stroke', stroke)\n dot.attr('class', l.key ? `legend-swatch legend-swatch-${l.key}` : 'legend-swatch')\n dot.attr('data-key', l.key ? l.key : '')\n dot.attr('cursor', l.key ? 'pointer' : '')\n } else {\n //const y = iLine - iOffset\n //const alignOffset = legendData.raligned[i] ? maxWidths[i] - l.textWidth[i] : 0\n const alignOffset = legendData.raligned[i] ? maxWidths[i] : 0\n \n gLegend.append('text')\n .attr('class', l.key ? `svg-map-legend-text svg-map-legend-text-${l.key}` : 'svg-map-legend-text')\n .style('text-anchor', legendData.raligned[i] ? 'end' : 'start')\n .style('font-size', legendFontSize)\n .style('font-family', legendFont)\n .attr('x', offsets[i] + alignOffset)\n .attr('y', lineHeight * (y + 2.5) - lineHeight/20 + iUnderlinePad)\n .attr('data-key', l.key ? l.key : '')\n .attr('cursor', l.key ? 'pointer' : '')\n .html(parseText(l.text[i]))\n }\n }\n }\n if (l.underline) {\n iUnderlinePad = iUnderlinePad + 3\n gLegend.append('rect')\n .attr(\"x\", 0)\n .attr(\"y\", lineHeight * (y + 2.5) + iUnderlinePad)\n .attr(\"width\", offsets[nCells-1] + maxWidths[nCells-1])\n .attr(\"height\", 1)\n .attr(\"style\", \"fill:black\")\n }\n })\n gLegend.attr(\"transform\", `translate(${legendX},${legendY}) scale(${legendScale}, ${legendScale})`)\n\n // Sort out the legend interactivity\n gLegend.selectAll('.legend-swatch, .svg-map-legend-text')\n .on(\"mouseover\", function() {\n if (legendInteractivity === 'mousemove') {\n legendHighlight(d3.select(this).attr('data-key'))\n }\n })\n .on(\"mouseout\", function() {\n if (legendInteractivity === 'mousemove') {\n legendHighlight()\n }\n })\n .on(\"click\", function() {\n if (legendInteractivity === 'mouseclick') {\n legendHighlight(d3.select(this).attr('data-key'))\n d3.event.stopPropagation()\n }\n })\n svg.on(\"click\", function() {\n legendHighlight()\n })\n function legendHighlight(key) {\n if (key) {\n gLegend.selectAll('.legend-swatch').classed(highlightClass, false)\n gLegend.selectAll('.legend-swatch').classed(`${highlightClass}-low`, true)\n\n gLegend.selectAll(`.legend-swatch-${key}`).classed(`${highlightClass}-low`, false)\n gLegend.selectAll(`.legend-swatch-${key}`).classed(highlightClass, true)\n\n gLegend.selectAll('.svg-map-legend-text').classed(`${highlightClass}-text`, false)\n gLegend.selectAll('.svg-map-legend-text').classed(`${highlightClass}-text-low`, true)\n\n gLegend.selectAll(`.svg-map-legend-text-${key}`).classed(`${highlightClass}-text-low`, false)\n gLegend.selectAll(`.svg-map-legend-text-${key}`).classed(`${highlightClass}-text`, true)\n\n svg.selectAll('.dot').classed(highlightClass, false)\n svg.selectAll('.dot').classed(`${highlightClass}-low`, true)\n\n svg.selectAll(`.legend-key-${key}`).classed(`${highlightClass}-low`, false)\n svg.selectAll(`.legend-key-${key}`).classed(highlightClass, true)\n } else {\n gLegend.selectAll('.legend-swatch').classed(highlightClass, false)\n gLegend.selectAll('.legend-swatch').classed(`${highlightClass}-low`, false)\n\n gLegend.selectAll('.svg-map-legend-text').classed(`${highlightClass}-text`, false)\n gLegend.selectAll('.svg-map-legend-text').classed(`${highlightClass}-text-low`, false)\n\n svg.selectAll(`.dot`).classed(`${highlightClass}-low`, false)\n svg.selectAll(`.dot`).classed(highlightClass, false)\n }\n }\n}","import * as d3 from 'd3'\nimport { getGjson, getCentroid } from 'brc-atlas-bigr'\n\n// See https://observablehq.com/@mbostock/saving-svg \n\nlet infoHeight=0\n\nexport function saveMapImage(svg, trans, expand, asSvg, svgInfo, filename) {\n\n const pInfoAdded = addInfo(svg, trans, expand, svgInfo)\n \n return new Promise((resolve) => {\n\n pInfoAdded.then(() => {\n if (asSvg) {\n const blob1 = serialize(svg)\n if(filename) {\n download(blob1, filename)\n }\n removeInfo(svg, trans, expand)\n resolve(blob1)\n } else {\n rasterize(svg).then(blob2 => {\n if(filename) {\n download(blob2, filename)\n }\n removeInfo(svg, trans, expand)\n resolve(blob2)\n })\n }\n })\n })\n\n function download(data, filename) {\n const dataUrl = URL.createObjectURL(data)\n const file = asSvg ? `${filename}.svg` : `${filename}.png`\n downloadLink(dataUrl, file)\n }\n\n function serialize(svg) {\n const xmlns = \"http://www.w3.org/2000/xmlns/\"\n const xlinkns = \"http://www.w3.org/1999/xlink\"\n const svgns = \"http://www.w3.org/2000/svg\"\n \n const domSvg = svg.node()\n const cloneSvg = domSvg.cloneNode(true)\n const d3Clone = d3.select(cloneSvg)\n // Delete all hidden items (backrop images) from clone\n d3Clone.selectAll('.hidden').remove()\n \n cloneSvg.setAttributeNS(xmlns, \"xmlns\", svgns)\n cloneSvg.setAttributeNS(xmlns, \"xmlns:xlink\", xlinkns)\n const serializer = new window.XMLSerializer\n const string = serializer.serializeToString(cloneSvg)\n return new Blob([string], {type: \"image/svg+xml\"})\n }\n \n function rasterize(svg) {\n let resolve, reject\n const domSvg = svg.node()\n const promise = new Promise((y, n) => (resolve = y, reject = n))\n const image = new Image\n image.onerror = reject\n image.onload = () => {\n const rect = domSvg.getBoundingClientRect()\n // Create a canvas element\n let canvas = document.createElement('canvas')\n canvas.width = rect.width\n canvas.height = rect.height\n let context = canvas.getContext('2d')\n context.drawImage(image, 0, 0, rect.width, rect.height)\n context.canvas.toBlob(resolve)\n }\n image.src = URL.createObjectURL(serialize(svg))\n return promise\n }\n}\n\nexport function downloadCurrentData(pData, precision, asGeojson){\n\n pData.then(data => {\n\n const ftrs = data.records.map(function(d){\n\n if (asGeojson) {\n // GeoJson\n if (precision!==0) {\n\n const attrs = {...d}\n delete attrs.gr\n\n const shape = d.shape ? d.shape : data.shape\n const size = d.size ? d.size : data.size\n return {\n type: 'Feature',\n geometry: getGjson(d.gr, 'wg', shape, size),\n properties: attrs\n }\n } else {\n // ToDo point data\n }\n } else {\n // CSV\n if (precision!==0) {\n\n let attrs = ''\n Object.keys(d).forEach(k => {\n if (k !== 'gr') {\n attrs = `${attrs},\"${d[k]}\"`\n }\n })\n const c = getCentroid(d.gr, 'wg')\n return `${d.gr},${c.proj},${c.centroid[1]},${c.centroid[0]}${attrs}`\n } else {\n // ToDo point data\n }\n }\n })\n\n if (asGeojson) {\n // GeoJson\n const outData = {\n \"type\": \"FeatureCollection\",\n \"name\": \"BRC Atlas download\",\n \"crs\": { \"type\": \"name\", \"properties\": { \"name\": \"urn:ogc:def:crs:OGC:1.3:CRS84\" } },\n \"features\": ftrs\n }\n const dataStr = \"data:text/json;charset=utf-8,\" + encodeURIComponent(JSON.stringify(outData))\n downloadLink(dataStr, \"data.geojson\")\n } else {\n // CSV\n let attrs = ''\n Object.keys(data.records[0]).forEach(k => {\n if (k !== 'gr') {\n attrs = `${attrs},\"${cleanColumn(k)}\"`\n }\n })\n\n const dataStr = `data:text/csv;charset=utf-8,gr,gr-projection,lat,lon${attrs}\\r\\n${ftrs.join(\"\\r\\n\")}`\n // Hash characters are not allowed in body of dataURL and must be replaced with special character.\n downloadLink(dataStr.replace(/#/g, '%23'), \"data.csv\")\n }\n\n function cleanColumn(name) {\n return name.replace(/[^\\x00-\\x7F]/g, \"_\")\n }\n })\n}\n\nfunction downloadLink(dataUrl, file) {\n\n // Create a link element\n const link = document.createElement(\"a\")\n // Set link's href to point to the data URL\n link.href = dataUrl\n link.download = file\n\n // Append link to the body\n document.body.appendChild(link)\n\n // Dispatch click event on the link\n // This is necessary as link.click() does not work on the latest firefox\n link.dispatchEvent(\n new MouseEvent('click', { \n bubbles: true, \n cancelable: true, \n view: window \n })\n )\n // Remove link from body\n document.body.removeChild(link)\n}\n\nfunction addInfo(svg, trans, expand, svgInfo) {\n\n if (!svgInfo) return Promise.resolve()\n \n let infoText\n if (svgInfo.text) {\n infoText = svgInfo.text.split(' ')\n } else if (svgInfo.textFormatted && svgInfo.textFormatted.length) {\n infoText = []\n svgInfo.textFormatted.forEach(it => {\n const format = it.substr(0,2)\n infoText = [...infoText, ...it.substr(2).split(' ').map(its => `${format}${its}`)].filter(it => it.length)\n })\n } else {\n infoText = []\n }\n\n const margin = svgInfo.margin ? svgInfo.margin : 0\n const fontSize = svgInfo.fontSize ? svgInfo.fontSize : 12\n\n // Current dimensions of map SVG\n //const height = Number(svg.attr(\"height\"))\n //const width = Number(svg.attr(\"width\"))\n\n // Create svg g and text objects and positions\n\n\n const gInfo = svg.append('g')\n gInfo.attr('id', 'svgInfo')\n gInfo.attr('transform', `translate(0 ${trans.height})`)\n\n let mask = gInfo.append('rect').attr('x', 0).attr('y', 0).attr('width', trans.width)\n .style('fill', 'white')\n \n let tInfo = gInfo.append('text').attr('x', margin).attr('y', margin)\n let yLastLine = margin\n \n infoText.forEach((w,i) => {\n const ts = tInfo.append('tspan').style('font-size', fontSize).style('font-family', 'Arial').style('alignment-baseline', 'hanging')\n let word\n if (w.startsWith('')) {\n ts.style('font-style', 'italic')\n word = w.replace('', '').replace('', '')\n } else if (w.startsWith('i#')) {\n ts.style('font-style', 'italic')\n word = w.replace('i#', '')\n } else if (w.startsWith('b#')) {\n ts.style('font-weight', 'bold')\n word = w.replace('b#', '')\n } else if (w.startsWith('I#')) {\n ts.style('font-weight', 'bold')\n ts.style('font-style', 'italic')\n word = w.replace('I#', '')\n } else if (w.startsWith('n#')) {\n word = w.replace('n#', '')\n } else {\n word = w\n }\n if (i) {\n ts.text(` ${word}`)\n } else {\n ts.text(word)\n }\n\n if (tInfo.node().getBBox().width > trans.width - 2 * margin) {\n // If the latest word has caused the text element\n // to exceed the width of the SVG, remove it and\n // create a new line for it.\n ts.remove()\n const lineHeight = tInfo.node().getBBox().height\n tInfo = gInfo.append('text')\n yLastLine = yLastLine + lineHeight\n tInfo.attr('x', margin)\n tInfo.attr('y', yLastLine)\n const tsn = tInfo.append('tspan').style('font-size', fontSize).style('font-family', 'Arial').style('alignment-baseline', 'hanging')\n tsn.html(ts.html())\n }\n })\n\n infoHeight = yLastLine + tInfo.node().getBBox().height + margin\n const h = trans.height+infoHeight\n \n //svg.attr('height', h)\n if (expand) {\n svg.attr(\"viewBox\", \"0 0 \" + trans.width + \" \" + h)\n } else {\n svg.attr(\"height\", h)\n }\n\n if (svgInfo.img) {\n // Image\n return new Promise((resolve) => {\n const img = new Image()\n img.onload = function() {\n\n let scale = 1\n if (this.width > trans.width - 2 * margin) {\n scale = (trans.width - 2 * margin) / this.width\n }\n const imgWidth = scale * this.width\n const imgHeight = scale * this.height\n\n const iInfo = gInfo.append('image')\n iInfo.attr('x', margin)\n iInfo.attr('y', infoHeight)\n iInfo.attr('width', imgWidth)\n iInfo.attr('height', imgHeight)\n // Use dataURL rather than file path URL so that image can be \n // serialised when using the saveMap method\n iInfo.attr('href', getDataUrl(this))\n\n infoHeight = infoHeight + margin + imgHeight\n //svg.attr('height', height + infoHeight)\n if (expand) {\n svg.attr(\"viewBox\", \"0 0 \" + trans.width + \" \" + (trans.height + infoHeight))\n } else {\n svg.attr(\"height\", trans.height + infoHeight)\n }\n\n mask.style(\"height\", infoHeight)\n\n resolve()\n }\n img.src = svgInfo.img\n })\n } else {\n // No image - return resolved promise\n return Promise.resolve()\n }\n\n function getDataUrl(img) {\n // Create canvas\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n // Set width and height\n canvas.width = img.width\n canvas.height = img.height\n // Draw the image - use png format to support background transparency\n ctx.drawImage(img, 0, 0)\n return canvas.toDataURL('image/png')\n }\n}\n\nfunction removeInfo(svg, trans, expand) {\n //const height = Number(svg.attr(\"height\"))\n svg.select('#svgInfo').remove()\n //svg.attr('height', height-infoHeight)\n\n if (expand) {\n svg.attr(\"viewBox\", \"0 0 \" + trans.width + \" \" + trans.height)\n } else {\n svg.attr(\"height\", trans.height)\n }\n}\n","/** @module svgMap */\n\nimport * as d3 from 'd3'\nimport { createTrans, namedTransOpts, getTweenTransOpts } from './svgCoords.js'\nimport { constants } from './constants.js'\nimport { optsDialog, showOptsDialog } from './svgOptsDialog.js'\nimport { dataAccessors } from './dataAccess.js'\nimport { showImage, setImagePriorities, transformImages } from './svgImages.js'\nimport { drawDots, removeDots } from './svgDots.js'\nimport { svgLegend } from './svgLegend.js'\nimport { saveMapImage, downloadCurrentData } from './download.js'\n\n/** \n * @param {Object} opts - Initialisation options.\n * @param {string} opts.selector - The CSS selector of the element which will be the parent of the SVG.\n * @param {string} opts.mapid - The id for the static map to be created.\n * @param {string} opts.proj - The projection of the map, should be 'gb', 'ir' or 'ci'. It should \n * reflect the projection of boundary and grid data displayed on the map. It is used to generate the 'dots'\n * in the correct location.\n * @param {string} opts.captionId - The id of a DOM element into which feature-specific HTML will be displayed\n * as the mouse moves over a dot on the map. The HTML markup must be stored in an attribute called 'caption'\n * in the input data.boundaryFill\n * @param {function} opts.onclick - A function that will be called if user clicks on a map\n * element. The function will be passed these attributes, in this order, if they exist on the\n * element: gr, id, caption. (Default - null.)\n * @param {number} opts.height - The desired height of the SVG.\n * @param {boolean} opts.expand - Indicates whether or not the map will expand to fill parent element.\n * @param {legendOpts} opts.legendOpts - Sets options for a map legend.\n * @param {module:svgCoords~transOptsSel} opts.transOptsSel - Sets a collection of map transformation options.\n * @param {string} opts.transOptsKey - Sets the key of the selected map transformation options. Must be\n * present in as a key in the opts.transOptsSel object.\n * @param {boolean} opts.transOptsControl - Indicates whether or not a control should be shown in the\n * bottom-right of the map that can be used display a dialog to change the transformation options.\n * @param {Object} opts.mapTypesSel - Sets an object whose properties are data access functions. The property\n * names are the 'keys' which should be human readable descriptiosn of the map types.\n * @param {string} opts.mapTypesKey - Sets the key of the selected data accessor function (map type).\n * @param {boolean} opts.mapTypesControl - Indicates whether or not a control should be shown in the\n * bottom-right of the map that can be used display a dialog to change the data accessor (map type) options.\n * @param {string} opts.boundaryGjson - The URL of a boundary geoJson file to display.\n * @param {string} opts.boundaryColour - Specifies the line colour of the boundary geoJson.\n * @param {string} opts.boundaryFill - Specifies the fill colour of the boundary geoJson.\n * @param {string} opts.boundaryShadowColour - Specifies the colour of a 'glowing' border.\n * @param {string} opts.boundaryShadowWidth - Species the width of the glowing border in pixels.\n * @param {string | number} opts.boundaryLineWidth - Specifies the width of the line to use for boundary geoJson lines. Can use any valid units for SVG stroke-width. (Default - 1.)\n * @param {string} opts.seaFill - Specifies the fill colour of the area outside the boundary geoJson.\n * @param {string} opts.insetColour - Specifies the line colour of map inset boxes.\n * @param {string} opts.gridGjson - The URL of a grid geoJson file to display.\n * @param {string} opts.gridLineColour - Specifies the line colour of grid line geoJson.\n * @param {string} opts.gridLineStyle - Specifies the line style of the grid line geoJson. Can be solid, dashed or none. (Default solid.)\n * @param {string | number} opts.gridLineWidth - Specifies the width of the line to use for grid lines geoJson. Can use any valid units for SVG stroke-width. (Default - 1.)\n * @param {string} opts.vcGjson - The URL of a vice county geoJson file to display.\n * @param {string} opts.vcColour - Specifies the line colour of the vice county geoJson.\n * @param {string} opts.vcLineStyle - Specifies the line style of the vice county line geoJson. Can none or something else (which gives solid line). (Default none.)\n * @param {string | number} opts.vcLineWidth - Specifies the width of the line to use for vice counties geoJson. Can use any valid units for SVG stroke-width. (Default - 1.)\n * @param {string} opts.countryGjson - The URL of a country geoJson file to display.\n * @param {string} opts.countryColour - Specifies the line colour of the country geoJson.\n * @param {string} opts.countryLineStyle - Specifies the line style of the country geoJson. Can none or something else (which gives solid line). (Default none.)\n * @param {string | number} opts.countryLineWidth - Specifies the width of the line to use for country lines geoJson. Can use any valid units for SVG stroke-width. (Default - 1.)\n * @param {string} opts.legendFont - Specifies the font to use for the legend. (Default - 'sans-serif'.)\n * @param {string} opts.legendFontSize - Specifies the font size to use for the legend. (Default - 14px.)\n * @param {string} opts.legendInteractivity - Indicates the behaviour of legend interactivity, can be 'mousemove', 'mouseclick' or 'none'. (Default - 'none'.)\n * @param {string} opts.highlightClass - For legend interactivity, specify a unique name to use for the highlight class. (Default - ''.)\n * @param {string} opts.highlightStyle - For legend interactivity, specify a string of css property and value pairs for highlight style. Separate pairs with semi-colon and property from value with colon. (Default - ''.)\n * @param {string} opts.lowlightStyle - For legend interactivity, specify a string of css property and value pairs for lowlight style. Separate pairs with semi-colon and property from value with colon. (Default - ''.)\n * @param {function} opts.callbackOptions - Specifies a callback function to be executed if user options dialog used.\n * @returns {module:svgMap~api} api - Returns an API for the map.\n */\nexport function svgMap({\n // Default options in here\n selector = 'body',\n mapid = 'svgMap',\n proj = 'gb',\n captionId = '',\n onclick = null,\n height = 500,\n expand = false,\n legendOpts = {display: false},\n legendFontSize = '14px',\n legendFont = 'sans-serif',\n transOptsKey = 'BI1',\n transOptsSel = namedTransOpts,\n transOptsControl = true,\n mapTypesKey = 'Standard hectad',\n mapTypesSel = dataAccessors,\n mapTypesControl = false,\n boundaryGjson = `${constants.thisCdn}/assets/GB-I-CI-27700-reduced.geojson`,\n gridGjson = `${constants.thisCdn}/assets/GB-I-grid-27700-reduced.geojson`,\n vcGjson = `${constants.thisCdn}/assets/GB-I-vcs-27700-reduced.geojson`,\n countryGjson = `${constants.thisCdn}/assets/GB-I-countries-27700-reduced.geojson`,\n gridLineColour = '#7C7CD3',\n gridLineStyle = 'solid',\n gridLineWidth = 1,\n vcLineStyle = 'none',\n vcColour = '#7C7CD3',\n vcLineWidth = 1,\n countryLineStyle = 'none',\n countryColour = '#7C7CD3',\n countryLineWidth = 1,\n boundaryColour = '#7C7CD3',\n boundaryFill = 'white',\n boundaryLineWidth = 1,\n boundaryShadowColour = '#E6EFFF',\n boundaryShadowWidth = 0,\n seaFill = '#E6EFFF',\n insetColour = '#7C7CD3',\n insetLineWidth = 1,\n callbackOptions=null,\n legendInteractivity='none',\n highlightClass='',\n highlightStyle='',\n lowlightStyle='',\n} = {}) {\n\n // Make a new style sheet from highlight/lowlight styles\n // Make separate ones for text with fill style removed\n // so that colour of legend text is not affected. \n // Add !important to all styles in order to override\n // values set on elements.\n if (highlightClass) {\n const sheet = document.createElement('style')\n document.body.appendChild(sheet)\n sheet.innerHTML = `\n .${highlightClass} {${createStyle(highlightStyle)}}\n .${highlightClass}-low {${createStyle(lowlightStyle)}}\n .${highlightClass}-text {${createStyle(highlightStyle, true)}}\n .${highlightClass}-text-low {${createStyle(lowlightStyle, true)}}\n `\n }\n function createStyle(str, forText) {\n const styles = str.split(';')\n const styleStr = styles.reduce((a,s) => {\n const els = s.split(':')\n if (forText && els[0].trim() === 'fill') {\n return a\n } else {\n return `${a} ${els[0]}: ${els[1]} !important;`\n }\n }, '')\n return styleStr\n }\n\n let trans, basemaps, boundary, boundaryf, dataBoundary, grid, dataGrid, vc, dataVc, country, dataCountry, taxonIdentifier, title\n\n // Create a parent div for the SVG within the parent element passed\n // as an argument. Allows us to style correctly for positioning etc.\n const mainDiv = d3.select(`${selector}`)\n .append(\"div\")\n .attr('id', mapid)\n .style(\"position\", \"relative\")\n .style(\"display\", \"inline\")\n\n // Map loading spinner\n let mapLoaderShowExplicit = false\n const mapLoader = mainDiv.append(\"div\")\n .classed('map-loader', true)\n const mapLoaderInner = mapLoader.append(\"div\")\n .classed('map-loader-inner', true)\n mapLoaderInner.append(\"div\")\n .classed('map-loader-spinner', true)\n mapLoaderInner.append(\"div\").text(\"Loading map data...\")\n .classed('map-loader-text', true)\n\n // Create the SVG.\n const svg = mainDiv.append(\"svg\")\n .style(\"background-color\", seaFill)\n //svg.append('defs')\n const defs = svg.append('defs')\n const shadow = defs.append('filter').attr('id', 'shadow')\n shadow.append('feDropShadow').attr('dx', 0).attr('dy', 0).attr('stdDeviation', boundaryShadowWidth).attr('flood-color', boundaryShadowColour)\n\n // Create the SVG graphic objects that store the major map elements.\n // The order these is created is important since it affects the order\n // in which they are rendered (i.e. what is drawn over what).\n boundaryf = svg.append(\"g\").attr(\"id\", \"boundaryf\")\n basemaps = svg.append(\"g\").attr(\"id\", \"backimage\")\n boundary = svg.append(\"g\").attr(\"id\", \"boundary\")\n vc = svg.append(\"g\").attr(\"id\", \"vc\")\n .style(\"display\", vcLineStyle === \"none\" ? \"none\" : \"\")\n country = svg.append(\"g\").attr(\"id\", \"country\")\n .style(\"display\", countryLineStyle === \"none\" ? \"none\" : \"\")\n grid = svg.append(\"g\").attr(\"id\", \"grid\")\n .style(\"stroke-dasharray\", gridLineStyle === \"dashed\" ? \"3,2\" : \"\")\n .style(\"display\", gridLineStyle === \"none\" ? \"none\" : \"\")\n title = svg.append(\"g\").attr(\"id\", \"title\")\n\n // Options dialog. \n if ((transOptsControl && Object.keys(transOptsSel).length > 1) || \n (mapTypesControl && Object.keys(mapTypesSel).length > 1)) {\n // Add gear icon to invoke options dialog\n mainDiv.append(\"img\")\n //.attr(\"src\", \"../images/gear.png\")\n .attr(\"src\", \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD8AAAA/CAYAAABXXxDfAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAPlSURBVGhD7ZprT+pAEIYLKBrjDULiH+SjGo0kahQMASLGmBiF+Bf9YowEvOseXp1i4fQys93WYnkS425Ttvvuzu7sTJtRSllpJUv/U0mqxcdm9sfHx2p+fp5q7ry9vVnNZjND1ciJbeaDhAPOPSaZrfm0MhOvQ6VSYe+UNzc3kdwr6YMbYvHX19eqXq+rlZUVC//psi8PDw9UCoZ7r7QPbohc3dnZmXp+fqbaD4uLi9b+/r6ni6rVaiqXy1HNn8/PTwjybOv09FS9vr5S7Yd8Pm8dHh6K3CR75of+11U4wHX4caqO0e122cJBNuvdpWq16ioc4DoGhqosWDN/fn6uHh8fqebPycnJ1+hLZtsLpxVwzXttbc3a2dlhWQBLfJh19RvYExBEoNlPm3DA7bO2q/sLBIrnmlCSMGb2YJoGQNJXttnPzc1RKblIvQtb/NHRUQbxdlKBnx+eNUQWKtrwTCYaMJBeBxYdWq2WuG/iTE6n01F3d3dU48PJ0nCyPW4Ui0Vra2srevE6fl+6YcbxDCAyeykwa51O4Tdx7C8i8cNNjz0j6LzOOrTBEpEMgFdg5YdIPMJGLiY2R0kbOnvF2Jpvt9vq5eXFQgQHobq+vVAoWNvb26HFg4uLC9Xv96kmA5bz8fHxpWV9fd3a3d0d69PYzEM4WFpaCnWoMSUc7O3tabcFa0CiBTmCXq9HV38YiUeWhoqheH9/p5I5TLU5qXEk/unpiUrh2NjYoJI5Go2GEUsaDAZU+mYk3jb5sGxubhozedNg/TsR7fbTDtJiTkbi/RKHf5WpEI8MMBVDsbCwQKVvRoqXl5epFA6kl6lojNvbWyqFA27PyUi830sHCVEkPUy1WSqVqPTNmK3jJIRdP2ycjVMZFX8daME5AVmecrk8NsGikFYSaupEc25E+UzRLhd1lDWJpA2dEFgkXhplhRkAaVZHJ4oUiZeCzutkZfAbnRBVijiNdXV1pe7v76nGB2YZNDvS2bZJdA5vEuy+8CqZTCZU3sCJzgYrEq87M3GAAZVGf+w1j1g4qcIBrAeZKKqyYIv3+iojSUjDcpZ4E+s8LiR9DRQ/TcJtuH2O1M8nnUDxps7occLtM2vmkcrmggfjz0TGFW3Y7dGlQCZjdj/Yfn7oQ9VkDsyJ1wlO50To9TlZ0DkDh6ZarcYeKPaar1arw7bd20Ws7HV0xQuMyaypH7jX6zs6PMPrlRn8vEQ4EB9vLy8vlfP7WI5J2q/BOCDPdnBwENimc0dfXV3971UUB/Fuj1mxBXPXIjrHhXuvsw86woF45nXh+l7ugJpg5ufTykx8Woltw0siM7NPJ5b1D5gX4NZABY0OAAAAAElFTkSuQmCC\")\n .style(\"width\", \"16px\")\n .style(\"position\", \"absolute\")\n .style(\"right\", \"5px\")\n .style(\"bottom\", \"7px\")\n .on(\"click\", function(){\n showOptsDialog(mapid, mapTypesKey, transOptsSel, transOptsKey)\n })\n // Create options dialog\n optsDialog(mapid, transOptsSel, transOptsKey, transOptsControl, mapTypesSel, mapTypesKey, mapTypesControl, userChangedOptions)\n }\n\n // Initialise the display\n trans = createTrans(transOptsSel[transOptsKey], height)\n setSvgSize()\n drawInsetBoxes()\n\n // Load boundary data\n let pBoundary, pGrid, pVc, pCountry\n if (boundaryGjson){\n pBoundary = d3.json(boundaryGjson).then(data => {\n dataBoundary = data\n })\n } else {\n pBoundary = Promise.resolve()\n }\n\n // Load grid data\n if (gridGjson){\n pGrid = d3.json(gridGjson).then(data => {\n dataGrid = data\n })\n } else {\n pGrid = Promise.resolve()\n }\n\n // Load country data\n if (countryGjson) {\n pCountry = d3.json(countryGjson).then(data => {\n dataCountry = data\n })\n } else {\n pCountry = Promise.resolve()\n }\n\n // Load VC data\n if (vcGjson) {\n pVc = d3.json(vcGjson).then(data => {\n dataVc = data\n })\n } else {\n pVc = Promise.resolve()\n }\n\n // Once loaded, draw boundary and grid\n Promise.allSettled([pBoundary, pGrid, pVc, pCountry]).then(() => {\n drawBoundaryAndGrid()\n if (!mapLoaderShowExplicit) {\n mapLoader.classed('map-loader-hidden', true)\n }\n })\n\n // End of initialisation\n\n function userChangedOptions(opts) {\n if (opts.transOptsKey && transOptsKey !== opts.transOptsKey){\n transOptsKey = opts.transOptsKey\n trans = createTrans(transOptsSel[transOptsKey], height)\n drawBoundaryAndGrid()\n setSvgSize()\n drawInsetBoxes()\n refreshMapDots()\n transformImages(basemaps, trans, seaFill)\n }\n if (opts.mapTypesKey && mapTypesKey !== opts.mapTypesKey){\n mapTypesKey = opts.mapTypesKey\n drawMapDots()\n }\n if (callbackOptions) {\n callbackOptions()\n }\n }\n\n function setSvgSize(){\n if (svg) {\n // Set width/height or viewbox depending on required behaviour\n if (expand) {\n svg.attr(\"viewBox\", \"0 0 \" + trans.width + \" \" + trans.height)\n } else {\n svg.attr(\"width\", trans.width)\n svg.attr(\"height\", trans.height)\n }\n }\n }\n\n function drawBoundaryAndGrid() {\n boundaryf.selectAll(\"path\").remove()\n boundary.selectAll(\"path\").remove()\n if (dataBoundary) {\n boundaryf.append(\"path\")\n .datum(dataBoundary)\n .attr(\"d\", trans.d3Path)\n .style(\"stroke-opacity\", 0)\n .style(\"fill\", boundaryFill)\n .style(\"filter\", \"url(#shadow)\")\n boundary.append(\"path\")\n .datum(dataBoundary)\n .classed('svg-map-boundary', true)\n .attr(\"d\", trans.d3Path)\n .style(\"fill-opacity\", 0)\n .style(\"stroke\", boundaryColour)\n .style('stroke-width', boundaryLineWidth)\n }\n grid.selectAll(\"path\").remove()\n if (dataGrid) {\n grid.append(\"path\")\n .datum(dataGrid)\n .classed('svg-map-grid', true)\n .attr(\"d\", trans.d3Path)\n .style(\"fill-opacity\", 0)\n .style(\"stroke\", gridLineColour)\n .style('stroke-width', gridLineWidth)\n }\n vc.selectAll(\"path\").remove()\n if (dataVc) {\n vc.append(\"path\")\n .datum(dataVc)\n .classed('svg-map-vcs', true)\n .attr(\"d\", trans.d3Path)\n .style(\"fill-opacity\", 0)\n .style(\"stroke\", vcColour)\n .style('stroke-width', vcLineWidth)\n }\n country.selectAll(\"path\").remove()\n if (dataCountry) {\n country.append(\"path\")\n .datum(dataCountry)\n .classed('svg-map-countries', true)\n .attr(\"d\", trans.d3Path)\n .style(\"fill-opacity\", 0)\n .style(\"stroke\", countryColour)\n .style('stroke-width', countryLineWidth)\n }\n }\n\n function drawInsetBoxes() {\n svg.selectAll('.svg-map-inset').remove()\n trans.insetDims.forEach(function(i){\n const margin = 10 \n svg.append('rect')\n .classed('svg-map-inset', true)\n .attr('x', i.x - margin)\n .attr('y', i.y - margin)\n .attr('width', i.width + 2 * margin)\n .attr('height', i.height + 2 * margin)\n .style('fill', 'none')\n .style('stroke', insetColour)\n .style('stroke-width', insetLineWidth)\n })\n }\n\n\n function drawMapDots() {\n // Returns a promise so that caller knows when data is loaded and transitions complete\n // (drawDots returns a promise which resolves when transitions complete)\n svg.select('#legend').remove() // Remove here to avoid legend resizing if inset options changed.\n return drawDots(svg, captionId, onclick, trans.point, mapTypesSel[mapTypesKey], taxonIdentifier, proj)\n .then (data => {\n if (data) {\n svg.select('#legend').remove() // Also must remove here to avoid some bad effects. \n legendOpts.accessorData = data.legend\n if (legendOpts.display && (legendOpts.data || legendOpts.accessorData)) {\n svgLegend(svg, legendOpts, legendFontSize, legendFont, legendInteractivity, highlightClass)\n } \n }\n }) \n }\n\n function refreshMapDots() {\n removeDots(svg)\n drawMapDots().catch(e => {\n //if (e !== \"Data accessor not a function\") {\n console.warn (e)\n //}\n })\n }\n\n/** @function setTransform\n * @param {string} newTransOptsKey - specifies the key of the transformation object in the parent object.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The method sets a map transformation by selecting the one with the passed in key. It also\n * redisplays the map \n */\n function setTransform (newTransOptsKey) {\n transOptsKey = newTransOptsKey\n trans = createTrans(transOptsSel[transOptsKey], height)\n drawBoundaryAndGrid()\n setSvgSize()\n drawInsetBoxes()\n refreshMapDots()\n transformImages(basemaps, trans, seaFill)\n }\n\n/** @function setHeight\n * @param {string} newHeight - specifies the height of the SVG object.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The method resets the height of the main map SVG. \n */\n function setHeight (newHeight) {\n height = newHeight\n // Removed the stuff below because the transformations\n // interferred with transformations triggered by other\n // methods when called straight afterwards. It is envisaged\n // that other methods would normally be called straight\n // after this one.\n\n // trans = createTrans(transOptsSel[transOptsKey], height)\n // drawBoundaryAndGrid()\n // setSvgSize()\n // drawInsetBoxes()\n // refreshMapDots()\n // transformImages(basemaps, trans, seaFill)\n }\n\n/** @function setBoundary\n * @param {string} newGeojson - specifies the path of a geojson object.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The method replaces any existing map boundary geojson with the geojson in the file passed. It also\n * redisplays the map.\n */\n function setBoundary(newGeojson) {\n if (newGeojson) {\n pBoundary = d3.json(newGeojson).then(data => {\n dataBoundary = data\n drawBoundaryAndGrid()\n })\n } else {\n dataBoundary = null\n drawBoundaryAndGrid()\n }\n }\n\n\n/** @function setGrid\n * @param {string} newGeojson - specifies the path of a geojson object.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The method replaces any existing grid geojson with the geojson in the file passed. It also\n * redisplays the map.\n */\n function setGrid(newGeojson) {\n if (newGeojson) {\n pBoundary = d3.json(newGeojson).then(data => {\n dataGrid = data\n drawBoundaryAndGrid()\n })\n } else {\n dataGrid = null\n drawBoundaryAndGrid()\n }\n }\n\n/** @function setProj\n * @param {string} newProj - specifies a new projection for the map.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The method replaces any existing map projection so that, for example, a map can be switched between\n * British and Irish grid projections.\n */\n function setProj(newProj) {\n proj = newProj\n }\n\n/** @function animateTransChange\n * @param {string} newTransOptsKey - specifies the key of the transformation object in the parent object.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The method sets a map transformation by selecting the one with the passed in key. It also\n * redisplays the map but animates the transition between the new transformation object and the\n * previous.\n */\n function animateTransChange(newTransOptsKey) {\n const lastTransOptsKey = transOptsKey\n svg.selectAll('.svg-map-inset').remove() // remove inset boxes\n removeDots(svg) // remove dots\n const incr = 10\n for (let i=1; i<=incr + 1; i++){\n const tto = getTweenTransOpts(lastTransOptsKey, newTransOptsKey, height, i/incr)\n setTimeout(() => {\n trans = createTrans(tto, height)\n drawBoundaryAndGrid()\n setSvgSize()\n transformImages(basemaps, trans, seaFill)\n if (i > incr) {\n setTransform(newTransOptsKey)\n }\n }, 1000 * i / incr)\n }\n }\n\n/** @function setBoundaryColour\n * @param {string} c - a string specifying the colour which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Sets the boundary colour to the specified colour.\n */\n function setBoundaryColour(c){\n boundary.style(\"stroke\", c)\n boundary.selectAll('path').style(\"stroke\", c)\n }\n\n/** @function setGridColour\n * @param {string} c - a string specifying the colour which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Sets the grid colour to the specified colour.\n */\n function setGridColour(c){\n grid.style(\"stroke\", c)\n grid.selectAll('path').style(\"stroke\", c)\n }\n\n/** @function setGridLineStyle\n * @param {string} c - a string specifying the style which can be set to either solid, dashed or none. \n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Sets the grid style to the specified value.\n */\n function setGridLineStyle(c){\n grid.style(\"stroke-dasharray\", c === \"dashed\" ? \"3,2\" : \"1,0\")\n grid.style(\"display\", c === \"none\" ? \"none\" : \"\")\n }\n\n/** @function setVcLineStyle\n * @param {string} c - a string specifying the style which can be set to either none or something else (which will create solid). \n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Sets the line style of the Vice County lines to the specified value.\n */\n function setVcLineStyle(c){\n vc.style(\"display\", c === \"none\" ? \"none\" : \"\")\n }\n\n/** @function setVcColour\n * @param {string} c - a string specifying the colour which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Sets the colour ov the vice count lines to the specified colour.\n */\n function setVcColour(c){\n vc.style(\"stroke\", c)\n vc.selectAll('path').style(\"stroke\", c)\n }\n\n/** @function setCountryLineStyle\n * @param {string} c - a string specifying the style which can be set to either none or something else (which will create solid). \n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Sets the line style of the countries to the specified value.\n */\n function setCountryLineStyle(c){\n country.style(\"display\", c === \"none\" ? \"none\" : \"\")\n }\n\n/** @function setCountryColour\n * @param {string} c - a string specifying the colour which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Sets the line colour of the countries to the specified colour.\n */\n function setCountryColour(c){\n country.style(\"stroke\", c)\n country.selectAll('path').style(\"stroke\", c)\n }\n \n/** @function setIdentfier\n * @param {string} identifier - a string which identifies some data to \n * a data accessor function.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The data accessor function, specified elsewhere, will use this identifier to access\n * the correct data.\n */\n function setIdentfier(identifier) {\n taxonIdentifier = identifier\n }\n\n/** @function setMapType\n * @param {string} newMapTypesKey - a string which a key used to identify a data accessor function. \n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The data accessor is stored in the mapTypesSel object and referenced by this key.\n */\n function setMapType(newMapTypesKey) {\n mapTypesKey = newMapTypesKey\n }\n\n/** @function basemapImage\n * @param {string} mapId - a string which should specify a unique key by which the image can be referenced. \n * @param {boolean} show - a boolean value that indicates whether or not to display this image. \n * @param {string} imageFile - a string identifying an image file. \n * @param {string} worldFile - a string identifying a 'world' file. \n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The image and world files together make a raster file that can be displayed in GIS. GIS, such as\n * QGIS can be used to create the image and world file. If you do this, make sure that the image\n * is created with the same projection as used for the SVG map - i.e. same projection as the vector\n * data for boundary and/or grid files.\n */\n function basemapImage(mapId, show, imageFile, worldFile) {\n showImage(mapId, show, basemaps, imageFile, worldFile, trans, seaFill)\n }\n \n/** @function baseMapPriorities\n * @param {Array.} mapIds - an array of strings which identify keys of basemap iamges.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The order the keys appear in the array specifies their priority when more than one is displayed\n * at the same time. Those at the start of the array have higher priority than those and the end.\n */\n function baseMapPriorities(mapIds) {\n setImagePriorities(basemaps, mapIds)\n }\n\n/** @function setLegendOpts\n * @param {legendOpts} lo - a legend options object.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * The legend options object can be used to specify properties of a legend and even the content\n * of the legend itself.\n */\n function setLegendOpts(lo) {\n legendOpts = lo\n }\n\n/** @function redrawMap\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Redraw the map, e.g. after changing map accessor function or map identifier.\n */\n function redrawMap(){\n return drawMapDots()\n }\n\n/** @function clearMap\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Clear the map of dots and legend.\n */\n function clearMap(){\n svg.select('#legend').remove()\n title.selectAll('*').remove()\n removeDots(svg)\n }\n\n/** @function getMapWidth\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Return the width of the map.\n */\n function getMapWidth(){\n return trans.width\n }\n\n/** @function saveMap\n * @param {boolean} asSvg - a boolean value that indicates whether to generate an SVG (if false, generates PNG image). \n * @param {Object} svgInfo - Initialisation options. Whole arg can be set to null if no info options.\n * @param {string} svgInfo.text - A text string to be displayed at the foot of the map. \n * This will be word-wrapped to the width of the image.\n * Some HTML tags, e.g. are recognised, but in order to facilitate word wrapping, each word must be marked up\n * separately - there should be no white space within the tag.\n * @param {Array.} svgInfo.textFormatted - An array of strings to be concatenated anddisplayed at the foot of the map. \n * Each element in the array is preceded by one of the of the following tokens which indicates how it is to be formatted:\n * n# indicates no formatting; i# indicates italics and b# indicates emboldening.\n * This resultig string will be word-wrapped to the width of the image.\n * @param {string} svgInfo.img - The path of an image to be displayed at the foot of the map. If the image is wider\n * than the SVG, it is rescaled to the size of the SVG.\n * @param {number} svgInfo.fontSize - The size of the font to be used for the text string (defaults to 12)\n * @param {number} svgInfo.margin - The size of a margin, in pixels, to be placed around the text and/or image.\n * @param {string} filename - Name of the file (without extension) to generate and download.\n * Creates an image from the displayed map and downloads to user's computer. If\n * the filename is falsey (e.g. blank), it will not automatically download the\n * file. (Allows caller to do something else with the data URL which is returned\n * as the promises resolved value.)\n * @returns {Promise} promise object represents the data URL of the image.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * \n */\n function saveMap(asSvg, svgInfo, filename) {\n return saveMapImage(svg, trans, expand, asSvg, svgInfo, filename)\n }\n\n/** @function downloadData\n * @param {boolean} asGeojson - a boolean value that indicates whether to generate GeoJson (if false, generates CSV). \n * @description This function is exposed as a method on the API returned from the svgMap function.\n */\n function downloadData(asGeojson){\n const accessFunction = mapTypesSel[mapTypesKey]\n downloadCurrentData(accessFunction(taxonIdentifier), 10000, asGeojson)\n }\n\n/** @function setMapTitle\n * @param {string} text - A text value for the map title (can include and tags). \n * @param {number} fontSize - A number indicating font size in pixels.\n * @param {number} x - a number indicating origin x position of text in map svg.\n * @param {number} y - a number indicating origin y position of text in map svg.\n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Creates a title which can be positioned independently of the legend. This is useful when the legend needs\n * to be moved, but the title does not.\n */\n function setMapTitle(text, fontSize, x, y) {\n\n let tText = text\n tText = tText.replaceAll('', '' )\n tText = tText.replaceAll('', '' )\n tText = tText.replaceAll('', '' )\n tText = tText.replaceAll('', '' )\n\n title.selectAll('*').remove()\n title.append('text').html(tText)\n .attr('x', x)\n .attr('y', y)\n .attr('font-size', fontSize + 'px')\n .style('font-family','Arial, Helvetica, sans-serif')\n }\n\n /** @function showBusy\n * @param {boolean} show - A boolean value to indicate whether or not to show map data loading. \n * @description This function is exposed as a method on the API returned from the svgMap function.\n * Allows calling application to display/hide an indicator showing the map data is loading.\n */\n function showBusy(show) {\n mapLoaderShowExplicit = show\n mapLoader.classed('map-loader-hidden', !mapLoaderShowExplicit)\n }\n\n /**\n * @typedef {Object} api\n * @property {module:svgMap~setBoundary} setBoundary - Change the map boundary. Pass a single argument\n * which is the path of a geojson file.\n * @property {module:svgMap~setGrid} setGrid - Change the grid lines for the map. Pass a single argument\n * which is the path of a geojson file.\n * @property {module:svgMap~setBoundaryColour} setBoundaryColour - Change the colour of the boundary. Pass a single argument\n * which is a string specifying the colour which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red.\n * @property {module:svgMap~setGridColour} setGridColour - Change the colour of the grid. Pass a single argument\n * which is a string specifying the colour which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red.\n * @property {module:svgMap~setCountryColour} setCountryColour - Change the colour of the country boundaries. Pass a single argument\n * which is a string specifying the colour which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red.\n * @property {module:svgMap~setVcColour} setVcColour - Change the colour of the vice county lines. Pass a single argument\n * which is a string specifying the colour which can be hex format, e.g. #FFA500, \n * RGB format, e.g. rgb(100, 255, 0) or a named colour, e.g. red.\n * @property {module:svgMap~setGridLineStyle} setGridLineStyle - Set the line style of the grid line geoJson. \n * Can be solid, dashed or none.\n * @property {module:svgMap~setCountryLineStyle} setCountryLineStyle - Set the line style of the country boundaries geoJson. \n * Can be none or something else (which will give solid line).\n * @property {module:svgMap~setVcLineStyle} setVcLineStyle - Set the line style of the Vice County line geoJson. \n * Can be none or something else (which will give solid line).\n * @property {module:svgMap~setTransform} setTransform - Set the transformation options object by passing a single argument\n * which is a string indicating the key of the transformation in the parent object.\n * @property {module:svgMap~getMapWidth} getMapWidth - Gets and returns the current width of the SVG map. \n * @property {module:svgMap~animateTransChange} animateTransChange - Set the a new transormation object and animates the transition.\n * @property {module:svgMap~setIdentfier} setIdentfier - Identifies data to the data accessor function.\n * @property {module:svgMap~setMapType} setMapType - Set the key of the data accessor function.\n * @property {module:svgMap~basemapImage} basemapImage - Specifies an image and world file for a basemap.\n * @property {module:svgMap~baseMapPriorities} baseMapPriorities - Identifies the display order of the basemap images.\n * @property {module:svgMap~setLegendOpts} setLegendOpts - Sets options for the legend.\n * @property {module:svgMap~redrawMap} redrawMap - Redraw the map.\n * @property {module:svgMap~clearMap} clearMap - Clear the map.\n * @property {module:svgMap~saveMap} saveMap - Save and download the map as an image.\n * @property {module:svgMap~downloadData} downloadData - Download a the map data as a CSV or GeoJson file.\n * @property {module:svgMap~setProj} setProj - Change the map projection. The argument is a string of the form 'gb', 'ir' or 'ci'.\n * @property {module:svgMap~setProj} setHeight - Reset the height of the main map SVG object.\n * @property {module:svgMap~showBusy} showBusy - Set a boolean value to indicate whether or not to show map data loading.\n */\n return {\n setBoundary: setBoundary,\n setGrid: setGrid,\n setBoundaryColour: setBoundaryColour,\n setGridColour: setGridColour,\n setGridLineStyle: setGridLineStyle,\n setVcLineStyle: setVcLineStyle,\n setVcColour: setVcColour,\n setCountryLineStyle: setCountryLineStyle,\n setCountryColour: setCountryColour,\n setTransform: setTransform,\n getMapWidth: getMapWidth,\n animateTransChange: animateTransChange,\n setIdentfier: setIdentfier,\n setMapType: setMapType,\n basemapImage: basemapImage,\n baseMapPriorities: baseMapPriorities,\n setLegendOpts: setLegendOpts,\n redrawMap: redrawMap,\n clearMap: clearMap,\n saveMap: saveMap,\n downloadData: downloadData,\n setProj: setProj,\n setHeight: setHeight,\n setMapTitle: setMapTitle,\n showBusy: showBusy\n }\n}","/** @module slippyMap */\n\nimport * as L from 'leaflet'\nimport * as d3 from 'd3'\nimport { getCentroid, getGjson } from 'brc-atlas-bigr'\nimport { dataAccessors } from './dataAccess.js'\nimport { svgLegend } from './svgLegend.js'\nimport { constants } from './constants.js'\nimport { downloadCurrentData } from './download.js'\n\n/**\n * @typedef {Object} basemapConfig\n * @property {string} name - name of layer to be displayer in layer control.\n * @property {string} type - either 'tileLayer' or 'wms'.\n * @property {boolean} selected - indicate whether or not this is to be the layer initially selected.\n * @property {string} url - the standard leaflet formatted URL for the layer.\n * @property {Object} opts - standard leaflet layer options.\n */\n\n/**\n * @param {Object} opts - Initialisation options.\n * @param {string} opts.selector - The CSS selector of the element which will be the parent of the leaflet map.\n * @param {string} opts.mapid - The id for the slippy map to be created.\n * @param {boolean} opts.showCountries - Indicates whether or not the map will display Country boundaries.\n * @param {boolean} opts.showVcs - Indicates whether or not the map will display Vice County boundaries.\n * @param {boolean} opts.showVcsTooltips - Indicates whether or not the name and number of the VC should be shown on click.\n * Note that you will need to ensure that the VC has 'fill' style property set to true if you want users to be able to click\n * anywhere within a VC boundary. You can also set the 'fillOpacity' property to 0 if you don't want the fill to be visible.\n * (Note that the default styleVcs properties include these values.)\n * @param {Array.} opts.styleVcs - An array of objects defining styles for VCs at different zoom levels. The properties\n * of each can be any that are meaningful to a path object in Leaflet (https://leafletjs.com/reference.html#path-option). Each\n * object also has an property called 'zoom' which can be set to an array of Leaflet zoom levels. The style properties will\n * only be applied if the map zoom level is in the array. A shortcut to indicating all zoom levels not included in other\n * array members is an empty array. If the property includes only one style object, with the zoom property set to an empty\n * array, then the style properties will be applied at all zoom levels.\n * @param {string} opts.captionId - The id of a DOM element into which feature-specific HTML will be displayed\n * as the mouse moves over a dot on the map. The HTML markup must be stored in an attribute called 'caption'\n * in the input data.\n * @param {number} opts.clusterZoomThreshold - The leaflet zoom level above which clustering will be turned\n * off for point display (except for points in same location) (default 1 - i.e. clustering always one)\n * @param {function} opts.onclick - A function that will be called if user clicks on a map\n * element. The function will be passed these attributes, in this order, if they exist on the\n * element: gr, id, caption. (Default - null.)\n * @param {number} opts.height - The desired height of the leaflet map.\n * @param {number} opts.width - The desired width of the leaflet map.\n * @param {Array.} opts.basemapConfigs - An array of map layer configuration objects.\n * @param {Object} opts.mapTypesSel - Sets an object whose properties are data access functions. The property\n * names are the 'keys' which should be human readable descriptiosn of the map types.\n * @param {string} opts.mapTypesKey - Sets the key of the selected data accessor function (map type).\n * @param {legendOpts} opts.legendOpts - Sets options for a map legend.\n * @param {Array.} opts.callbacks - An array of callbacks that can be used during data loading/display.\n * Typically these can be used to display/hide busy indicators.\n *
    callbacks[0] is fired at the start of data redraw.\n *
    callbacks[1] is fired at the end of data redraw.\n *
    callbacks[2] is fired at the start of data download.\n *
    callbacks[3] is fired at the end of data download.\n * @returns {module:slippyMap~api} Returns an API for the map.\n */\n\nexport function leafletMap({\n // Default options in here\n selector = 'body',\n mapid = 'leafletMap',\n showCountries=false,\n showVcs = false,\n showVcsTooltips = true,\n styleVcs = [\n {zoom: [], color: 'black', fill: true, weight: 2, opacity: 0.4, fillOpacity: 0},\n {zoom: [7,6,5,4,3,2,1], color: 'black', fill: true, weight: 1, opacity: 0.3, fillOpacity: 0}\n ],\n captionId = '',\n clusterZoomThreshold = 19,\n onclick = null,\n height = 500,\n width = 300,\n basemapConfigs = [],\n mapTypesKey = 'Standard hectad',\n mapTypesSel = dataAccessors,\n legendOpts = {display: false},\n callbacks = []\n} = {}) {\n let taxonIdentifier, precision\n let dots = {}\n const geojsonLayers = {}\n let markers = null\n const vcs = {mbrs: null, vcs1000: null, vcs100: {}, vcs10: {}, vcsFull: {}}\n const countries = {countries1000: null, countries100: null, countries10: null, countriesFull: null}\n\n d3.select(selector).append('div')\n .attr('id', mapid)\n .style('width', `${width}px`)\n .style('height', `${height}px`)\n\n // Create basemaps from config\n let selectedBaselayerName\n const baseMaps = basemapConfigs.reduce((bm, c) => {\n let lyrFn\n if (c.type === 'tileLayer') {\n lyrFn = L.tileLayer\n } else if (c.type === 'wms') {\n lyrFn = L.tileLayer.wms\n } else {\n return bm\n }\n bm[c.name] = lyrFn(c.url, c.opts)\n if (c.selected) {\n selectedBaselayerName = c.name\n }\n return bm\n }, {})\n // If no basemaps configured, provide a default\n if (basemapConfigs.length === 0) {\n baseMaps['OpenStreetMap'] = L.tileLayer ('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n {\n maxZoom: 19,\n attribution: '© OpenStreetMap contributors'\n }\n )\n }\n // If no basemap selected, select the first\n if (!selectedBaselayerName) {\n selectedBaselayerName = Object.keys(baseMaps)[0]\n }\n\n const map = new L.Map(mapid, {center: [55, -4], zoom: 6, layers:[baseMaps[selectedBaselayerName]]})\n\n map.on(\"viewreset\", redraw) // Not firing on current version - seems to be a bug\n map.on(\"zoomstart\", () => {\n //console.log(\"zoom start\")\n svg.style('display', 'none')\n })\n map.on(\"zoomend\", () => {\n //console.log(\"zoom end\")\n redrawCountries()\n redraw()\n })\n map.on(\"moveend\", () => {\n //console.log(\"move end\")\n redrawVcs()\n redraw()\n })\n map.zoomControl.setPosition('topright')\n\n // Record the currently selected basemap layer\n map.on('baselayerchange', function (e) {\n selectedBaselayerName = e.name\n })\n\n // Add layer selection control to map if there is more than one layer\n let mapLayerControl\n if (basemapConfigs.length > 0) {\n mapLayerControl = L.control.layers(baseMaps).addTo(map)\n }\n\n // Legend custom control\n L.Control.Legend = L.Control.extend({\n onAdd: function() {\n const div = L.DomUtil.create('div', 'legendDiv leaflet-control leaflet-bar')\n return div\n },\n onRemove: function() {\n }\n });\n L.control.Legend = function(opts) {\n return new L.Control.Legend(opts)\n }\n L.control.Legend({ position: 'topleft' }).addTo(map)\n\n function projectPoint(x, y) {\n const point = map.latLngToLayerPoint(new L.LatLng(y, x))\n this.stream.point(point.x, point.y)\n }\n const transform = d3.geoTransform({point: projectPoint})\n const path = d3.geoPath().projection(transform)\n\n map.createPane('atlaspane')\n map.getPane('atlaspane').style.zIndex = 650\n const svg = d3.select(map.getPane('atlaspane')).append(\"svg\")\n svg.attr('id', 'atlas-leaflet-svg')\n // Added overflow visible to svg (02/09/2021) because it was found to fix a very odd problem - svg graphics not\n // visible in ESB atlas but only on Firefox on Windows.\n svg.style('overflow', 'visible')\n //const svg = d3.select(map.getPanes().overlayPane).append(\"svg\")\n\n // Necessary to set SVG pointer events to none otherwise pointer events\n // do not propagate to layers below (e.g. VCs). This does not interfer if a onclick config\n // is used to set an event on feature click.\n svg.style('pointer-events', 'none')\n\n // Dont use the leaflet class leaflet-zoom-hide because we are handling\n // the hide/display of SVG layer ourselves so that it is only redisplayed\n // once dots have been regenerated (because it is quite slow)\n const g = svg.append(\"g\") //.attr(\"class\", \"leaflet-zoom-hide\")\n\n // Create pane for Vice Counties\n map.createPane('vcpane')\n map.getPane('vcpane').style.zIndex = 649\n\n // Initiate VC and Country display\n redrawVcs()\n redrawCountries()\n\n function pointMarkers() {\n // Hide the SVG (atlas elements)\n d3.select(`#${mapid}`).select('.legendDiv').style('display', 'none')\n svg.style('display', 'none')\n\n // Remove any previous\n if (markers) {\n map.removeLayer(markers)\n //console.log('removing')\n }\n\n //console.log('remaking', clusterZoomThreshold)\n\n markers = L.markerClusterGroup({ maxClusterRadius: function (zoom) {\n return (zoom <= clusterZoomThreshold) ? 80 : 1; // radius in pixels\n }})\n dots.p0.records.forEach(f => {\n // Allowed colours: https://awesomeopensource.com/project/pointhi/leaflet-color-markers\n const iconColour=f.colour ? f.colour : dots.p0.colour\n const icon = new L.Icon({\n iconUrl: `https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-${iconColour}.png`,\n shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n })\n const marker = L.marker(L.latLng(f.lat, f.lng), {icon: icon, id: f.id, gr: f.gr, caption: f.caption})\n markers.addLayer(marker)\n })\n map.addLayer(markers)\n if (onclick){\n markers.on(\"click\", function (event) {\n const p = event.layer.options\n onclick(p.gr, p.id ? p.id : null, p.caption ? p.caption : null)\n //console.log(event.layer.options)\n })\n }\n }\n\n function redraw() {\n\n // redraw and yieldRedraw are separated into two separate\n // functions so that callbacks[0] can be called before\n // called the rest of the code asynchronously. This is\n // required in order to yield control to event queue so that\n // if callbacks[0] updates gui (e.g. to show busy indicator)\n // it happens before rest of code executed.\n\n const deg5km = 0.0447\n let data, buffer\n\n if (precision===10000) {\n data = dots.p10000\n buffer = deg5km * 1.5\n } else if (precision===5000) {\n data = dots.p5000\n buffer = deg5km * 0.75\n } else if (precision===2000) {\n data = dots.p2000\n buffer = deg5km / 4\n } else if (precision===1000) {\n data = dots.p1000\n buffer = deg5km / 2\n } else {\n data = []\n buffer = 0\n }\n\n legendOpts.accessorData = data.legend\n if (!(legendOpts.display && (legendOpts.data || legendOpts.accessorData))) {\n //if (!legendOpts || !legendOpts.data || !legendOpts.data.lines || !legendOpts.data.lines.length) {\n d3.select(`#${mapid}`).select('.legendDiv').style('display', 'none')\n } else {\n if (legendOpts.display) {\n d3.select(`#${mapid}`).select('.legendDiv').style('display', 'block')\n } else {\n d3.select(`#${mapid}`).select('.legendDiv').style('display', 'none')\n }\n }\n\n if (!data) {\n data = {}\n }\n if (!data.records) {\n data.records = []\n }\n if (callbacks[0]) callbacks[0]()\n setTimeout(() => yieldRedraw(data, buffer), 50)\n }\n\n function yieldRedraw(data, buffer) {\n\n // Hide point markers\n if (markers && precision!==0) {\n map.removeLayer(markers)\n }\n\n const view = map.getBounds()\n\n const filteredData = data.records.filter(function(d){\n if (d.lng < view._southWest.lng - buffer ||\n d.lng > view._northEast.lng + buffer ||\n d.lat < view._southWest.lat - buffer ||\n d.lat > view._northEast.lat + buffer) {\n return false\n } else {\n if (!d.geometry) {\n if (precision!==0) {\n const shape = d.shape ? d.shape : data.shape\n const size = d.size ? d.size : data.size\n d.geometry = getGjson(d.gr, 'wg', shape, size)\n }\n }\n return true\n }\n })\n\n //console.log(filteredData)\n\n if (precision!==0) {\n // Atlas data - goes onto an SVG where D3 can work with it\n\n const bounds = path.bounds({\n type: \"FeatureCollection\",\n features: filteredData.map(d => {\n return {\n type: \"Feature\",\n geometry: d.geometry\n }\n })\n })\n\n const topLeft = bounds[0]\n const bottomRight = bounds[1]\n\n if (isFinite(topLeft) && isFinite(bottomRight)) {\n // These values are not finite if no data specified\n svg.attr(\"width\", bottomRight[0] - topLeft[0])\n .attr(\"height\", bottomRight[1] - topLeft[1])\n .style(\"left\", topLeft[0] + \"px\")\n .style(\"top\", topLeft[1] + \"px\")\n\n g.attr(\"transform\", \"translate(\" + -topLeft[0] + \",\" + -topLeft[1] + \")\")\n }\n // I can't find a way of dealing with paths and circles in the same\n // enter/update statement. (There may be a way using d3 symbols for\n // creating the circles, but sizing would need work.) So instead\n // we do two enter/update statements - one for circles and one for\n // paths, but it means that we have to repeat all the common code\n // for setting properties, event handlers etc.\n\n // Separate data rendered with path and data rendered with Circle\n const filteredDataPath = filteredData.filter(d => {\n const shape = d.shape ? d.shape : data.shape\n return shape!=='circlerad'\n })\n const filteredDataCircle = filteredData.filter(d => {\n const shape = d.shape ? d.shape : data.shape\n return shape==='circlerad'\n })\n\n // Create promises to be resolved when the circles and paths\n // have been redrawn.\n let pRedrawPath, pRedrawCircle\n const up = g.selectAll(\"path\")\n .data(filteredDataPath, function(d) {\n return d.gr\n })\n up.exit()\n .remove()\n\n if (filteredDataPath.length) {\n\n pRedrawPath = up.enter()\n .append(\"path\")\n .style(\"pointer-events\", \"all\")\n .style(\"cursor\", () => {\n if (onclick) {\n return 'pointer'\n }\n })\n .on('click', (a1,a2) => {\n let d\n if(a1.type === 'click') {\n d=a2\n } else {\n d=a1\n }\n if (onclick) {\n onclick(d.gr, d.id ? d.id : null, d.caption ? d.caption : null)\n }\n })\n .on('mouseover', (a1,a2) => {\n let d\n if(a1.type === 'mouseover') {\n d=a2\n } else {\n d=a1\n }\n if (captionId) {\n if (d.caption) {\n d3.select(`#${captionId}`).html(d.caption)\n } else {\n d3.select(`#${captionId}`).html('')\n }\n }\n })\n .on('mouseout', (a1,a2) => {\n let d\n if(a1.type === 'mouseout') {\n d=a2\n } else {\n d=a1\n }\n if (captionId) {\n d3.select(`#${captionId}`).html(d.noCaption ? d.noCaption : '')\n }\n })\n .merge(up)\n .transition().duration(0) // Required in order to use .end promise\n .attr(\"d\", d => {\n return path(d.geometry)\n })\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .attr(\"fill\", d => d.colour ? d.colour : data.colour)\n .attr(\"stroke\", 'black')\n .end().catch(() => null) // Catch error which comes from interrupted transition\n } else {\n pRedrawPath = Promise.resolve()\n }\n\n const uc = g.selectAll(\"circle\")\n .data(filteredDataCircle, function(d) {\n return d.gr\n })\n uc.exit()\n .remove()\n\n if (filteredDataCircle.length) {\n // Because of projection, the radii of the circles can end up\n // with several values which looks wrong, so we set all to the\n // maximum value.\n let rad = filteredDataCircle.reduce((max, d) => {\n const c0 = d.geometry.coordinates[0][0]\n const c1 = d.geometry.coordinates[0][1]\n const x0 = map.latLngToLayerPoint(new L.LatLng(c0[1], c0[0])).x\n const x1 = map.latLngToLayerPoint(new L.LatLng(c1[1], c1[0])).x\n const rad = Math.floor(Math.abs(x1 - x0))\n return rad > max ? rad : max\n }, 0)\n if (rad === 0) rad=1\n\n // Update the features\n\n pRedrawCircle = uc.enter()\n .append(\"circle\")\n .style(\"pointer-events\", \"all\")\n .style(\"cursor\", () => {\n if (onclick) {\n return 'pointer'\n }\n })\n .on('click', d => {\n if (onclick) {\n onclick(d.gr, d.id ? d.id : null, d.caption ? d.caption : null)\n }\n })\n .on('mouseover', d => {\n if (captionId) {\n if (d.caption) {\n d3.select(`#${captionId}`).html(d.caption)\n } else {\n d3.select(`#${captionId}`).html('')\n }\n }\n })\n .merge(uc)\n .transition().duration(0) // Required in order to use .end promise\n .attr(\"cx\", d => {\n return map.latLngToLayerPoint(new L.LatLng(d.lat, d.lng)).x\n })\n .attr(\"cy\", d => {\n return map.latLngToLayerPoint(new L.LatLng(d.lat, d.lng)).y\n })\n .attr(\"r\", d => rad * d.size)\n .attr(\"fill-opacity\", d => d.opacity ? d.opacity : data.opacity)\n .attr(\"fill\", d => d.colour ? d.colour : data.colour)\n .attr(\"stroke\", 'black')\n .end().catch(() => null) // Catch error which comes from interrupted transition\n } else {\n pRedrawCircle = Promise.resolve()\n }\n\n pRedrawPath.then(() => {\n //console.log(\"Paths complete\")\n })\n\n pRedrawCircle.then(() => {\n //console.log(\"Circles complete\")\n })\n\n Promise.allSettled([pRedrawPath, pRedrawCircle]).then(() => {\n //console.log(\"Paths and circles complete\")\n // callback[1] is fired at the end of data display\n // can be used to hide a busy indicator.\n if (callbacks[1]) callbacks[1]()\n\n // Redisplay the SVG\n if (precision===0) {\n svg.style('display', 'none')\n } else {\n svg.style('display', 'block')\n }\n })\n }\n }\n\n function redrawCountries() {\n\n //console.log('showCountries', showCountries, countries)\n\n const zoom = map.getZoom()\n const root = constants.thisCdn\n\n if (showCountries && zoom < 7) {\n if (!countries.countries1000) {\n countries.countries1000 = 'loading'\n d3.json(`${root}/assets/country/countries-4326-2.geojson`)\n .then(data => {\n countries.countries1000 = geojsonCountries(data)\n })\n } else if (countries.countries1000 !== 'loading') {\n if (!map.hasLayer(countries.countries1000)) {\n countries.countries1000.addTo(map)\n }\n }\n } else if (countries.countries1000 !== 'loading') {\n if (map.hasLayer(countries.countries1000)) {\n map.removeLayer(countries.countries1000)\n }\n }\n\n if (showCountries && zoom >= 7 && zoom < 10) {\n if (!countries.countries100) {\n countries.countries100 = 'loading'\n d3.json(`${root}/assets/country/countries-4326-5.geojson`)\n .then(data => {\n countries.countries100 = geojsonCountries(data)\n })\n } else if (countries.countries100 !== 'loading') {\n if (!map.hasLayer(countries.countries100)) {\n countries.countries100.addTo(map)\n }\n }\n } else if (countries.countries100 !== 'loading') {\n if (map.hasLayer(countries.countries100)) {\n map.removeLayer(countries.countries100)\n }\n }\n\n if (showCountries && zoom >= 10 && zoom < 12) {\n if (!countries.countries10) {\n countries.countries10 = 'loading'\n d3.json(`${root}/assets/country/countries-4326-25.geojson`)\n .then(data => {\n countries.countries10 = geojsonCountries(data)\n })\n } else if (countries.countries10 !== 'loading') {\n if (!map.hasLayer(countries.countries10)) {\n countries.countries10.addTo(map)\n }\n }\n } else if (countries.countries10 !== 'loading') {\n if (map.hasLayer(countries.countries10)) {\n map.removeLayer(countries.countries10)\n }\n }\n\n if (showCountries && zoom >= 12) {\n if (!countries.countriesFull) {\n countries.countriesFull = 'loading'\n d3.json(`${root}/assets/country/countries-4326-80.geojson`)\n .then(data => {\n countries.countriesFull = geojsonCountries(data)\n })\n } else if (countries.countriesFull !== 'loading') {\n if (!map.hasLayer(countries.countriesFull)) {\n countries.countriesFull.addTo(map)\n }\n }\n } else if (countries.countriesFull !== 'loading') {\n if (map.hasLayer(countries.countriesFull)) {\n map.removeLayer(countries.countriesFull)\n }\n }\n\n function geojsonCountries(data) {\n\n return L.geoJSON(data,\n {\n pane: 'vcpane',\n style: getStyle()\n }\n ).addTo(map)\n }\n }\n\n function redrawVcs() {\n\n //console.log(map.getZoom())\n const root = constants.thisCdn\n\n // Load the VC mbr file if not already\n if (showVcs) {\n if (!vcs.mbrs) {\n const mbrFile = `${root}/assets/vc/mbrs.csv`\n d3.csv(mbrFile, vc => {\n return {\n vc: vc.vc,\n _southWest: {\n lat: Number(vc.lllat),\n lng: Number(vc.lllon),\n },\n _northEast: {\n lat: Number(vc.urlat),\n lng: Number(vc.urlon),\n }\n }\n }).then(data => {\n vcs.mbrs = data\n displayVcs()\n })\n } else {\n displayVcs()\n }\n } else {\n // Remove any VCs currently displayed\n if (map.hasLayer(vcs.vcs1000)) {\n map.removeLayer(vcs.vcs1000)\n }\n Object.keys(vcs.vcs100).forEach(vc => {\n if (map.hasLayer(vcs.vcs100[vc])) {\n map.removeLayer(vcs.vcs100[vc])\n }\n })\n Object.keys(vcs.vcs10).forEach(vc => {\n if (map.hasLayer(vcs.vcs10[vc])) {\n map.removeLayer(vcs.vcs10[vc])\n }\n })\n Object.keys(vcs.vcsFull).forEach(vc => {\n if (map.hasLayer(vcs.vcsFull[vc])) {\n map.removeLayer(vcs.vcsFull[vc])\n }\n })\n }\n\n function displayVcs() {\n const zoom = map.getZoom()\n\n // Because the d3.json load is asynchronous, can be\n // kicked off more than once for same file so we\n // use the 'loading' flag to prevent this.\n\n if (zoom < 7) {\n if (!vcs.vcs1000) {\n vcs.vcs1000 = 'loading'\n d3.json(`${root}/assets/vc/vcs-4326-1000.geojson`)\n .then(data => {\n vcs.vcs1000 = geojsonVcs(data)\n })\n } else if (vcs.vcs1000 !== 'loading') {\n if (!map.hasLayer(vcs.vcs1000)) {\n vcs.vcs1000.addTo(map)\n }\n }\n } else if (vcs.vcs1000 !== 'loading') {\n if (map.hasLayer(vcs.vcs1000)) {\n map.removeLayer(vcs.vcs1000)\n }\n }\n\n if (zoom >= 7 && zoom < 10) {\n\n vcsInView().forEach(vc => {\n if (!vcs.vcs100[vc]) {\n vcs.vcs100[vc] = 'loading'\n d3.json(`${root}/assets/vc/100/${vc}.geojson`)\n .then(data => {\n vcs.vcs100[vc] = geojsonVcs(data)\n })\n } else if (vcs.vcs100[vc] !== 'loading'){\n if (!map.hasLayer(vcs.vcs100[vc])) {\n vcs.vcs100[vc].addTo(map)\n }\n }\n })\n } else {\n Object.keys(vcs.vcs100).forEach(vc => {\n if (vcs.vcs100[vc] !== 'loading') {\n if (map.hasLayer(vcs.vcs100[vc])) {\n map.removeLayer(vcs.vcs100[vc])\n }\n }\n })\n }\n\n if (zoom >= 10 && zoom < 12) {\n //console.log('VCs simpified ten')\n vcsInView().forEach(vc => {\n if (!vcs.vcs10[vc]) {\n vcs.vcs10[vc] = 'loading'\n d3.json(`${root}/assets/vc/10/${vc}.geojson`)\n .then(data => {\n vcs.vcs10[vc] = geojsonVcs(data)\n })\n } else if (vcs.vcs10[vc] !== 'loading') {\n if (!map.hasLayer(vcs.vcs10[vc])) {\n vcs.vcs10[vc].addTo(map)\n }\n }\n })\n } else {\n Object.keys(vcs.vcs10).forEach(vc => {\n if (vcs.vcs10[vc] !== 'loading') {\n if (map.hasLayer(vcs.vcs10[vc])) {\n map.removeLayer(vcs.vcs10[vc])\n }\n }\n })\n }\n\n if (zoom >= 12) {\n //console.log('VCs full res')\n vcsInView().forEach(vc => {\n if (!vcs.vcsFull[vc]) {\n vcs.vcsFull[vc] = 'loading'\n d3.json(`${root}/assets/vc/full/${vc}.geojson`)\n .then(data => {\n vcs.vcsFull[vc] = geojsonVcs(data)\n })\n } else if (vcs.vcsFull[vc] !== 'loading') {\n if (!map.hasLayer(vcs.vcsFull[vc])) {\n vcs.vcsFull[vc].addTo(map)\n }\n }\n })\n } else {\n Object.keys(vcs.vcsFull).forEach(vc => {\n if (vcs.vcsFull[vc] !== 'loading') {\n if (map.hasLayer(vcs.vcsFull[vc])) {\n map.removeLayer(vcs.vcsFull[vc])\n }\n }\n })\n }\n\n // Reset styles depending on zoom level\n if (vcs.vcs1000 !== 'loading' && map.hasLayer(vcs.vcs1000)) {\n vcs.vcs1000.setStyle(getStyle())\n }\n Object.keys(vcs.vcs100).forEach(vc => {\n if (vcs.vcs100[vc] !== 'loading' && map.hasLayer(vcs.vcs100[vc])) {\n vcs.vcs100[vc].setStyle(getStyle())\n }\n })\n Object.keys(vcs.vcs10).forEach(vc => {\n if (vcs.vcs10[vc] !== 'loading' && map.hasLayer(vcs.vcs10[vc])) {\n vcs.vcs10[vc].setStyle(getStyle())\n }\n })\n Object.keys(vcs.vcsFull).forEach(vc => {\n if (vcs.vcsFull[vc] !== 'loading' && map.hasLayer(vcs.vcsFull[vc])) {\n vcs.vcsFull[vc].setStyle(getStyle())\n }\n })\n }\n\n function geojsonVcs(data) {\n let fn = null\n if (showVcsTooltips) {\n fn = (f, l) => {\n return l.bindPopup(`VC: ${f.properties['CODE']} ${f.properties['NAME']}`)\n }\n }\n return L.geoJSON(data,\n {\n pane: 'vcpane',\n style: getStyle(),\n interactive: showVcsTooltips,\n onEachFeature: fn\n }\n ).addTo(map)\n }\n function vcsInView() {\n return vcs.mbrs.filter(vc => overlaps(vc, map.getBounds())).map(vc => vc.vc)\n }\n function overlaps(v1, v2) {\n\n //console.log(v1, v2)\n\n const v1minx = v1._southWest.lng\n const v1maxx = v1._northEast.lng\n const v1miny = v1._southWest.lat\n const v1maxy = v1._northEast.lat\n\n const v2minx = v2._southWest.lng\n const v2maxx = v2._northEast.lng\n const v2miny = v2._southWest.lat\n const v2maxy = v2._northEast.lat\n\n // Bottom left corner of v1 overlaps v2\n if (v1minx > v2minx && v1minx < v2maxx && v1miny > v2miny && v1miny < v2maxy) return true\n\n // Bottom right corner of v1 overlaps v2\n if (v1maxx > v2minx && v1maxx < v2maxx && v1miny > v2miny && v1miny < v2maxy) return true\n\n // Top right corner of v1 overlaps v2\n if (v1maxx > v2minx && v1maxx < v2maxx && v1maxy > v2miny && v1maxy < v2maxy) return true\n\n // Top left corner of v1 overlaps v2\n if (v1minx > v2minx && v1minx < v2maxx && v1maxy > v2miny && v1maxy < v2maxy) return true\n\n // Bottom left corner of v2 overlaps v1\n if (v2minx > v1minx && v2minx < v1maxx && v2miny > v1miny && v2miny < v1maxy) return true\n\n // Bottom right corner of v2 overlaps v1\n if (v2maxx > v1minx && v2maxx < v1maxx && v2miny > v1miny && v2miny < v1maxy) return true\n\n // Top right corner of v2 overlaps v1\n if (v2maxx > v1minx && v2maxx < v1maxx && v2maxy > v1miny && v2maxy < v1maxy) return true\n\n // Top left corner of v2 overlaps v1\n if (v2minx > v1minx && v2minx < v1maxx && v2maxy > v1miny && v2maxy < v1maxy) return true\n\n // No overlap\n return false\n }\n }\n\n function getStyle() {\n // Get style where zoom explicity named in one of the\n // style objects zoom arrays.\n let style = styleVcs.find(s => s.zoom.indexOf(map.getZoom())>-1)\n // If not found, then find the style with empty zoom array\n if (!style) {\n style = styleVcs.find(s => s.zoom.length===0)\n }\n return style\n }\n\n/** @function setMapType\n * @param {string} newMapTypesKey - A string which a key used to identify a data accessor function.\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * The data accessor is stored in the mapTypesSel object and referenced by this key.\n */\n function setMapType(newMapTypesKey) {\n mapTypesKey = newMapTypesKey\n }\n\n/** @function setIdentfier\n * @param {string} identifier - A string which identifies some data to\n * a data accessor function.\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * The data accessor function, specified elsewhere, will use this identifier to access\n * the correct data.\n */\n function setIdentfier(identifier) {\n taxonIdentifier = identifier\n }\n\n/** @function redrawMap\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * Redraw the map, e.g. after changing map accessor function or map identifier.\n */\n function redrawMap(){\n\n // callback[2] is fired as start of data download and\n // can be used to show a busy indicator. As data is\n // loaded asychronously, the gui should be updated okay.\n if (callbacks[2]) callbacks[2]()\n\n const accessFunction = mapTypesSel[mapTypesKey]\n return accessFunction(taxonIdentifier).then(data => {\n if (data && data.records) {\n data.records = data.records.map(d => {\n const ll = getCentroid(d.gr, 'wg').centroid\n d.lat = ll[1]\n d.lng = ll[0]\n return d\n })\n dots[`p${data.precision}`] = data\n precision = data.precision\n\n //Legend\n legendOpts.accessorData = data.legend\n if (legendOpts.display && (legendOpts.data || legendOpts.accessorData)) {\n const legendSvg = d3.select(selector).append('svg')\n svgLegend(legendSvg, legendOpts)\n const bbox = legendSvg.node().getBBox()\n const w = legendOpts.width ? legendOpts.width : bbox.x + bbox.width + bbox.x\n const h = legendOpts.height ? legendOpts.height : bbox.y + bbox.height + bbox.y\n d3.select(`#${mapid}`).select('.legendDiv').html(`${legendSvg.html()}`)\n legendSvg.remove()\n }\n }\n\n // callback[3] is fired at the end of data download and\n // can be used to hide a busy indicator.\n if (callbacks[3]) callbacks[3]()\n\n if (precision===0){\n pointMarkers()\n } else {\n redraw()\n }\n })\n }\n\n/** @function setLegendOpts\n * @param {legendOpts} lo - a legend options object.\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * The legend options object can be used to specify properties of a legend and even the content\n * of the legend itself.\n */\n function setLegendOpts(lo) {\n legendOpts = lo\n }\n\n/** @function clearMap\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * Clear the map of dots and legend.\n */\n function clearMap(){\n d3.select(`#${mapid}`).select('.legendDiv').style('display', 'none')\n svg.style('display', 'none')\n\n // Hide point markers\n if (markers) {\n map.removeLayer(markers)\n }\n}\n\n/** @function setSize\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * Change the size of the leaflet map.\n * @param {number} width - Width of the map.\n * @param {number} height - Height of the map.\n */\n function setSize(width, height){\n d3.select(`#${mapid}`)\n .style('width', `${width}px`)\n .style('height', `${height}px`)\n map.invalidateSize()\n}\n\n /** @function invalidateSize\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * Expose the leaflet map invalidate size method.\n */\n function invalidateSize(){\n map.invalidateSize()\n }\n\n /** @function addBasemapLayer\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * Provides a method to add a basemap layer after the map is created.\n * @param {basemapConfig} config - a configuration object to define the new layer.\n */\n function addBasemapLayer(config){\n if (!baseMaps[config.name]) {\n // Add config to baseMaps\n let lyrFn\n if (config.type === 'tileLayer') {\n lyrFn = L.tileLayer\n } else if (config.type === 'wms') {\n lyrFn = L.tileLayer.wms\n }\n if (lyrFn) {\n baseMaps[config.name] = lyrFn(config.url, config.opts)\n if (Object.keys(baseMaps).length === 2) {\n // This is the second base layer - create mapLayerControl\n mapLayerControl = L.control.layers(baseMaps).addTo(map)\n } else {\n mapLayerControl.addBaseLayer(baseMaps[config.name], config.name)\n }\n if (config.selected) {\n map.removeLayer(baseMaps[selectedBaselayerName])\n map.addLayer(baseMaps[config.name])\n }\n }\n }\n }\n\n /** @function removeBasemapLayer\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * Provides a method to remove a basemap layer after the map is created.\n * @param {string} mapName - the name by which the map layer is identified (appears in layer selection).\n */\n function removeBasemapLayer(mapName){\n if (baseMaps[mapName] && Object.keys(baseMaps).length > 1) {\n map.removeLayer(baseMaps[mapName])\n mapLayerControl.removeLayer(baseMaps[mapName])\n delete baseMaps[mapName]\n if (selectedBaselayerName === mapName) {\n // If the removed layer was previously displayed, then\n // display first basemap.\n map.addLayer(baseMaps[Object.keys(baseMaps)[0]])\n }\n if (Object.keys(baseMaps).length === 1) {\n // Only one base layer - remove mapLayerControl\n mapLayerControl.remove()\n }\n }\n }\n\n /** @function addGeojsonLayer\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * Provides a method to add a geojson layer after the map is created.\n * @param {geojsonConfig} config - a configuration object to define the new layer.\n */\n function addGeojsonLayer(config){\n\n if (!geojsonLayers[config.name]) {\n\n if (!config.style) {\n config.style = {\n \"color\": \"blue\",\n \"weight\": 5,\n \"opacity\": 0.65\n }\n }\n d3.json(config.url).then(data => {\n geojsonLayers[config.name] = L.geoJSON(data, {style: config.style}).addTo(map)\n })\n } else {\n console.log(`Geojson layer with the name ${config.name} is already loaded.`)\n }\n }\n\n /** @function removeGeojsonLayer\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n * Provides a method to remove a geojson layer after the map is created.\n * @param {string} mapName - the name by which the map layer is identified.\n */\n function removeGeojsonLayer(name){\n if (geojsonLayers[name]) {\n map.removeLayer(geojsonLayers[name])\n delete geojsonLayers[name]\n } else {\n console.log(`Geojson layer with the name ${name} not found.`)\n }\n }\n\n\n /** @function showOverlay\n * @description This function allows you to show/hide the leaflet overlay layer (atlas layer).\n * Provides a method to show/hide the leaflet overlay layer used to display atlas data.\n * @param {boolean} show - Set to true to display the layer, or false to hide it.\n */\n function showOverlay(show) {\n if (show) {\n if (legendOpts.display) {\n d3.select(`#${mapid}`).select('.legendDiv').style('display', 'block')\n } else {\n d3.select(`#${mapid}`).select('.legendDiv').style('display', 'none')\n }\n svg.style('display', 'block')\n } else {\n d3.select(`#${mapid}`).select('.legendDiv').style('display', 'none')\n svg.style('display', 'none')\n }\n }\n\n /** @function changeClusterThreshold\n * @description This function allows you to change the clustering threshold zoom level for point maps.\n * @param {number} clusterZoomThreshold - The leaflet zoom level above which clustering will be turned off.\n */\n function changeClusterThreshold(level) {\n clusterZoomThreshold = level\n if (precision===0){\n pointMarkers()\n }\n }\n\n/** @function setShowVcs\n * @description This function allows you to change whether or not Vice County boundaries are displayed..\n * @param {boolean} show - Indicates whether or not to display VCs.\n */\n function setShowVcs(show) {\n showVcs = show\n redrawVcs()\n }\n\n/** @function setShowCountries\n * @description This function allows you to change whether or not Country boundaries are displayed..\n * @param {boolean} show - Indicates whether or not to display Countries.\n */\n function setShowCountries(show) {\n showCountries = show\n redrawCountries()\n}\n\n/** @function downloadData\n * @param {boolean} asGeojson - a boolean value that indicates whether to generate GeoJson (if false, generates CSV).\n * @description This function is exposed as a method on the API returned from the leafletMap function.\n */\n function downloadData(asGeojson){\n\n const accessFunction = mapTypesSel[mapTypesKey]\n downloadCurrentData(accessFunction(taxonIdentifier), precision, asGeojson)\n }\n\n /**\n * @typedef {Object} api\n * @property {module:slippyMap~setIdentfier} setIdentfier - Identifies data to the data accessor function.\n * @property {module:slippyMap~setMapType} setMapType - Set the key of the data accessor function.\n * @property {module:slippyMap~setLegendOpts} setLegendOpts - Sets options for the legend.\n * @property {module:slippyMap~redrawMap} redrawMap - Redraw the map.\n * @property {module:slippyMap~clearMap} clearMap - Clear the map.\n * @property {module:slippyMap~setSize} setSize - Reset the size of the leaflet map.\n * @property {module:slippyMap~invalidateSize} invalidateSize - Access Leaflet's invalidateSize method.\n * @property {module:slippyMap~addBasemapLayer} addBasemapLayer - Add a basemap to the map.\n * @property {module:slippyMap~removeBasemapLayer} removeBasemapLayer - Remove a basemap from the map.\n * @property {module:slippyMap~addGeojsonLayer} addGeojsonLayer - Add a geojson layer to the map.\n * @property {module:slippyMap~removeGeojsonLayer} removeGeojsonLayer - Remove a geojson layer from the map.\n * @property {module:slippyMap~showOverlay} showOverlay - Show/hide the overlay layer.\n * @property {module:slippyMap~changeClusterThreshold} changeClusterThreshold - Change the zoom cluster threshold for points.\n * @property {module:slippyMap~setShowVcs} setShowVcs - Set the boolean flag which indicates whether or not to display VCs.\n * @property {module:slippyMap~setShowCountries} setShowCountries - Set the boolean flag which indicates whether or not to display Countries.\n * @property {module:slippyMap~downloadData} downloadData - Download a the map data as a CSV or GeoJson file.\n * @property {module:slippyMap~map} lmap - Returns a reference to the leaflet map object.\n */\n return {\n setIdentfier: setIdentfier,\n setLegendOpts: setLegendOpts,\n redrawMap: redrawMap,\n setMapType: setMapType,\n clearMap: clearMap,\n setSize: setSize,\n invalidateSize: invalidateSize,\n addBasemapLayer: addBasemapLayer,\n removeBasemapLayer: removeBasemapLayer,\n addGeojsonLayer: addGeojsonLayer,\n removeGeojsonLayer: removeGeojsonLayer,\n showOverlay: showOverlay,\n changeClusterThreshold: changeClusterThreshold,\n setShowVcs: setShowVcs,\n setShowCountries: setShowCountries,\n downloadData: downloadData,\n lmap: map\n }\n}","import * as d3 from 'd3'\nimport { svgMap } from './svgMap.js'\nimport { leafletMap } from './leafletMap'\n\nexport function parseTags () {\n const divs = d3.selectAll(\"div.brcatlas\")\n divs.each(function() {\n // Loop for each div of class brcatlas\n const el = d3.select(this)\n const id = el.attr(\"id\")\n const csv = el.attr(\"data-csv\")\n let valid = true\n if (!id) {\n console.log('Div tag of class \"brcatlas\" requires an id attribute.')\n valid = false\n }\n if (!csv) {\n console.log(`Div tag (id=${id}) of class \"brcatlas\" requires a data-csv attribute.`)\n valid = false\n }\n if (valid) {\n // Slippiness\n const slippy = el.attr(\"data-slippy\") ? true : false\n // mapopts. Default true\n const mapopts = el.attr(\"data-opts\") ? el.attr(\"data-opts\") !== \"false\" : true\n // transopts. Default BI1\n const transopts = el.attr(\"data-trans\") ? el.attr(\"data-trans\") : 'BI1'\n // Precision. Default 10000\n const precision = el.attr(\"data-precision\") ? parseInt(el.attr(\"data-precision\")) : 10000\n // Map height.\n const height = el.attr(\"data-height\") ? parseInt(el.attr(\"data-height\")) : null\n // Map height.\n const width = el.attr(\"data-width\") ? parseInt(el.attr(\"data-width\")) : null\n\n let mapTypesKey\n switch(precision) {\n case 10000:\n mapTypesKey = 'Standard hectad'\n break\n case 2000:\n mapTypesKey = 'Standard tetrad'\n break\n case 1000:\n mapTypesKey = 'Standard monad'\n break\n default:\n mapTypesKey = 'Standard hectad'\n }\n\n const opts = {\n selector: `#${id}`,\n mapid: `#${id}-map`,\n mapTypesKey: mapTypesKey,\n transOptsControl: mapopts,\n legendOpts: getLegendOpts (el, precision)\n }\n if (height) {\n opts.height = height\n }\n if (width) {\n opts.width = width\n }\n if (transopts) {\n opts.transOptsKey = transopts\n }\n let map\n if (slippy) {\n map = leafletMap(opts)\n } else {\n map = svgMap(opts)\n }\n map.setIdentfier(csv)\n map.redrawMap()\n }\n })\n}\n\nfunction getLegendOpts (el, precision){\n // display. Default true\n const display = el.attr(\"data-legend\") ? el.attr(\"data-legend\") === \"true\" : false\n // scale. Default 1\n const scale = el.attr(\"data-legend-scale\") ? parseFloat(el.attr(\"data-legend-scale\")) : 1\n // x. Default 0\n const x = el.attr(\"data-legend-x\") ? parseInt(el.attr(\"data-legend-x\")) : 0\n // y. Default 0\n const y = el.attr(\"data-legend-y\") ? parseInt(el.attr(\"data-legend-y\")) : 0\n // title. Default ''\n const title = el.attr(\"data-legend-title\") ? el.attr(\"data-legend-title\") : ''\n // size. Default 1\n const size = el.attr(\"data-legend-size\") ? parseFloat(el.attr(\"data-legend-size\")) : 1\n // opacity. Default 1\n const opacity = el.attr(\"data-legend-opacity\") ? parseFloat(el.attr(\"data-legend-opacity\")) : 1\n // lines. Default ''\n const linesOpts = el.attr(\"data-legend-lines\") ? el.attr(\"data-legend-lines\").split('|') : []\n const lines = linesOpts.map(l => {\n const parts = l.split(';')\n if (parts.length === 3) {\n return {\n colour: parts[2].trim(),\n shape: parts[1].trim(),\n text: parts[0].trim()\n }\n } else {\n return {\n colour: 'red',\n shape: 'circle',\n text: 'incorrect legend line elements'\n }\n }\n })\n\n const opts = {\n display: display,\n scale: scale,\n x: x,\n y: y,\n data: {\n title: title,\n size: size,\n precision: precision,\n opacity: opacity,\n lines: lines,\n }\n }\n\n if (display) {\n return opts\n } else {\n return {display: false}\n }\n}","import { namedTransOpts } from './src/svgCoords'\nimport { dataAccessors } from './src/dataAccess'\nimport { svgMap } from './src/svgMap'\nimport { leafletMap } from './src/leafletMap'\nimport { parseTags } from './src/tagParse'\nimport pkg from './package.json'\n\n// Output version from package json to console\n// to assist with trouble shooting.\nconsole.log(`Running ${pkg.name} version ${pkg.version}`)\n\nexport {\n namedTransOpts,\n dataAccessors,\n svgMap,\n leafletMap,\n parseTags\n} \n\ndocument.addEventListener('DOMContentLoaded', () => {\n parseTags()\n})\n"],"names":["getInsetDims","transOpts","outputHeight","outputWidth","widthFromHeight","transform","transformFunction","insetDims","insets","forEach","inset","ll","bounds","xmin","ymin","ur","xmax","ymax","iWidth","iHeight","push","x","imageX","y","imageY","width","height","realWidth","realHeight","p","ignoreInset","tX","tY","length","insetX","insetY","forTween","createTrans","params","point","d3Path","d3","projection","tP","stream","boundsChannelIslands_gb","boundsNorthernIsles_gb","namedTransOpts","BI1","id","caption","BI2","BI3","BI4","getTweenTransOpts","from","to","tween","fto","copyTransOptsForTween","tto","rto","i","idx","insetCi","insetNi","iNew","unshift","csvGr","file","precision","Promise","resolve","reject","r","gr","noCaption","colour","shape","opacity","size","then","data","records","e","dataAccessors","constants","bigrCdn","thisCdn","pkg","_defineProperties","target","props","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_toConsumableArray","arr","Array","isArray","_arrayLikeToArray","_arrayWithoutHoles","iter","Symbol","iterator","_iterableToArray","o","minLen","n","prototype","toString","call","slice","constructor","name","test","_unsupportedIterableToArray","TypeError","_nonIterableSpread","len","arr2","FOCUSABLE_ELEMENTS","Modal","activeModal","validateModalPresence","validateArgs","MicroModal","_ref","targetModal","_ref$triggers","triggers","_ref$onShow","onShow","_ref$onClose","onClose","_ref$openTrigger","openTrigger","_ref$closeTrigger","closeTrigger","_ref$openClass","openClass","_ref$disableScroll","disableScroll","_ref$disableFocus","disableFocus","_ref$awaitCloseAnimat","awaitCloseAnimation","_ref$awaitOpenAnimati","awaitOpenAnimation","_ref$debugMode","debugMode","instance","Constructor","_classCallCheck","this","modal","document","getElementById","config","registerTriggers","apply","onClick","bind","onKeydown","protoProps","staticProps","value","_this","_len","arguments","_key","filter","Boolean","trigger","addEventListener","event","showModal","_this2","undefined","activeElement","setAttribute","classList","add","scrollBehaviour","addEventListeners","handler","removeEventListener","setFocusToFirstNode","removeEventListeners","focus","remove","closeModal","toggle","body","querySelector","assign","style","overflow","hasAttribute","keyCode","retainFocus","nodes","querySelectorAll","_this3","focusableNodes","getFocusableNodes","nodesWhichAreNotCloseTargets","node","offsetParent","contains","focusedItemIndex","indexOf","shiftKey","preventDefault","console","warn","concat","triggerMap","validateTriggerPresence","init","options","triggerAttr","attributes","generateTriggerMap","show","close","closeModalById","optsDialog","mapid","transOptsSel","transOptsKey","transOptsControl","mapTypesSel","mapTypesKey","mapTypesControl","applyFunction","div1","append","classed","attr","div3","header","text","main","el","keys","k","radio","transOptsSelection","replace","mapTypeSelection","footer","on","ret","select","showOptsDialog","checked","window","basemaps","showImage","mapId","gBasemaps","imageFile","worldFile","trans","seaFill","transId","selectAll","img","Image","onerror","log","onload","imageWidth","imageHeight","fetch","response","aWrld","split","xResolution","Number","yResolution","minEasting","maxNorthing","maxEasting","minNorthing","topLeft","topRight","bottomLeft","iInsets","xShift","yShift","dims","xmid","ymid","xyWithInset","xyWithNoInset","maskTopLeft","getDataUrl","src","canvas","createElement","ctx","getContext","drawImage","toDataURL","transformImages","b","hidden","setImagePriorities","mapIds","reverse","SEC_TO_RAD","HALF_PI","Math","PI","D2R","R2D","FORTPI","TWO_PI","SPI","exports","ft","to_meter","ignoredChar","match","obj","testkey","lkey","toLowerCase","defData","paramName","paramVal","paramOutname","self","paramObj","map","v","trim","a","reduce","proj","datum","rf","parseFloat","lat_0","lat0","lat_1","lat1","lat_2","lat2","lat_ts","lon_0","long0","lon_1","long1","lon_2","long2","alpha","gamma","rectified_grid_angle","lonc","longc","x_0","x0","y_0","y0","k_0","k0","r_a","R_A","zone","parseInt","south","utmSouth","towgs84","datum_params","units","unit","from_greenwich","pm","PrimeMeridian","nadgrids","datumCode","axis","substr","approx","whitespace","latin","keyword","endThings","digets","Parser","Error","level","place","root","stack","currentObject","state","mapit","thing","out","newObj","item","sExpr","shift","convert","readCharicter","char","neutral","quoted","afterquote","number","word","afterItem","pop","newObjects","output","d2r","input","wkt","lisp","type","projName","local","_typeof","PROJECTION","AXIS","axisOrder","ii","UNIT","DATUM","SPHEROID","geogcs","GEOGCS","toMeter","sphere","ellps","TOWGS84","isFinite","outName","inName","rename","cleanWKT","defs","that","def","charAt","parseProj","EPSG","ESRI","IAU2000","WGS84","GOOGLE","globals","codeWords","codes","parse","code","testObj","testDef","some","testWKT","auth","checkMercator","maybeProjStr","ext","checkProjStr","projStr","testProj","destination","source","property","eccent","sinphi","cosphi","con","sqrt","abs","sign","phi","com","pow","tan","ts","dphi","eccnth","atan","sin","identity","pt","projs","es","cos","msfnz","forward","lon","lat","adjust_lon","tsfnz","inverse","exp","phi2z","names","projStore","start","get","ellipseName","wgs84","ellipse","datumName","ch1903","ggrs87","nad83","nad27","potsdam","carthage","hermannskogel","osni52","ire65","rassadiran","nzgd49","osgb36","s_jtsk","beduaram","gunung_segara","rnb72","loadedNadgrids","parseNadgridString","optional","mandatory","grid","isNull","secondsToRadians","seconds","decodeString","view","end","String","fromCharCode","Uint8Array","buffer","mapNodes","longitudeShift","latitudeShift","readGridHeader","offset","isLittleEndian","parent","lowerLatitude","getFloat64","upperLatitude","lowerLongitude","upperLongitude","latitudeInterval","longitudeInterval","gridNodeCount","getInt32","readGridNodes","gridHeader","nodesOffset","gridShiftRecords","record","getFloat32","latitudeAccuracy","longitudeAccuracy","Projection","srsCode","callback","error","json","parseCode","ourProj","projections","datumDef","Datum","a2","b2","sphere_","Ellipsoid","dc_sphere","ecc","ep2","getNadgrids","datumObj","datum_type","grids","extend","geodeticToGeocentric","Rn","Sin_Lat","Sin2_Lat","Cos_Lat","Longitude","Latitude","Height","z","Infinity","geocentricToGeodetic","P","RR","CT","ST","RX","RK","RN","CPHI0","SPHI0","CPHI","SPHI","SDPHI","X","Y","Z","atan2","genau","checkParams","dest","compareDatums","source_a","source_es","applyGridShift","dest_a","dest_b","dest_es","Dx_BF","Dy_BF","Dz_BF","Rx_BF","Ry_BF","Rz_BF","M_BF","geocentricToWgs84","x_tmp","y_tmp","z_tmp","geocentricFromWgs84","NaN","attemptedGrids","subgrid","subgrids","epsilon","del","minX","minY","maxX","lim","maxY","applySubgridShift","isNaN","pin","ct","val","tb","t","nadInterpolate","dif","inx","indx","floor","frct","f00","cvs","f10","f11","f01","m11","m10","m00","m01","crs","denorm","xin","yin","zin","array","m","checkCoord","num","enforceAxis","hasZ","toPoint","checkSanity","checkNotWGS","adjust_axis","datum_transform","transformer","coords","transformedArray","splice","checkProj","oProj","proj4","fromProj","toProj","coord","single","A","I","O","mgrs","bbox","UTMtoLL","decode","toUpperCase","left","bottom","right","top","accuracy","utm","seasting","easting","snorthing","northing","zoneNumber","zoneLetter","setParm","get100kSetForZone","setColumn","setRow","column","row","parm","index","colOrigin","charCodeAt","rowOrigin","colInt","rowInt","rollover","encode","N","T","C","M","LongOriginRad","ZoneNumber","Lat","Long","LatRad","degToRad","LongRad","eccSquared","UTMEasting","UTMNorthing","round","getLetterDesignator","LLtoUTM","deg","radToDeg","rad","N1","T1","C1","R1","D","LongOrigin","mu","phi1Rad","e1","result","LetterDesignator","mgrsString","testChar","hunK","sb","substring","set","east100k","curCol","eastingValue","rewindMarker","getEastingFromChar","north100k","curRow","northingValue","getNorthingFromChar","getMinNorthing","remainder","accuracyBonus","sepEastingString","sepNorthingString","sep","sepEasting","sepNorthing","Point","fromMGRS","mgrsStr","toMGRS","C08","en","sphi","cphi","arg","s","pj_mlfn","pj_enfn","ml0","delta_lon","sin_phi","cos_phi","al","als","c","cs","tq","ml","acos","pj_inv_mlfn","tan_phi","d","ds","f","g","temp","h","asin","max","min","log1py","hypot","pp","B","cos_2B","h1","h2","arg_r","arg_i","hr2","hi2","sin_arg_r","cos_arg_r","sinh_arg_i","sinh","cosh_arg_i","cosh","j","hr","hi1","hr1","hi","tmerc","cgb","cbg","utg","gtu","np","Qn","gatg","Zb","clens","Ce","Cn","sin_Cn","cos_Cn","sin_Ce","cos_Ce","asinhy","tmp","clens_cmplx","adjust_zone","etmerc","dependsOn","esinp","rc","phic0","ratexp","K","srat","gauss","sinc0","cosc0","R2","title","sinc","cosc","cosl","rho","coslat0","sinlat0","cons","ms1","X0","ssfn_","cosX0","sinX0","sinX","cosX","rh","sinlat","coslat","dlon","ce","Chi","phit","eccen","phy0","lambda0","sinPhy0","semiMajorAxis","flattening","e2","R","b0","k1","k2","k3","Sa1","Sa2","S","rotI","rotB","lambda","phy","prevPhy","iteration","cosph0","F","H","L","sinph0","J","gamma0","projectionName","lamc","lam1","lam2","phi1","phi2","alpha_c","no_off","no_rot","alp","gam","one_es","E","lam0","pi","singam","cosgam","sinrot","cosrot","rB","ArB","BrA","u_0","v_pole_n","v_pole_s","U","V","W","u","Qp","Sp","Tp","Vp","Up","sin1","cos1","ts1","sin2","cos2","ms2","ts2","ts0","ns","f0","rh1","theta","s45","s90","fi0","alfa","uq","u0","n0","s0","ro0","ad","gfi","deltav","eps","ro","czech","fi1","ok","e0","e3","e0fn","e1fn","e2fn","e3fn","mlfn","lam","nl","gN","tl","asq","cl","dd","imlfn","nl1","rl1","tl1","dl","dsq","adjust_lat","mode","S_POLE","N_POLE","EQUIT","OBLIQ","qp","qsfnz","mmf","apa","APA","authset","rq","xmf","ymf","sinb1","cosb1","coslam","sinlam","q","sinb","cosb","cCe","sCe","ab","beta","cosz","sinz","sin_po","cos_po","t1","qs1","t2","qs2","t3","qs0","ns0","qs","phi1z","asinz","eccnts","sin_p14","cos_p14","infinity_dist","coslon","iqsfnz","dlat","bl","tanphi","mln","mlnp","ma","B_re","B_im","C_re","C_im","delta_lat","d_phi","d_lambda","d_phi_n","d_psi","th_n_im1","th_re","th_im","th_n_re","th_n_im","z_re","z_im","z_n_im1","delta_x","z_n_re","z_n_im","iterations","num_re","num_im","den_re","den_im","den2","d_psi_n","C_y","C_x","delta_theta","ml1","ml2","sinth","costh","gsq","msq","xx","yy","xys","c1","c2","c3","a1","m1","th1","sin_p12","cos_p12","Mlp","Ml","Nl1","Nl","psi","Az","G","GH","Hs","kp","cos_c","s2","s3","s4","cosAz","Ee","sinpsi","FACE_ENUM","AREA_ENUM","qsc_fwd_equat_face_theta","area","qsc_shift_lon_origin","slon","face","one_minus_f","one_minus_f_squared","xy","sinlon","nu","cosmu","tannu","tantheta","invert_sign","xa","lp","COEFS_X","COEFS_Y","poly3_val","coefs","NODES","f_df","max_err","iters","upd","newton_rapshon","poly3_der","azi","degrees","tilt","pn1","rp","pfact","omega","cg","sg","cw","sw","yt","ba","bm","bq","flip_axis","sweep","radius_g_1","radius_g","rone_es","radius_p","radius_p2","radius_p_inv2","v_x","v_y","v_z","det","v_zp","defaultDatum","Proj","common","nadgrid","DataView","nFields","detectLittleEndian","nSubgridFields","nSubgrids","shiftType","fromSemiMajorAxis","fromSemiMinorAxis","toSemiMajorAxis","toSemiMinorAxis","readHeader","subHeader","lngColumnCount","latColumnCount","count","readSubgrids","version","sterea","stere","somerc","omerc","lcc","krovak","cass","laea","aea","gnom","cea","eqc","poly","nzmg","mill","sinu","moll","eqdc","vandg","aeqd","ortho","qsc","robin","geocent","tpers","geos","includedProjections","km100s","acc","km100","GridRef","invalidGridRef","checkGr","r100km","RegExp","rHectad","rQuandrant","rTetrad","rMonad","r6fig","r8fig","r10fig","prefix","gb","epsg","ir","ci","wg","qOffsets","se","nw","ne","tOffsets","l","w","getCentroid","toProjection","suffix","grType","centroid","convertCoords","fromProjection","getGjson","scale","angle","removeDots","svg","drawDots","captionId","onclick","accessFunction","taxonIdentifier","getCaption","pTrans","addPromise","transition","recCircles","radiusPixels","getRadiusPixels","recBullseyes","circles","enter","merge","legendKey","ease","duration","stroke","exit","recSquares","bullseyes","colour2","recDiamonds","squares","recTriangles","diamonds","startsWith","triangle","extraRotate","yOffset","html","allSettled","svgLegend","legendOpts","legendFontSize","legendFont","legendInteractivity","highlightClass","legendData","accessorData","legendX","legendY","legendScale","padding","raligned","iOffset","gLegend","parseText","legText","replaceAll","iUnderlinePad","lines","textWidth","nCells","maxWidths","fill","iLength","getBBox","offsets","legendHighlight","iLine","dot","alignOffset","lineHeight","underline","stopPropagation","infoHeight","saveMapImage","expand","asSvg","svgInfo","filename","pInfoAdded","infoText","textFormatted","it","format","its","margin","fontSize","gInfo","mask","tInfo","yLastLine","imgWidth","imgHeight","iInfo","addInfo","blob1","serialize","download","removeInfo","domSvg","promise","image","rect","getBoundingClientRect","context","toBlob","URL","createObjectURL","rasterize","blob2","downloadLink","xmlns","cloneSvg","cloneNode","setAttributeNS","string","XMLSerializer","serializeToString","Blob","downloadCurrentData","pData","asGeojson","ftrs","attrs","geometry","properties","outData","encodeURIComponent","JSON","stringify","cleanColumn","join","dataUrl","link","href","appendChild","dispatchEvent","MouseEvent","bubbles","cancelable","removeChild","svgMap","boundary","boundaryf","dataBoundary","dataGrid","vc","dataVc","country","dataCountry","selector","display","boundaryGjson","gridGjson","vcGjson","countryGjson","gridLineColour","gridLineStyle","gridLineWidth","vcLineStyle","vcColour","vcLineWidth","countryLineStyle","countryColour","countryLineWidth","boundaryColour","boundaryFill","boundaryLineWidth","boundaryShadowColour","boundaryShadowWidth","insetColour","insetLineWidth","callbackOptions","highlightStyle","lowlightStyle","sheet","innerHTML","createStyle","str","forText","els","mainDiv","mapLoaderShowExplicit","mapLoader","mapLoaderInner","pBoundary","pGrid","pVc","pCountry","shadow","userChangedOptions","opts","drawBoundaryAndGrid","setSvgSize","drawInsetBoxes","refreshMapDots","drawMapDots","legend","setTransform","newTransOptsKey","setHeight","newHeight","setBoundary","newGeojson","setGrid","setProj","newProj","animateTransChange","lastTransOptsKey","setTimeout","incr","setBoundaryColour","setGridColour","setGridLineStyle","setVcLineStyle","setVcColour","setCountryLineStyle","setCountryColour","setIdentfier","identifier","setMapType","newMapTypesKey","basemapImage","baseMapPriorities","setLegendOpts","lo","redrawMap","clearMap","getMapWidth","saveMap","downloadData","setMapTitle","tText","showBusy","leafletMap","selectedBaselayerName","showCountries","showVcs","showVcsTooltips","styleVcs","zoom","color","weight","fillOpacity","clusterZoomThreshold","basemapConfigs","callbacks","dots","geojsonLayers","markers","vcs","mbrs","vcs1000","vcs100","vcs10","vcsFull","countries","countries1000","countries100","countries10","countriesFull","baseMaps","lyrFn","wms","url","selected","maxZoom","attribution","mapLayerControl","center","layers","projectPoint","latLngToLayerPoint","redraw","redrawCountries","redrawVcs","zoomControl","setPosition","addTo","Legend","onAdd","create","onRemove","position","path","createPane","getPane","zIndex","pointMarkers","removeLayer","maxClusterRadius","p0","iconColour","icon","iconUrl","shadowUrl","iconSize","iconAnchor","popupAnchor","shadowSize","marker","lng","addLayer","layer","p10000","deg5km","p5000","p2000","p1000","yieldRedraw","getBounds","filteredData","_southWest","_northEast","features","bottomRight","pRedrawPath","pRedrawCircle","filteredDataPath","filteredDataCircle","up","uc","c0","coordinates","x1","getZoom","geojsonCountries","pane","getStyle","hasLayer","displayVcs","mbrFile","lllat","lllon","urlat","urlon","geojsonVcs","vcsInView","setStyle","fn","bindPopup","interactive","onEachFeature","v1","v2","v1minx","v1maxx","v1miny","v1maxy","v2minx","v2maxx","v2miny","v2maxy","find","legendSvg","setSize","invalidateSize","addBasemapLayer","addBaseLayer","removeBasemapLayer","mapName","addGeojsonLayer","removeGeojsonLayer","showOverlay","changeClusterThreshold","setShowVcs","setShowCountries","lmap","parseTags","each","csv","valid","slippy","mapopts","transopts","getLegendOpts","parts"],"mappings":"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1gB,EAAMye,KAAKhmB,YAAYxY,IAAI0gC,IAC3B3gB,EAAMye,KAAKhmB,YAAYxY,IAAI2gC,IAC3B5gB,EAAMye,KAAKhmB,YAAYxY,IAAI4gC,IAC3B7gB,EAAMye,KAAKhmB,YAAYxY,IAAI6gC,IAC3B9gB,EAAMye,KAAKhmB,YAAYxY,IAAI8gC,IAC3B/gB,EAAMye,KAAKhmB,YAAYxY,IAAI+gC,IAC3BhhB,EAAMye,KAAKhmB,YAAYxY,IAAIghC,IAC3BjhB,EAAMye,KAAKhmB,YAAYxY,IAAIihC,IAC3BlhB,EAAMye,KAAKhmB,YAAYxY,IAAIkhC,IAC3BnhB,EAAMye,KAAKhmB,YAAYxY,IAAImhC,IAC3BphB,EAAMye,KAAKhmB,YAAYxY,IAAIohC,IAC3BrhB,EAAMye,KAAKhmB,YAAYxY,IAAIqhC,IDtC7BC,CAAoBvhB,IETpB,IAwgBIwhB,GAxgBW,CACb,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,QACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,QACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,QACG,MAEV,SACa,OACN,IACA,QACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,QACG,MAEV,SACa,OACN,IACA,QACG,MAEV,SACa,OACN,IACA,QACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,OACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OACG,MAEV,SACa,MACN,IACA,OA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"}