{"version":3,"file":"brccharts.min.umd.js","sources":["../src/general.js","../src/pie/highlightitem.js","../src/pie/makepie.js","../src/pie/legend.js","../src/phen1/highlightitem.js","../src/phen1/makephen.js","../src/phen1/metricsplus.js","../src/phen1/legend.js","../src/trend2/trend2.js","../src/trend3/trend3.js","../src/density/density.js","../src/bar/bar.js","../src/yearly/highlightitem.js","../src/yearly/makeYearly.js","../src/yearly/legend.js","../src/temporal/highlightitem.js","../src/temporal/makeTemporal.js","../src/temporal/chartBar.js","../src/temporal/chartLine.js","../src/temporal/chartPointAndError.js","../src/temporal/chartSupTrendLine.js","../src/temporal/chartSupPointAndError.js","../src/temporal/chartSupVertical.js","../src/temporal/legend.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/index.js","../node_modules/proj4/projs.js","../node_modules/brc-atlas-bigr/dist/bigr.esm.js","../src/constants.js","../index.js","../src/accum.js","../src/altlat.js","../src/links.js","../src/phen1/phen1.js","../src/phen2.js","../src/pie/pie.js","../src/temporal/temporal.js","../src/trend.js","../src/yearly/yearly.js"],"sourcesContent":["import * as d3 from 'd3'\n\nexport function safeId(text) {\n // Ensure selector starts with a letter. Replace white space with underscores.\n return text ? `id_${text.replace(/\\W/g,'_')}` : null\n}\n\nexport function cloneData(data) {\n return data.map(d => { return {...d}})\n}\n\nexport const month2day = [1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306, 336, 366]\nconst ysDomain = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n \nfunction filterYsDomain(monthScaleRange) {\n const minMonth = monthScaleRange[0]\n const maxMonth = monthScaleRange[1]\n return ysDomain.filter((m,i) => i+1 >= minMonth && i+1 <= maxMonth)\n}\n\nfunction filterMonth2day(monthScaleRange, noAdjust) {\n const minMonth = monthScaleRange[0]\n const maxMonth = monthScaleRange[1]\n const fMonth2day = month2day.filter((d,i) => {\n return i+1 >= minMonth && i+1 <= maxMonth+1\n })\n if (noAdjust) {\n return fMonth2day\n } else {\n return fMonth2day.map(d => d - month2day[minMonth-1] + 1)\n }\n}\n\nfunction getDayRange(monthScaleRange) {\n const filteredMonth2day = filterMonth2day(monthScaleRange)\n return filteredMonth2day[filteredMonth2day.length-1] - filteredMonth2day[0]\n}\n\nexport function xAxisMonth(width, ticks, fontSize, font) {\n\n // Still used by accum chart, but replaced by xAxisMonthText\n // and xAxisMonthNoText elsewhere.\n const ysRange = month2day.map(d => (d-1)/365 * width)\n const xScaleTime = d3.scaleOrdinal().domain(ysDomain).range(ysRange)\n\n const xAxis = d3.axisBottom()\n .scale(xScaleTime)\n\n // Work out the max text widths of the three styles\n // of month representation\n const svg = d3.select('body').append('svg')\n const getMaxTextWidth = (aText) => {\n return Math.max(...aText.map(m => {\n const tmpText = svg.append('text')\n .text(m)\n if (font) tmpText.style('font-family', font)\n if (fontSize) tmpText.style('font-size', fontSize)\n const textWidth = tmpText.node().getBBox().width\n tmpText.remove()\n return textWidth\n }))\n }\n const maxFullMonth = getMaxTextWidth(ysDomain)\n const maxMedMonth = getMaxTextWidth(ysDomain.map(m=>m.substr(0,3)))\n const maxMinMonth = getMaxTextWidth(ysDomain.map(m=>m.substr(0,1)))\n svg.remove()\n\n if (ticks) {\n xAxis.ticks(ysDomain)\n .tickSize(width >= 200 ? 13 : 5, 0)\n .tickFormat(month => {\n //if (width >= 750) {\n if (width / 12 > maxFullMonth + 4) {\n return month\n //} else if (width >= 330) {\n } else if (width / 12 >= maxMedMonth + 4) {\n return month.substr(0,3)\n //} else if (width >= 200) {\n } else if (width /12 >= maxMinMonth + 4) {\n return month.substr(0,1)\n } else {\n return ''\n }\n })\n } else {\n xAxis.tickValues([]).tickSizeOuter(0)\n }\n return xAxis\n}\n\nexport function xAxisMonthNoText(width, monthScaleRange) {\n \n const filteredYsDomain = filterYsDomain(monthScaleRange)\n const filteredMonth2day = filterMonth2day(monthScaleRange)\n const dayRange = getDayRange(monthScaleRange)\n\n const ysRange = filteredMonth2day.map(d => (d-1)/dayRange * width)\n const xScaleTime = d3.scaleOrdinal().domain(filteredYsDomain).range(ysRange)\n\n const xAxis = d3.axisBottom()\n .scale(xScaleTime)\n\n xAxis.ticks(filteredYsDomain)\n .tickSize(width >= 200 ? 13 : 5, 0)\n .tickFormat(() => '')\n \n return xAxis\n}\n\nexport function xAxisMonthText(width, ticks, fontSize, font, monthScaleRange) {\n\n const filteredYsDomain = filterYsDomain(monthScaleRange)\n filteredYsDomain.unshift('')\n const filteredMonth2day = filterMonth2day(monthScaleRange)\n const dayRange = getDayRange(monthScaleRange)\n\n const monthMid2day = [1]\n for (let i=0; i (d-1)/dayRange * width)\n const xScaleTime = d3.scaleOrdinal().domain(filteredYsDomain).range(ysRange)\n\n const xAxis = d3.axisBottom()\n .scale(xScaleTime)\n\n // Work out the max text widths of the three styles\n // of month representation\n const svg = d3.select('body').append('svg')\n const getMaxTextWidth = (aText) => {\n return Math.max(...aText.map(m => {\n const tmpText = svg.append('text')\n .text(m)\n if (font) tmpText.style('font-family', font)\n if (fontSize) tmpText.style('font-size', fontSize)\n const textWidth = tmpText.node().getBBox().width\n tmpText.remove()\n return textWidth\n }))\n }\n const maxFullMonth = getMaxTextWidth(filteredYsDomain)\n const maxMedMonth = getMaxTextWidth(filteredYsDomain.map(m=>m.substr(0,3)))\n const maxMinMonth = getMaxTextWidth(filteredYsDomain.map(m=>m.substr(0,1)))\n\n svg.remove()\n\n const monthNumber = monthScaleRange[1] - monthScaleRange[0] + 1\n if (ticks) {\n xAxis.ticks(filteredYsDomain)\n .tickSize(0)\n .tickFormat(month => { \n if (month === '') {\n return ''\n } else if (width / monthNumber > maxFullMonth + 4) {\n return month\n } else if (width / monthNumber >= maxMedMonth + 4) {\n return month.substr(0,3)\n } else if (width / monthNumber >= maxMinMonth + 4) {\n return month.substr(0,1)\n } else {\n return ''\n }\n })\n } else {\n xAxis.tickValues([]).tickSizeOuter(0)\n }\n return xAxis\n}\n\nexport function xAxisYear(width, ticks, min, max, bars) {\n const xScale = d3.scaleLinear()\n .range([0, width])\n\n if (bars) {\n xScale.domain([min - 0.5, max + 0.5])\n } else {\n xScale.domain([min, max])\n }\n\n const xAxis = d3.axisBottom()\n .scale(xScale)\n\n if (ticks) {\n const years = max - min\n const threshold = 30\n\n let ticks\n if (width / years > threshold) {\n ticks = years\n } else if (width / years * 2 > threshold) {\n ticks = years / 2\n } else if (width / years * 5 > threshold) {\n ticks = years / 5\n } else if (width / years * 10 > threshold ) {\n ticks = years / 10\n } else {\n ticks = 2\n }\n xAxis.ticks(ticks) \n\n xAxis.tickFormat(year => year.toString())\n\n if (bars) {\n xAxis.tickSizeOuter(0)\n }\n } else {\n xAxis.tickValues([]).tickSizeOuter(0)\n }\n return xAxis\n}\n\nexport function wrapText(text, svg, maxWidth, fontSize) {\n\n const textSplit = text.split(\" \")\n const lines = ['']\n let line = 0\n\n for (let i=0; i < textSplit.length; i++) {\n\n if (textSplit[i] === '\\n') {\n line++\n lines[line] = ''\n } else {\n let workingText = `${lines[line]} ${textSplit[i]}`\n workingText = workingText.trim()\n\n const txt = svg.append('text')\n .text(workingText)\n .style('font-size', fontSize)\n\n const width = txt.node().getBBox().width\n\n if (width > maxWidth) {\n line++\n lines[line] = textSplit[i]\n } else {\n lines[line] = workingText\n }\n txt.remove()\n }\n }\n return lines\n}\n\nexport function makeText (text, classText, fontSize, textAlign, textWidth, svg) {\n\n let svgText = svg.select(`.${classText}`)\n if (!svgText.size()) {\n svgText = svg.append('svg').attr(\"class\", classText)\n }\n \n const lines = wrapText(text, svgText, textWidth, fontSize)\n\n const uText = svgText.selectAll(`.${classText}-line`)\n .data(lines)\n\n const eText = uText.enter()\n .append('text')\n .attr(\"class\", `${classText}-line`)\n\n uText\n .merge(eText)\n .text(d => {\n return d\n })\n .style('font-size', fontSize)\n\n uText.exit()\n .remove()\n\n const height = svgText.select(`.${classText}-line`).node().getBBox().height\n const widths = svgText.selectAll(`.${classText}-line`).nodes().map(n => (n.getBBox().width))\n\n svgText.selectAll(`.${classText}-line`)\n .attr('y', (d, i) => (i + 1) * height)\n .attr('x', (d, i) => {\n if (textAlign === 'centre') {\n return (textWidth - widths[i]) / 2\n } else if(textAlign === 'right') {\n return textWidth - widths[i]\n } else {\n return 0\n }\n })\n svgText.attr(\"height\", height * lines.length + height * 0.2) // The 0.2 allows for tails of letters like g, y etc.\n\n return svgText\n}\n\nexport function positionMainElements(svg, expand, headPad) {\n\n headPad = headPad ? headPad : 0 // For backward compatibility\n const space = 10\n const svgTitle = svg.select('.titleText')\n const svgSubtitle = svg.select('.subtitleText')\n const svgChart = svg.select('.mainChart')\n const svgFooter = svg.select('.footerText')\n\n svgTitle.attr(\"x\", headPad)\n svgSubtitle.attr(\"x\", headPad)\n svgFooter.attr(\"x\", headPad)\n\n svgSubtitle.attr(\"y\", Number(svgTitle.attr(\"height\")))\n svgChart.attr(\"y\", Number(svgTitle.attr(\"height\")) + Number(svgSubtitle.attr(\"height\")) + space)\n svgFooter.attr(\"y\", Number(svgTitle.attr(\"height\")) + Number(svgSubtitle.attr(\"height\")) + space + Number(svgChart.attr(\"height\")))\n \n const height = Number(svgTitle.attr(\"height\")) +\n Number(svgSubtitle.attr(\"height\")) + \n Number(svgChart.attr(\"height\")) + \n Number(svgFooter.attr(\"height\")) +\n 2 * space\n\n if (expand) {\n svg.attr(\"viewBox\", \"0 0 \" + Number(svgChart.attr(\"width\")) + \" \" + height)\n } else {\n svg.attr(\"width\", Number(svgChart.attr(\"width\")))\n svg.attr(\"height\", height)\n }\n\n}\n\nexport function saveChartImage(svg, expand, asSvg, filename, font) {\n\n return new Promise((resolve) => {\n if (asSvg) {\n const blob1 = serialize(svg, font)\n if(filename) {\n download(blob1, filename)\n }\n resolve(blob1)\n } else {\n rasterize(svg).then(blob2 => {\n if(filename) {\n download(blob2, filename)\n }\n resolve(blob2) \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, font) {\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 // Explicitly change text in clone to required font\n const fontOut = font ? font : 'Arial, Helvetica, sans-serif'\n d3Clone.selectAll('text').style(fontOut)\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, font) {\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, font))\n return promise\n }\n\n function 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}\n\nexport function transPromise(transition, pArray) {\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 pArray.push(p)\n }\n}\n\nexport function temporalScale(chartStyle, periodType, minPeriod, maxPeriod, xPadding, monthScaleRange, width) {\n\n // This function returns an object that provides all the functionality of a d3 scale but it is\n // tailored to the needs of the temporal chart. The return object has the following properties:\n // * d3 - this is the raw d3 scale function that lies at the hear of all the functionality.\n // * bandwidth - a replacement for the d3 scale bandwidth function which does any necessary \n // preprocessing on passed value before passing to the d3 scale bandwidth function.\n // * v - a replacement for the d3 scale function which does any necessary \n // preprocessing on passed value before passing to the d3 scale function.\n let periods = []\n for (let i = minPeriod; i <= maxPeriod; i++) {\n periods.push(i)\n }\n let scaleD3, scaleFn, bandwidthFn\n if (periodType === 'month' || periodType === 'week' || periodType === 'day') {\n\n const m2d = filterMonth2day(monthScaleRange, true)\n scaleD3 = d3.scaleLinear().domain([m2d[0], m2d[m2d.length - 1]]).range([1, width])\n scaleFn = (v) => {\n return scaleD3(periodToDay(v, periodType, chartStyle, monthScaleRange))\n }\n bandwidthFn = (v) => {\n return periodToWidth(v, periodType, scaleD3)\n }\n } else if (chartStyle === 'bar') {\n scaleD3 = d3.scaleBand().domain(periods).range([0, width]).paddingInner(0.1)\n scaleFn = scaleD3\n bandwidthFn = scaleD3.bandwidth\n } else if (chartStyle === 'line' || chartStyle === 'area') {\n scaleD3 = d3.scaleLinear().domain([minPeriod - xPadding, maxPeriod + xPadding]).range([0, width])\n scaleFn = scaleD3\n bandwidthFn = () => {\n return 0\n }\n }\n\n // Where the scale is used as an argument to a d3 axis scale function, an unadulterated scale\n // is required, so the d3 scale is added as a property to this scale function so that it can\n // be accessed.\n scaleFn.d3 = scaleD3\n scaleFn.bandwidth = bandwidthFn\n return scaleFn\n}\n\nfunction periodToDay(p, periodType, chartStyle) {\n if (periodType === 'week') {\n if (chartStyle === 'bar') {\n return (p-1)*7 + 1\n } else {\n // style is line or area\n return (p-1)*7 + 1 + 3.5\n }\n } else if(periodType === 'month') {\n if (chartStyle === 'bar') {\n return month2day[p-1]\n } else {\n // style is line or area\n return month2day[p-1] + ((month2day[p] - month2day[p-1]) / 2)\n }\n } else {\n // perioType is 'day'\n if (chartStyle === 'bar') {\n return p\n } else {\n // style is line or area\n return p+0.5\n }\n }\n}\n\nfunction periodToWidth(p, periodType, xScale) {\n if (periodType === 'week') {\n return xScale(7) - xScale(0) - 1\n } else if (periodType === 'month') {\n return xScale(month2day[p]) - xScale(month2day[p-1]) - 1\n } else {\n return xScale(1) - xScale(0) - 1\n }\n}\n\nexport function spreadScale(minY, maxY, yPadding, metrics, height, composition, spreadOverlap) {\n \n let fn, fnAxis, tickFormat, spreadHeight\n\n if (composition === 'spread' && metrics.length > 1) {\n \n // Work out height in 'sread units' - su.\n const overlap = Number(spreadOverlap)\n const bottom = 0.2\n const maxmax = Math.max(...metrics.map(m => m.maxValue))\n const suLastMetric = isFinite(maxmax) ? metrics[metrics.length-1].maxValue / maxmax * (1 + overlap) : 0\n const suPenultimateMetric = isFinite(maxmax) ? metrics[metrics.length-2].maxValue / maxmax * (1 + overlap) - 1 : 0\n const suLast = Math.max(suLastMetric, suPenultimateMetric)\n const suHeight = metrics.length - 1 + suLast + bottom \n const spreadOffset = height / suHeight\n spreadHeight = (1 + overlap) * spreadOffset \n\n fn = (v, iMetric) => {\n const d3fn = d3.scaleLinear().domain([minY - yPadding, maxY + yPadding]).range([spreadHeight, 0])\n return d3fn(v) + height - spreadHeight - bottom * spreadOffset - iMetric * spreadOffset\n }\n\n // Axis scale\n const ysDomain = ['']\n const ysRange = [0]\n if (metrics.length){\n for (let i=0; i {\n return d3fn(v)\n }\n fnAxis = d3fn\n if (maxY-minY > 20) {\n tickFormat = 'd'\n } else if (maxY-minY > 1) {\n tickFormat = '.1f' \n } else {\n tickFormat = '.2f'\n }\n spreadHeight = height\n }\n\n fn.yAxis = fnAxis\n fn.tickFormat = tickFormat\n fn.height = spreadHeight\n return fn\n}\n\nexport function addG (id, g) {\n if (g.select(`#${id}`).size()) { \n return g.select(`#${id}`)\n } else {\n return g.append('g').attr('id', id)\n }\n}\n","import * as d3 from 'd3'\nimport * as gen from '../general'\n\nexport function addEventHandlers(svg, sel, isArc, interactivity, dataPrev, imageWidth, callback) {\n sel\n .on(\"mouseover\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(svg, isArc ? d.data.name : d.name, true, dataPrev, imageWidth, callback)\n }\n })\n .on(\"mouseout\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(svg, isArc ? d.data.name : d.name, false, dataPrev, imageWidth, callback)\n }\n })\n .on(\"click\", function(d) {\n if (interactivity === 'mouseclick') {\n highlightItem(svg, isArc ? d.data.name : d.name, true, dataPrev, imageWidth, callback)\n d3.event.stopPropagation()\n }\n })\n}\n\nexport function highlightItem (svg, name, show, dataPrev, imageWidth, callback) {\n \n const i = gen.safeId(name)\n const imgSelected = svg.select('.brc-item-image')\n\n if (show) {\n\n // Callback\n callback(name)\n\n // Highlighting\n svg.selectAll('path').classed('brc-lowlight', true)\n svg.selectAll('.legendSwatch').classed('brc-lowlight', true)\n svg.selectAll('.legendText').classed('brc-lowlight', true)\n svg.selectAll('.labelsPie').classed('brc-lowlight', true)\n svg.selectAll('.labelsPieHighlight').classed('brc-lowlight', true)\n\n svg.select(`#swatch-${i}`).classed('brc-lowlight', false)\n svg.select(`#legend-${i}`).classed('brc-lowlight', false)\n svg.select(`#pie-${i}`).classed('brc-lowlight', false)\n svg.select(`#label-highlight-${i}`).classed('brc-lowlight', false)\n \n svg.selectAll('.labelsPieHighlight').classed('brc-highlight', false)\n svg.select(`#label-highlight-${i}`).classed('brc-highlight', true)\n\n // Image display\n const data = dataPrev.find(d => name === d.name)\n if (data && data.image) {\n // Loading image into SVG and setting to specified width\n // and then querying bbox returns zero height. So in order\n // to get the height of the image (required for correct)\n // positioning, it is necessary first to load the image and\n // get the dimensions.\n if (data.imageHeight) {\n if (imgSelected.attr('xlink:href') !== data.image) {\n // The loaded image is different from that of the\n // highlighted item, so load.\n loadImage(data, svg)\n }\n imgSelected.classed('brc-item-image-hide', false)\n } else {\n // console.log('data', data)\n const img = new Image\n img.onload = function() {\n data.imageWidth = imageWidth \n data.imageHeight = imageWidth * this.height / this.width\n loadImage(data, svg)\n }\n img.src = data.image\n imgSelected.classed('brc-item-image-hide', false)\n }\n } else {\n imgSelected.classed('brc-item-image-hide', true)\n }\n } else {\n callback('')\n\n svg.selectAll('.brc-lowlight').classed('brc-lowlight', false)\n imgSelected.classed('brc-item-image-hide', true)\n svg.selectAll('.labelsPie').classed('brc-highlight', false)\n\n svg.selectAll('.labelsPieHighlight').classed('brc-highlight', false)\n svg.selectAll('.labelsPieHighlight').classed('brc-lowlight', true)\n }\n}\n\nfunction loadImage(d, svg) {\n const imgSelected = svg.select('.brc-item-image')\n imgSelected.attr('xlink:href', d.image)\n imgSelected.attr('width', d.imageWidth)\n imgSelected.attr('height', d.imageHeight)\n imgSelected.attr(\"x\", -d.imageWidth / 2)\n imgSelected.attr(\"y\", -d.imageHeight / 2)\n}","\nimport * as d3 from 'd3'\nimport * as gen from '../general'\nimport { addEventHandlers } from './highlightitem'\n\nexport function makePie (data, dataPrevIn, sort, strokeWidth, radius, innerRadius, innerRadius2, svg, svgChart, imageWidth, interactivity, duration, label, labelColour, labelFontSize, callback) {\n\n //block = true\n\n let dataDeleted, dataInserted, dataRetained\n const init = !dataPrevIn\n const dataNew = gen.cloneData(data)\n let dataPrev\n \n if (init) {\n dataInserted = []\n dataDeleted = []\n dataRetained = []\n dataPrev = []\n } else {\n dataPrev = [...dataPrevIn]\n const prevNames = dataPrev.map(d => d.name)\n const newNames = dataNew.map(d => d.name)\n\n dataDeleted = dataPrev.filter(d => !newNames.includes(d.name))\n dataDeleted = gen.cloneData(dataDeleted)\n\n dataInserted = dataNew.filter(d => !prevNames.includes(d.name))\n dataInserted = gen.cloneData(dataInserted)\n\n dataRetained = dataNew.filter(d => prevNames.includes(d.name))\n dataRetained = gen.cloneData(dataRetained)\n }\n\n let fnSort\n if (sort === 'asc') {\n fnSort = (a,b) => b-a\n } else if (sort === 'desc') {\n fnSort = (a,b) => a-b\n } else {\n fnSort = null\n }\n\n const dataDeleted2 = dataDeleted.map(d => {\n const nd = {...d}\n nd.number = 0\n return nd\n })\n const dataComb = gen.cloneData([...dataNew, ...dataDeleted2])\n\n //const arcsPrev = d3.pie().value(d => d.number).sortValues(fnSort)(dataPrev)\n //const arcsComb = d3.pie().value(d => d.number).sortValues(fnSort)(dataComb) \n const arcsPrev = getArcs(dataPrev)\n const arcsComb = getArcs(dataComb)\n\n //console.log('dataComb',dataComb)\n\n function getArcs(data){\n const data1 = data.filter((d) => !d.set || d.set===1)\n const data2 = data.filter((d) => d.set && d.set===2)\n\n const arcs1 = d3.pie().value(d => d.number).sortValues(fnSort)(data1)\n const arcs2 = d3.pie().value(d => d.number).sortValues(fnSort)(data2)\n return [...arcs1, ...arcs2]\n }\n \n arcsComb.forEach(arcComb => {\n const prevArc = arcsPrev.find(arcPrev => arcComb.data.name === arcPrev.data.name)\n if (prevArc) {\n arcComb.prevArc = prevArc\n if (dataDeleted.find(d => d.name === arcComb.data.name)) {\n arcComb.deleted = true\n }\n }\n if (dataInserted.find(d => d.name === arcComb.data.name)) {\n arcComb.inserted = true\n }\n })\n\n // Now data processing complete, reset dataPrev variable\n dataPrev = data\n\n const arcGenerator = d3.arc().innerRadius(innerRadius).outerRadius(radius)\n const arcGeneratorLables = d3.arc().innerRadius(innerRadius).outerRadius(radius)\n const arcGeneratorLables2 = d3.arc().innerRadius(innerRadius2).outerRadius(innerRadius)\n\n // Good stuff here: https://bl.ocks.org/mbostock/4341417\n // and here https://bl.ocks.org/mbostock/1346410\n // Store the displayed angles in _current.\n // Then, interpolate from _current to the new angles.\n // During the transition, _current is updated in-place by d3.interpolate.\n function arcTween(arc, _this, trans, radiusx, innerRadiusx, innerRadius2) {\n\n let radius, innerRadius\n if (!arc.data.set || arc.data.set===1) {\n radius = radiusx\n innerRadius = innerRadiusx\n } else {\n radius = innerRadiusx\n innerRadius = innerRadius2\n }\n\n let i\n const iPrev = d3.interpolate(_this._current, arc.prevArc)\n const iCurr = d3.interpolate(_this._current, arc)\n const midRadius = innerRadius + (radius-innerRadius)/2\n\n return function(t) {\n if (trans === 1) {\n if (init) {\n i = iCurr\n arcGenerator.outerRadius(d3.interpolate(innerRadius, radius)(t))\n arcGenerator.innerRadius(innerRadius) \n } else if (dataInserted.length) {\n if (arc.deleted) {\n // Previous arcs to be deleted\n i = iPrev\n if (dataRetained.length) {\n arcGenerator.outerRadius(d3.interpolate(radius, midRadius)(t))\n arcGenerator.innerRadius(d3.interpolate(innerRadius, midRadius)(t))\n } else {\n arcGenerator.outerRadius(d3.interpolate(radius, innerRadius)(t))\n arcGenerator.innerRadius(innerRadius) \n }\n } else if (arc.inserted) {\n // New arcs to be inserted (invisibly)\n i = iCurr\n arcGenerator.outerRadius(innerRadius)\n arcGenerator.innerRadius(innerRadius)\n } else {\n // Existing arcs to be shrunk to outer ring\n i = iPrev\n arcGenerator.outerRadius(radius)\n arcGenerator.innerRadius(d3.interpolate(innerRadius, midRadius)(t))\n }\n } else if (dataDeleted.length) {\n if (arc.deleted) {\n // Previous arcs to be deleted\n i = iPrev\n arcGenerator.outerRadius(d3.interpolate(radius, innerRadius)(t))\n arcGenerator.innerRadius(innerRadius)\n } else {\n i = iPrev\n arcGenerator.outerRadius(radius)\n arcGenerator.innerRadius(innerRadius)\n }\n } else {\n i = iCurr\n arcGenerator.outerRadius(radius)\n arcGenerator.innerRadius(innerRadius)\n }\n }\n\n if (trans === 2) {\n if (dataInserted.length) {\n if (arc.inserted) {\n i = iCurr\n if (dataRetained.length) {\n // Shown inserted arcs in inner ring\n arcGenerator.outerRadius(d3.interpolate(innerRadius, midRadius)(t))\n arcGenerator.innerRadius(innerRadius)\n } else {\n arcGenerator.outerRadius(d3.interpolate(innerRadius, radius)(t))\n arcGenerator.innerRadius(innerRadius)\n }\n } else if (arc.deleted) {\n i = iCurr\n if (dataRetained.length) {\n // Deleted arcs to be kept with inner & outer radius the same (invisible)\n arcGenerator.outerRadius(midRadius)\n arcGenerator.innerRadius(midRadius)\n } else {\n arcGenerator.outerRadius(innerRadius)\n arcGenerator.innerRadius(innerRadius)\n }\n } else {\n // Existing arcs to be shown in new positions in outer ring\n i = iCurr\n arcGenerator.outerRadius(radius)\n arcGenerator.innerRadius(midRadius)\n }\n } else {\n if (arc.deleted) {\n i = iCurr\n arcGenerator.outerRadius(innerRadius)\n arcGenerator.innerRadius(innerRadius)\n } else {\n i = iCurr\n arcGenerator.outerRadius(radius)\n arcGenerator.innerRadius(innerRadius)\n }\n }\n }\n\n if (trans === 3) {\n if (arc.inserted) {\n // Shown inserted arcs in inner ring\n i = iCurr\n arcGenerator.outerRadius(d3.interpolate(midRadius, radius)(t))\n arcGenerator.innerRadius(innerRadius)\n } else if (!arc.deleted) {\n // Existing arcs to be shown in new positions in outer ring\n i = iCurr\n arcGenerator.outerRadius(radius)\n arcGenerator.innerRadius(d3.interpolate(midRadius, innerRadius)(t))\n } else {\n // Deletions - do nothing\n i = iCurr\n }\n }\n _this._current = i(0)\n return arcGenerator(i(t))\n }\n }\n\n function centroidTween(a) {\n const i = d3.interpolate(this._current, a)\n this._current = i(0)\n return function(t) {\n const gen = a.data.set && a.data.set===2 ? arcGeneratorLables2 : arcGeneratorLables\n //console.log(i(t))\n return `translate(${gen.centroid(i(t))})`\n }\n }\n\n let svgPie, gPie\n if (svg.select('.brc-chart-pie').size()) {\n svgPie = svgChart.select('.brc-chart-pie')\n gPie = svgPie.select('g')\n } else {\n svgPie = svgChart.append('svg').classed('brc-chart-pie', true)\n .attr('width', 2 * radius)\n .attr('height', 2 * radius)\n .style('overflow', 'visible')\n gPie = svgPie.append('g')\n .attr('transform', `translate(${radius} ${radius})`)\n\n gPie.append('image')\n .classed('brc-item-image', true)\n .classed('brc-item-image-hide', true)\n .attr('width', imageWidth)\n }\n\n // Remove those paths that have been 'deleted'\n // This because in our transition, we never actually remove\n // arcs. Best done here because of better handling of\n // interrupted transitions\n gPie.selectAll(\"path[data-deleted='true']\").remove()\n\n // map to data\n const uPie =gPie.selectAll('path')\n .data(arcsComb, d => d.data.name)\n\n const ePie = uPie.enter()\n .append('path')\n .attr('id', (d) => `pie-${gen.safeId(d.data.name)}`)\n .attr('stroke', 'white')\n .style('stroke-width', `${strokeWidth}px`)\n .style('opacity', 1)\n .attr('fill', d => d.data.colour)\n .each(function(d) { this._current = d })\n\n addEventHandlers(svg, ePie, true, interactivity, dataPrev, imageWidth, callback)\n const mPie = ePie.merge(uPie)\n // Mark paths corresponding to deleted arcs as\n // deleted so that they can be removed before next \n // transition\n mPie.attr('data-deleted', arc => arc.deleted)\n\n let trans\n let transDuration = duration\n \n // Transition 1\n trans = mPie.transition()\n .duration(duration)\n .attrTween('d', function (arc) {\n return arcTween(arc, this, 1, radius, innerRadius, innerRadius2)\n })\n\n // Transition 2 \n if (dataDeleted.length || dataInserted.length) {\n trans = trans.transition()\n .duration(duration)\n .attrTween('d', function (arc) {\n return arcTween(arc, this, 2, radius, innerRadius, innerRadius2)\n })\n transDuration += duration\n }\n\n // Transition 3\n if (dataInserted.length && dataRetained.length) {\n trans = trans.transition()\n .duration(duration)\n .attrTween('d', function (arc) {\n return arcTween(arc, this, 3, radius, innerRadius, innerRadius2)\n })\n transDuration += duration\n }\n\n // Because we always retain deleted items in order\n // to make smooth transitions, the D3 exit selection\n // is never populated. Instead we have to remove\n // invisible deleted DOM items (SVG paths) ourselves after \n // the last transition to avoid messing up the transition\n // next time the data changes.\n //uPie.exit().remove() // there is no exit selection \n trans.on(\"end\", function () {\n // Be careful about doing anything in here in case transition interrupted\n //if (arc.deleted) {\n //d3.select(this).remove()\n //}\n //block = false\n })\n\n if (label) {\n\n //const arcsNew = d3.pie().value(d => d.number).sortValues(fnSort)(dataNew) \n //console.log(arcsNew)\n const data1 = dataNew.filter((d) => !d.set || d.set===1)\n const data2 = dataNew.filter((d) => d.set && d.set===2)\n\n const arcs1 = d3.pie().value(d => d.number).sortValues(fnSort)(data1)\n const arcs2 = d3.pie().value(d => d.number).sortValues(fnSort)(data2)\n const arcsNew = [...arcs1, ...arcs2]\n\n const total1 = data1.reduce((t, c) => {return t + c.number}, 0)\n const total2 = data2.reduce((t, c) => {return t + c.number}, 0)\n\n const uPieLabels = gPie.selectAll('.labelsPie')\n .data(arcsNew, d => d.data.name)\n \n const ePieLabels = uPieLabels.enter()\n .append('text')\n .attr('id', (d) => `label-${gen.safeId(d.data.name)}`)\n .attr(\"class\", \"labelsPie\")\n .style('text-anchor', 'middle')\n .style('font-size', labelFontSize)\n .style('fill', labelColour)\n\n addEventHandlers(svg, ePieLabels, true, interactivity, dataPrev, imageWidth, callback)\n\n ePieLabels.merge(uPieLabels)\n .text(d => {\n if (label ==='value') {\n return d.data.number\n } else {\n\n let total = total1\n if (d.data.set && d.data.set===2) {\n total = total2\n }\n\n if (Number.isNaN(d.data.number) || total === 0) {\n return ''\n } else {\n let l = Math.round(d.data.number / total * 100)\n // if (l === 0) {\n // l = Math.ceil(d.data.number / total * 1000)/10\n // }\n return `${l}%`\n }\n }\n })\n .attr('opacity', 0)\n .transition()\n .duration(transDuration)\n .attrTween('transform', centroidTween)\n .transition()\n .duration(0)\n .attr('opacity', d => {\n let total = total1\n if (d.data.set && d.data.set===2) {\n total = total2\n }\n if (Math.round(d.data.number / total * 100) === 0) {\n return 0\n } else {\n return 1\n }\n })\n uPieLabels.exit()\n .remove()\n\n const uPieLabelsHighlight = gPie.selectAll('.labelsPieHighlight')\n .data(arcsNew, d => d.data.name)\n \n const ePieLabelsHighlight = uPieLabelsHighlight.enter()\n .append('text')\n .attr('id', (d) => `label-highlight-${gen.safeId(d.data.name)}`)\n .classed('labelsPieHighlight', true)\n .classed('brc-lowlight', true)\n .style('text-anchor', 'middle')\n .style('font-size', labelFontSize)\n .style('fill', labelColour)\n\n addEventHandlers(svg, ePieLabelsHighlight, true, interactivity, dataPrev, imageWidth, callback)\n\n ePieLabelsHighlight.merge(uPieLabelsHighlight)\n .text(d => {\n if (label ==='value') {\n return d.data.number\n } else {\n let total = total1\n if (d.data.set && d.data.set===2) {\n total = total2\n }\n\n if (Number.isNaN(d.data.number) || total === 0) {\n return ''\n } else {\n let l = Math.round(d.data.number / total * 1000)/10\n return label ==='pervalue' ? `${l}% (${d.data.number})` : `${l}%`\n }\n }\n })\n .attr('transform', d => {\n const gen = d.data.set && d.data.set===2 ? arcGeneratorLables2 : arcGeneratorLables\n return `translate(${gen.centroid(d)})`\n })\n uPieLabelsHighlight.exit()\n .remove()\n }\n\n return dataPrev\n}","import * as gen from '../general'\nimport { addEventHandlers} from './highlightitem'\n\nexport function makeLegend (data, svg, svgChart, legendWidth, labelFontSize, legendSwatchSize, legendSwatchGap, legendTitle, legendTitle2, legendTitleFontSize, duration, interactivity, dataPrev, imageWidth, callback) {\n\n let svgLegend\n if (svg.select('.brc-chart-legend').size()) {\n svgLegend = svgChart.select('.brc-chart-legend')\n } else {\n svgLegend = svgChart.append('svg').classed('brc-chart-legend', true)\n .attr('overflow', 'auto')\n }\n\n // Constants relating to legendTexts\n const legendTitleHeight = legendTitle ? textHeight(legendTitleFontSize) : 0\n const legendTitleGap = legendTitle ? legendSwatchGap : 0\n const legendTitleHeight2 = legendTitle2 ? textHeight(legendTitleFontSize) : 0\n const legendTitleGap2 = legendTitle2 ? legendSwatchGap : 0\n\n // Legend swatches\n const uLegendSwatch = svgLegend.selectAll('.legendSwatch')\n .data(data, d => d.name)\n\n const durationUpdate = uLegendSwatch.nodes().length ? duration : 0\n const durationExit = uLegendSwatch.exit().nodes().length ? duration : 0\n\n const eLegendSwatch = uLegendSwatch.enter()\n .append('rect')\n .attr('id', (d) => `swatch-${gen.safeId(d.name)}`)\n .classed('legendSwatch', true)\n .attr('y', (d, i) => {\n let titleHeight;\n if (!d.set || d.set===1) {\n titleHeight = legendTitleHeight + legendTitleGap\n } else {\n titleHeight = legendTitleHeight + legendTitleGap + legendTitleHeight2 + legendTitleGap2\n }\n return titleHeight + i * (legendSwatchSize + legendSwatchGap)\n })\n .attr('width', legendSwatchSize)\n .attr('height', legendSwatchSize)\n .style('fill', d => d.colour)\n .attr('opacity', 0)\n\n addEventHandlers(svg, eLegendSwatch, false, interactivity, dataPrev, imageWidth, callback)\n\n eLegendSwatch.transition()\n .delay(durationExit + durationUpdate)\n .duration(duration)\n .attr('opacity', 1)\n\n uLegendSwatch\n .transition()\n .delay(durationExit)\n .duration(duration)\n .attr('y', (d, i) => {\n let titleHeight;\n if (!d.set || d.set===1) {\n titleHeight = legendTitleHeight + legendTitleGap\n } else {\n titleHeight = legendTitleHeight + legendTitleGap + legendTitleHeight2 + legendTitleGap2\n }\n return titleHeight + i * (legendSwatchSize + legendSwatchGap)\n })\n .attr('opacity', 1)\n \n uLegendSwatch.exit()\n .transition()\n .duration(duration)\n .attr('opacity', 0)\n .remove()\n\n // Legend text\n const uLegendText = svgLegend.selectAll('.legendText')\n .data(data, d => d.name)\n\n const legendTextHeight = textHeight(labelFontSize)\n\n const eLegendText = uLegendText.enter()\n .append('text')\n .text(d => d.name)\n .attr('alignment-baseline', 'middle')\n .attr('id', (d) => `legend-${gen.safeId(d.name)}`)\n .classed('legendText', true)\n .attr('x', () => legendSwatchSize + legendSwatchGap)\n .attr('y', (d, i) => {\n let titleHeight;\n if (!d.set || d.set===1) {\n titleHeight = legendTitleHeight + legendTitleGap\n } else {\n titleHeight = legendTitleHeight + legendTitleGap + legendTitleHeight2 + legendTitleGap2\n }\n return titleHeight + (i + 1) * (legendSwatchSize + legendSwatchGap) - (legendSwatchSize / 2) - (legendTextHeight / 3)\n })\n .style('font-size', labelFontSize)\n .attr('opacity', 0)\n\n addEventHandlers(svg, eLegendText, false, dataPrev, imageWidth, callback)\n\n eLegendText.transition()\n .delay(durationExit + durationUpdate)\n .duration(duration)\n .attr('opacity', 1)\n\n uLegendText\n .transition()\n .delay(durationExit)\n .duration(duration)\n .attr('y', (d, i) => {\n let titleHeight;\n if (!d.set || d.set===1) {\n titleHeight = legendTitleHeight + legendTitleGap\n } else {\n titleHeight = legendTitleHeight + legendTitleGap + legendTitleHeight2 + legendTitleGap2\n }\n return titleHeight + (i + 1) * (legendSwatchSize + legendSwatchGap) - (legendSwatchSize / 2) - (legendTextHeight / 3)\n })\n .attr('opacity', 1)\n \n uLegendText.exit()\n .transition()\n .duration(duration)\n .attr('opacity', 0)\n .remove()\n\n // Legend titles\n const legendTitles = []\n if (legendTitle) legendTitles.push(legendTitle)\n if (legendTitle2) legendTitles.push(legendTitle2)\n\n const uLegendTitle = svgLegend.selectAll('.legendTitle')\n .data(legendTitles, d => d)\n\n const eLegendTitle = uLegendTitle.enter()\n .append('text')\n .text(d => d)\n .attr('id', (d) => `legend-title-${gen.safeId(d)}`)\n .classed('legendTitle', true)\n .attr('y', (d, i) => {\n if (i===0) {\n return legendTitleHeight\n } else {\n const dataSet1Length = data.filter(d => !d.set || d.set === 1).length\n return 2 * legendTitleHeight + legendTitleGap + dataSet1Length * (legendSwatchSize + legendSwatchGap)\n }\n })\n .style('font-size', legendTitleFontSize)\n .attr('opacity', 0)\n\n eLegendTitle.transition()\n .delay(durationExit + durationUpdate)\n .duration(duration)\n .attr('opacity', 1)\n\n uLegendTitle\n .transition()\n .delay(durationExit)\n .duration(duration)\n //.attr('y', (d, i) => i * (legendTitleFontSize + legendTitleGap))\n .attr('y', (d, i) => {\n if (i===0) {\n return legendTitleHeight\n } else {\n const dataSet1Length = data.filter(d => !d.set || d.set === 1).length\n return 2 * legendTitleHeight + legendTitleGap + dataSet1Length * (legendSwatchSize + legendSwatchGap)\n }\n })\n .attr('opacity', 1)\n \n uLegendTitle.exit()\n .transition()\n .duration(duration)\n .attr('opacity', 0)\n .remove()\n\n //Legend size\n svgLegend.attr(\"width\", legendWidth)\n const legendHeight = legendTitleHeight + legendTitleGap + legendTitleHeight2 + legendTitleGap2 + data.length * (legendSwatchSize + legendSwatchGap) - legendSwatchGap\n svgLegend.attr(\"height\", legendHeight > 0 ? legendHeight : 0)\n\n // Helper functions\n function textHeight(fontSize) {\n const dummyText = svgLegend.append('text').attr('opacity', 0).style('font-size', fontSize).text('Dummy')\n let textHeight = dummyText.node().getBBox().height\n dummyText.remove()\n return textHeight\n }\n}","import * as d3 from 'd3'\nimport * as gen from '../general'\n\nexport function addEventHandlers(sel, prop, interactivity, svgChart) {\n sel\n .on(\"mouseover\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d[prop], true, svgChart)\n }\n })\n .on(\"mouseout\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d[prop], false, svgChart)\n }\n })\n .on(\"click\", function(d) {\n if (interactivity === 'mouseclick') {\n highlightItem(d[prop], true, svgChart)\n d3.event.stopPropagation()\n }\n })\n}\n\nexport function highlightItem(id, highlight, svgChart) {\n\n svgChart.selectAll('.phen-metric path')\n .classed('lowlight', highlight)\n\n svgChart.selectAll(`.phen-metric-${id} path`)\n .classed('lowlight', false)\n\n svgChart.selectAll(`.phen-metric path`)\n .classed('highlight', false)\n\n if (id) {\n svgChart.selectAll(`.phen-metric-${id} path`)\n .classed('highlight', highlight)\n }\n\n svgChart.selectAll('.phen-metric rect')\n .classed('lowlight', highlight)\n\n svgChart.selectAll(`.phen-metric-${id} rect`)\n .classed('lowlight', false)\n\n svgChart.selectAll(`.phen-metric rect`)\n .classed('highlight', false)\n\n if (id) {\n svgChart.selectAll(`.phen-metric-${id} rect`)\n .classed('highlight', highlight)\n }\n \n svgChart.selectAll('.brc-legend-item')\n .classed('lowlight', highlight)\n\n if (id) {\n svgChart.selectAll(`.brc-legend-item-${id}`)\n .classed('lowlight', false)\n }\n\n if (id) {\n svgChart.selectAll(`.brc-legend-item-${id}`)\n .classed('highlight', highlight)\n } else {\n svgChart.selectAll(`.brc-legend-item`)\n .classed('highlight', false)\n }\n}","import * as d3 from 'd3'\nimport { month2day, safeId, xAxisMonthNoText, xAxisMonthText, transPromise } from '../general'\nimport { addEventHandlers} from './highlightitem'\n\nexport function makePhen (taxon, taxa, data, metricsin, svgChart, width, height, \n ytype, spread, axisTop, axisBottom, axisLeft, axisRight, monthLineWidth, bands, lines,\n style, stacked, duration, margin, showTaxonLabel, taxonLabelFontSize, taxonLabelItalics,\n axisLabelFontSize, axisLeftLabel, interactivity, pTrans, monthFontSize, font\n) {\n\n // Examine the first record to see if week or month is specified for period\n let period\n if (data.length === 0 || 'week' in data[0]) {\n period = 'week'\n } else {\n period = 'month'\n }\n\n // Reverse the metrics if this is a stacked display\n const metrics = stacked ? [...metricsin].reverse() : [...metricsin]\n\n // Pre-process data.\n // Filter to named taxon and sort in week/month order\n // Add max value to each.\n const dataFiltered = data.filter(d => d.taxon === taxon)\n .filter(d => period === 'week' ? d[period] < 53 : d[period] < 13)\n .sort((a, b) => (a[period] > b[period]) ? 1 : -1)\n\n const metricData = [] \n const stackOffsets = new Array(period === 'week' ? 52 : 12).fill(0) \n\n metrics.forEach(m => {\n let total = dataFiltered.reduce((a, d) => a + d[m.prop], 0)\n let max = Math.max(...dataFiltered.map(d => d[m.prop]))\n let maxProportion = Math.max(...dataFiltered.map(d => d[m.prop]/total))\n\n // If there are no data for this metric, then reset values\n // The metric will also be marked as no data so that it can\n // be styled as required.\n if (isNaN(total)) {\n total = max = maxProportion = 0\n }\n\n let points = dataFiltered.map(d => {\n return {\n n: total ? d[m.prop] : 0,\n period: d[period],\n id: `${safeId(m.label)}-${d[period]}`,\n }\n })\n\n // If the style is areas, then ensure that there is a point \n // for every week or month.\n if (style === 'areas') {\n const maxPeriod = period === 'week' ? 52 : 12\n const pointsPlus = []\n for (let p = 1; p <= maxPeriod; p++) {\n const match = points.find(p1 => p1.period === p)\n if (typeof(match) !== 'undefined') {\n pointsPlus.push(match)\n } else {\n pointsPlus.push({\n n: 0,\n period: p,\n id: `${safeId(m.label)}-${p}`,\n })\n }\n }\n points = pointsPlus\n }\n\n // The closure array is a small array of points which can\n // be used, in conjunction with the main points, to make\n // a properly enclosed polygon that drops open sides down\n // to the x axis.\n let closure=[]\n if (points.length) {\n if (points[points.length-1].n > 0) {\n closure.push({n: 0, period: points[points.length-1].period})\n }\n if (points[0].n > 0) {\n closure.push({n: 0, period: points[0].period})\n }\n }\n\n metricData.push({\n id: safeId(m.label),\n colour: m.colour,\n strokeWidth: m.strokeWidth,\n fill: m.fill ? m.fill : 'none',\n max: max,\n maxProportion: maxProportion,\n total: total,\n points: points,\n stackOffsets: [...stackOffsets],\n closure: closure,\n hasData: total ? true : false\n })\n\n // If stacked display updated the stackOffsets array\n if (stacked) {\n points.forEach(d => stackOffsets[d.period-1] += d.n)\n }\n })\n\n // Set the maximum value for the y axis\n let yMax\n if (ytype === 'normalized') {\n yMax = 1\n } else if (ytype === 'proportion') {\n yMax = Math.max(...metricData.map(d => {\n if (isNaN(d.maxProportion)) {\n return 0\n } else {\n return d.maxProportion\n }\n }))\n } else if (stacked) {\n yMax = Math.max(...stackOffsets.filter(d => d))\n } else {\n yMax = Math.max(...metricData.map(d => d.max))\n if (yMax < 5 && !spread && axisLeft === 'tick') yMax = 5\n }\n \n // Calculate spread metrics\n let maxMetricHeight = height\n let topProp = 0\n let spreadHeight = 0\n\n if (spread && metricData.length > 1) {\n const maxProp = 1.8\n let valMax0, valMax1\n if (ytype === 'normalized') {\n valMax0 = metricData[0].hasData ? 1 : 0\n valMax1 = metricData[1].hasData ? 1 : 0\n } else if(ytype === 'proportion') {\n valMax0 = metricData[0].maxProportion\n valMax1 = metricData[1].maxProportion\n } else {\n valMax0 = metricData[0].max\n valMax1 = metricData[1].max\n }\n const h1Prop = maxProp * valMax0 / yMax\n const h2Prop = maxProp * valMax1 / yMax\n topProp = Math.max(h1Prop, h2Prop-1)\n spreadHeight = height / (0.5 + metricData.length-1 + topProp)\n maxMetricHeight = maxProp * spreadHeight\n }\n\n // Value scales and related data and functions\n function periodToDay(p) {\n if (period === 'week') {\n if (style === 'bars') {\n return (p-1)*7\n } else {\n // style is lines\n return (p-1)*7 + 3.5\n }\n } else {\n // period === month\n if (style === 'bars') {\n return month2day[p-1]\n } else {\n // style is lines\n return month2day[p-1] + ((month2day[p] - month2day[p-1]) / 2)\n }\n }\n }\n function periodToWidth(p) {\n if (period === 'week') {\n return xScale(7) - xScale(0) - 1\n } else {\n return xScale(month2day[p]) - xScale(month2day[p-1]) - 1\n }\n }\n const xScale = d3.scaleLinear().domain([0, 366]).range([0, width])\n const yScale = d3.scaleLinear().domain([0, yMax]).range([maxMetricHeight, 0])\n // sScale is for the y axis for spread displays\n const ysDomain = ['']\n const ysRange = [0]\n if (metrics.length){\n for (let i=0; i xScale(periodToDay(d.period)))\n .y(d => height - maxMetricHeight + yScale(d.n))\n // Line generator without curves\n const lineNotCurved = d3.line()\n .x(d => xScale(periodToDay(d.period)))\n .y(d => height - maxMetricHeight + yScale(d.n))\n\n // Create or get the relevant chart svg\n let init, svgPhen1, gPhen1\n if (taxa.length === 1 && svgChart.selectAll('.brc-chart-phen1').size() === 1) {\n svgPhen1 = svgChart.select('.brc-chart-phen1')\n gPhen1 = svgPhen1.select('.brc-chart-phen1-g')\n init = false\n } else if (svgChart.select(`#${safeId(taxon)}`).size()) {\n svgPhen1 = svgChart.select(`#${safeId(taxon)}`)\n gPhen1 = svgPhen1.select('.brc-chart-phen1-g')\n init = false\n } else {\n svgPhen1 = svgChart.append('svg')\n .classed('brc-chart-phen1', true)\n .attr('id', safeId(taxon))\n .style('overflow', 'visible')\n gPhen1 = svgPhen1.append('g')\n .classed('brc-chart-phen1-g', true)\n init = true\n }\n\n // Vertical bands and lines\n gPhen1.selectAll(\".brc-chart-month-band\")\n .data(bands, (b, i) => `month-band-${i}`)\n .enter()\n .append(\"rect\")\n .attr(\"class\", `brc-chart-month-band`)\n .style(\"fill\", (d,i) => bands[i])\n .attr(\"y\", 0)\n .attr(\"x\", (d,i) => xScale(month2day[i]) - 1)\n .attr(\"height\", height)\n .attr(\"width\", (d,i) => {\n return xScale(month2day[i+1]) - xScale(month2day[i])\n })\n gPhen1.selectAll(\".brc-chart-month-line\")\n .data(lines, (b, i) => `month-line-${i}`)\n .enter()\n .append(\"rect\")\n .attr(\"class\", `brc-chart-month-line`)\n .style(\"fill\", (d,i) => lines[i])\n .attr(\"y\", 0)\n .attr(\"x\", (d,i) => xScale(month2day[i+1]) - monthLineWidth/2 - 1)\n .attr(\"height\", height)\n .attr(\"width\", monthLineWidth)\n\n // Create/update the graphics for the metrics \n const agroups = gPhen1.selectAll(\"g\")\n .data(metricData, d => d.id)\n \n const egroups = agroups.enter()\n .append(\"g\")\n .attr(\"opacity\", 0)\n .attr(\"class\", d => `phen-metric-${d.id} phen-metric`)\n\n addEventHandlers(egroups, 'id', interactivity, svgChart)\n\n const mgroups = agroups.merge(egroups)\n .classed(`phen-metric-no-data`, d => !d.hasData)\n\n const t = svgChart.transition().duration(duration)\n\n transPromise(mgroups.transition(t)\n .attr('opacity', 1)\n .attr(\"transform\", (d,i) => `translate(0,-${(metricData.length-1-i + 0.5) * spreadHeight})`), pTrans)\n\n const xgroups = agroups.exit()\n\n if (style === 'bars') {\n \n mgroups.each(d => {\n const colour = d.colour\n const max = d.max\n const total = d.total\n const stackOffsets = d.stackOffsets\n\n gPhen1.select(`.phen-metric-${d.id}`).selectAll('rect')\n .data(d.points, d => d.id)\n .join (\n enter => enter.append(\"rect\")\n .attr(\"fill\", colour)\n .attr(\"stroke\", 'white')\n .attr(\"stroke-width\", 1)\n .attr(\"x\", d => xScale(periodToDay(d.period))-1)\n .attr(\"y\", height)\n .attr(\"width\", d => periodToWidth(d.period))\n .attr(\"height\", 0),\n update => update\n // Use call for transitions to avoid breaking the\n // method chain (https://observablehq.com/@d3/selection-join)\n .call(update => transPromise(update.transition(t)\n .attr(\"fill\", colour), pTrans)),\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .attr(\"height\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n .attr(\"y\", d => getBarY(d, max, total, stackOffsets))\n .attr(\"height\", d => getBarHeight(d, max, total)), pTrans))\n })\n } else if (style === 'areas') {\n egroups.append(\"path\")\n .attr(\"class\", 'phen-path-area')\n .attr(\"d\", d => flatPath(d, true))\n } else {\n // style ==='line'\n egroups.append(\"path\")\n .attr(\"class\", 'phen-path-fill')\n .attr(\"d\", d => flatPath(d, true))\n \n egroups.append(\"path\")\n .attr(\"class\", 'phen-path-line')\n .attr(\"d\", d => flatPath(d, false))\n }\n\n // Each phenology line consists of both a line and polygon. This\n // is necessary because if we relied on a single polygon, it is\n // not always possible to confine the line graphics to the part\n // of the polygon which represents the phenology line.\n\n // Important for correct data binding to use select - NOT selectAll\n // in sub-selections (https://bost.ocks.org/mike/selection/#non-grouping)\n transPromise(mgroups.select('.phen-path-line')\n .transition(t)\n .attr(\"d\", d => getPath(d, false))\n .attr(\"stroke\", d => d.colour)\n .attr(\"stroke-width\", d => d.strokeWidth)\n .attr(\"fill\", \"none\"), pTrans)\n\n transPromise(mgroups.select('.phen-path-fill')\n .transition(t)\n .attr(\"d\", d => getPath(d, true))\n .attr(\"fill\", d => d.fill), pTrans)\n\n transPromise(mgroups.select('.phen-path-area')\n .transition(t)\n .attr(\"d\", d => getPath(d, true))\n .attr(\"fill\", d => d.colour), pTrans)\n\n transPromise(xgroups.select('.phen-path-line')\n .transition(t)\n .attr(\"d\", d => flatPath(d, false)), pTrans)\n\n transPromise(xgroups.select('.phen-path-fill')\n .transition(t)\n .attr(\"d\", d => flatPath(d, true)), pTrans)\n\n transPromise(xgroups.select('.phen-path-area')\n .transition(t)\n .attr(\"d\", d => flatPath(d, true)), pTrans)\n\n transPromise(xgroups.transition(t)\n .attr(\"opacity\", 0)\n .remove(), pTrans)\n\n // Path and bar generation helper functions\n function flatPath(d, poly) {\n const lineFn = style === 'areas' ? lineNotCurved : lineCurved\n let flat = lineFn(d.points.map(p => {\n return {\n n: 0,\n period: p.period,\n }\n }))\n if (d.closure.length && poly) {\n flat = `${flat}L${lineNotCurved(d.closure).substring(1)}`\n } \n return flat\n }\n function getPath(d, poly) {\n const lineFn = style === 'areas' ? lineNotCurved : lineCurved\n let lPath\n if (ytype === 'normalized') {\n lPath = lineFn(d.points.map(p => {\n return {\n n: d.max ? p.n/d.max : 0,\n period: p.period,\n }\n }))\n } else if (ytype === 'proportion') {\n lPath = lineFn(d.points.map(p => {\n return {\n n: d.total === 0 ? 0 : p.n/d.total,\n period: p.period,\n }\n }))\n } else if (stacked) {\n const so1 = [...d.stackOffsets]\n const so2 = [...d.stackOffsets]\n d.points.forEach(p => {\n so2[p.period-1]+=p.n\n })\n const p1 = so1.map((n,i) => {return {period: i+1, n: n}})\n const p2 = so2.map((n,i) => {return {period: i+1, n: n}})\n const all = [...p1, ...p2.reverse()]\n lPath = lineFn(all)\n } else {\n lPath = lineFn(d.points)\n }\n // If this is for a poly underneath a line\n // display, close the path \n if (poly && d.closure.length && !stacked) {\n lPath = `${lPath}L${lineNotCurved(d.closure).substring(1)}`\n }\n return lPath\n }\n function getBarHeight(d, max, total) {\n let v\n if (ytype === 'normalized') {\n v = max ? d.n/max : 0\n } else if (ytype === 'proportion') {\n v = total === 0 ? 0 : d.n/total\n } else {\n v = d.n\n }\n return maxMetricHeight - yScale(v)\n }\n\n function getBarY(d, max, total, stackOffsets) {\n let barY\n if (ytype === 'normalized') {\n barY = yScale(max ? d.n/max : 0)\n } else if (ytype === 'proportion') {\n barY = yScale(total === 0 ? 0 : d.n/total)\n } else if (stacked) {\n barY = yScale(stackOffsets[d.period-1] + d.n)\n } else {\n barY = yScale(d.n)\n }\n return barY + (height - maxMetricHeight)\n }\n\n if (init) {\n // Constants for positioning\n const axisLeftPadX = margin.left ? margin.left : 0\n const axisRightPadX = margin.right ? margin.right : 0\n const axisBottomPadY = margin.bottom ? margin.bottom : 0\n const axisTopPadY = margin.top ? margin.top : 0\n\n // Taxon title\n if (showTaxonLabel) {\n const taxonLabel = svgPhen1\n .append('text')\n .classed('brc-chart-phen1-label', true)\n .text(taxon)\n .style('font-size', taxonLabelFontSize)\n .style('font-style', taxonLabelItalics ? 'italic' : '')\n\n const labelHeight = taxonLabel.node().getBBox().height\n taxonLabel.attr(\"transform\", `translate(${axisLeftPadX}, ${labelHeight})`)\n }\n \n // Size SVG\n svgPhen1\n .attr('width', width + axisLeftPadX + axisRightPadX)\n //.attr('height', height + axisBottomPadY + axisTopPadY)\n .attr('height', height + axisBottomPadY + axisTopPadY)\n\n // Position chart\n gPhen1.attr(\"transform\", `translate(${axisLeftPadX},${axisTopPadY})`)\n\n // Create axes and position within SVG\n const leftYaxisTrans = `translate(${axisLeftPadX},${axisTopPadY})`\n const rightYaxisTrans = `translate(${axisLeftPadX + width}, ${axisTopPadY})`\n const topXaxisTrans = `translate(${axisLeftPadX},${axisTopPadY})`\n //const bottomXaxisTrans = `translate(${axisLeftPadX},${axisTopPadY + height})`\n const leftYaxisLabelTrans = `translate(${axisLabelFontSize},${axisTopPadY + height/2}) rotate(270)`\n \n // Create axes and position within SVG\n if (yAxis) {\n const gYaxis = svgPhen1.append(\"g\")\n .attr(\"class\", \"y-axis\")\n gYaxis.attr(\"transform\", leftYaxisTrans)\n }\n if (xAxis1 && xAxis2) {\n // const gXaxis = svgPhen1.append(\"g\")\n // .attr(\"class\", \"x axis\")\n // .call(xAxis)\n\n const gXaxis1 = svgPhen1.append(\"g\")\n .attr(\"class\", \"x axis\")\n .style('font-size', monthFontSize)\n .call(xAxis1)\n\n const gXaxis2 = svgPhen1.append(\"g\")\n .attr(\"class\", \"x axis\")\n .style('font-size', monthFontSize)\n .call(xAxis2)\n\n // gXaxis.selectAll(\".tick text\")\n // .style(\"text-anchor\", \"start\")\n // .attr(\"x\", 6)\n // .attr(\"y\", 6)\n\n // gXaxis.attr(\"transform\", bottomXaxisTrans)\n\n gXaxis2.selectAll(\".tick text\")\n .style(\"text-anchor\", \"middle\")\n\n gXaxis1.attr(\"transform\", `translate(${axisLeftPadX},${height + axisTopPadY})`)\n gXaxis2.attr(\"transform\", `translate(${axisLeftPadX},${height + axisTopPadY})`)\n }\n if (tAxis) {\n const gTaxis = svgPhen1.append(\"g\")\n .call(tAxis)\n gTaxis.attr(\"transform\", topXaxisTrans)\n }\n if (rAxis) {\n const gRaxis = svgPhen1.append(\"g\")\n .call(rAxis)\n gRaxis.attr(\"transform\", rightYaxisTrans)\n }\n\n const tYaxisLeftLabel = svgPhen1.append(\"text\")\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisLeftLabel) \n tYaxisLeftLabel.attr(\"transform\", leftYaxisLabelTrans)\n\n } else if (taxa.length === 1) {\n // Update taxon label\n if (showTaxonLabel) {\n svgPhen1.select('.brc-chart-phen1-label').text(taxon)\n }\n }\n\n if (yAxis) {\n transPromise(svgPhen1.select(\".y-axis\")\n .transition(t)\n .call(yAxis), pTrans)\n }\n\n return svgPhen1\n}","import * as d3 from 'd3'\n\nexport function preProcessMetrics (metrics) {\n // Look for 'fading' colour in taxa and colour appropriately \n // in fading shades of grey.\n let iFading = 0\n let metricsPlus = metrics.map(m => {\n let iFade, strokeWidth\n if (m.colour === 'fading') {\n iFade = ++iFading\n strokeWidth = 1\n } else {\n strokeWidth = m.strokeWidth\n }\n return {\n prop: m.prop,\n label: m.label,\n colour: m.colour,\n fill: m.fill,\n fading: iFade,\n strokeWidth: strokeWidth\n }\n }).reverse()\n\n const grey = d3.scaleLinear()\n .range(['#808080', '#E0E0E0'])\n .domain([1, iFading])\n\n metricsPlus.forEach(m => {\n if (m.fading) {\n m.colour = grey(m.fading)\n }\n })\n\n return metricsPlus\n}","import * as gen from '../general'\nimport { addEventHandlers} from './highlightitem'\n\nexport function makeLegend (legendWidth, metrics, svgChart, legendFontSize, headPad, interactivity, style) {\n \n const swatchSize = 20\n const swatchFact = 1.3\n\n // Loop through all the legend elements and work out their\n // positions based on swatch size, item lable text size and\n // legend width.\n const metricsReversed = gen.cloneData(metrics).reverse()\n\n let rows = 0\n let lineWidth = -swatchSize\n metricsReversed.forEach(m => {\n const tmpText = svgChart.append('text') //.style('display', 'none')\n .text(m.label)\n .style('font-size', legendFontSize)\n\n const widthText = tmpText.node().getBBox().width\n tmpText.remove()\n\n if (lineWidth + swatchSize + swatchSize * swatchFact + widthText > legendWidth) {\n ++rows\n lineWidth = -swatchSize\n }\n m.x = lineWidth + swatchSize + headPad\n m.y = rows * swatchSize * swatchFact\n\n lineWidth = lineWidth + swatchSize + swatchSize * swatchFact + widthText\n })\n\n const ls = svgChart.selectAll('.brc-legend-item-rect')\n .data(metricsReversed, m => gen.safeId(m.label))\n .join(enter => {\n const rect = enter.append(\"rect\")\n .attr(\"class\", m=> `brc-legend-item brc-legend-item-rect brc-legend-item-${gen.safeId(m.label)}`)\n .classed('brc-legend-item-line', style === 'lines')\n .attr('width', swatchSize)\n .attr('height', style === 'lines' ? 2 : swatchSize)\n return rect\n })\n .attr('x', m => m.x)\n .attr('y', m => {\n if (style === 'bars' || style === 'areas'){\n return m.y - swatchSize/5\n } else {\n return m.y + swatchSize/2\n }\n })\n .attr('fill', m => m.colour)\n\n const lt = svgChart.selectAll('.brc-legend-item-text')\n .data(metricsReversed, m => gen.safeId(m.label))\n .join(enter => {\n const text = enter.append(\"text\")\n .attr(\"class\", m=> `brc-legend-item brc-legend-item-text brc-legend-item-${gen.safeId(m.label)}`)\n .text(m => m.label)\n .style('font-size', legendFontSize)\n return text\n })\n .attr('x', m => m.x + swatchSize * swatchFact)\n .attr('y', m => m.y + legendFontSize * 1)\n\n addEventHandlers(ls, 'label', interactivity, svgChart)\n addEventHandlers(lt, 'label', interactivity, svgChart)\n\n return swatchSize * swatchFact * (rows + 1)\n}","// README (updated 15/07/2022)\n// This chart is designed to show a trend line with a confidence band (data)\n// and, optionally, mean points with confidence bars (means).\n// Although many features of it have been generalised, it was\n// initially constructed to facilitate the BSBI atlas website and is\n// currently undocumented.\n\nimport * as d3 from 'd3'\nimport { xAxisYear } from '../general'\n\nexport function trend2({\n // Default options in here\n selector = 'body',\n elid = 'trend2-chart',\n width = 300,\n height = 200,\n margin = {left: 35, right: 0, top: 20, bottom: 5},\n expand = false,\n axisLabelFontSize = 10,\n axisLeft = 'tick',\n axisBottom = 'tick',\n axisRight = '',\n axisTop = '',\n axisLeftLabel = '',\n duration = 1000,\n yearMin = null,\n yearMax = null,\n yMin = null,\n yMax = null,\n adjust = true,\n ylines = [],\n data = [],\n means = [],\n style = {}\n} = {}) {\n\n // Ensure default style properties are present\n style.vStroke = style.vStroke ? style.vStroke : 'black'\n style.vStrokeWidth = style.vStrokeWidth ? style.vStrokeWidth : 2\n style.cStroke = style.cStroke ? style.cStroke : 'black'\n style.cStrokeWidth = style.cStrokeWidth ? style.cStrokeWidth : 1\n style.cFill = style.cFill ? style.cFill : 'silver'\n style.mFill = style.mFill ? style.mFill : 'white'\n style.mRad = style.mRad ? style.mRad : 2\n style.mStroke = style.mStroke ? style.mStroke : 'black'\n style.mStrokeWidth = style.mStrokeWidth ? style.mStrokeWidth : 1\n style.sdStroke = style.sdStroke ? style.sdStroke : 'black'\n style.sdStrokeWidth = style.sdStrokeWidth ? style.sdStrokeWidth : 1\n\n const updateChart = makeChart(yMin, yMax, adjust, yearMin, yearMax, data, means, ylines, selector, elid, width, height, margin, expand, axisLeft, axisRight, axisTop, axisBottom, axisLeftLabel, axisLabelFontSize, duration, style)\n\n return {\n updateChart: updateChart\n }\n}\n\nfunction maxYear(data) {\n return Math.max(...data.map(d => d.year))\n}\nfunction minYear(data) {\n return Math.min(...data.map(d => d.year))\n}\nfunction maxY(data, means) {\n const dMax = Math.max(...data.map(d => d.upper ? d.upper : d.value))\n const mMax = Math.max(...means.map(d => d.mean + d.sd))\n return Math.max(dMax, mMax)\n}\nfunction minY(data, means) {\n const dMin = Math.min(...data.map(d => d.lower ? d.lower : d.value))\n const mMin = Math.min(...means.map(d => d.mean - d.sd))\n return Math.min(dMin, mMin)\n}\n\nfunction makeChart(yMin, yMax, adjust, yearMin, yearMax, data, means, ylines, selector, elid, width, height, margin, expand, axisLeft, axisRight, axisTop, axisBottom, axisLeftLabel, axisLabelFontSize, duration, style) {\n\n const svgWidth = width + margin.left + margin.right\n const svgHeight = height + margin.top + margin.bottom\n\n // Append the chart svg\n const svgTrend = d3.select(`${selector}`)\n .append('svg')\n .attr('id', elid)\n\n // Size the chart svg\n if (expand) {\n svgTrend.attr(\"viewBox\", `0 0 ${svgWidth} ${svgHeight}`)\n } else {\n svgTrend.attr(\"width\", svgWidth)\n svgTrend.attr(\"height\", svgHeight)\n }\n\n // Axis labels\n if (axisLeftLabel) {\n svgTrend.append(\"text\")\n .attr(\"transform\", `translate(${axisLabelFontSize},${margin.top + height/2}) rotate(270)`)\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisLeftLabel) \n }\n\n // Create axes and position within SVG\n let tAxis, bAxis, lAxis, rAxis\n if (axisLeft === 'on' || axisLeft === 'tick') {\n lAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n }\n if (axisBottom === 'on' || axisBottom === 'tick') {\n bAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top + height})`)\n }\n if (axisTop === 'on') {\n tAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n }\n if (axisRight === 'on') {\n rAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left + width}, ${margin.top})`)\n }\n\n // Create g element for chart elements\n const gChart1 = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n const gChart2 = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n\n // Create the API function for updating chart\n const updateChart = makeUpdateChart(svgTrend, width, height, tAxis, bAxis, lAxis, rAxis, axisBottom, duration, gChart1, gChart2, style)\n \n // Update the chart with current data\n updateChart(data, means, yearMin, yearMax, yMin, yMax, adjust, ylines)\n\n // Return the api\n return updateChart\n}\n\nfunction makeUpdateChart(\n svg,\n width,\n height,\n tAxis,\n bAxis,\n lAxis,\n rAxis,\n axisBottom,\n duration,\n gChart1,\n gChart2,\n style\n) {\n return (data, means, yearMin, yearMax, yMin, yMax, adjust, ylines) => {\n\n // Set ylines to empty array if not set\n if (!ylines) {\n ylines = []\n }\n \n // Data\n const dataWork = data.sort((a, b) => (a.year > b.year) ? 1 : -1)\n\n // Adjustments\n let yMinBuff, yMaxBuff\n if (yMin !== null && yMax !== null && typeof yMin !== 'undefined' && typeof yMax !== 'undefined') { \n yMinBuff = yMin\n yMaxBuff = yMax\n if (adjust) {\n if (minY(dataWork, means) < yMinBuff) yMinBuff = minY(dataWork, means)\n if (maxY(dataWork, means) > yMaxBuff) yMaxBuff = maxY(dataWork, means)\n // Add a margin to min/max values\n yMinBuff = yMinBuff - (yMaxBuff - yMinBuff) / 50\n yMaxBuff = yMaxBuff + (yMaxBuff - yMinBuff) / 50\n }\n\n } else {\n yMinBuff = minY(dataWork, means)\n yMaxBuff = maxY(dataWork, means)\n // Add a margin to min/max values\n yMinBuff = yMinBuff - (yMaxBuff - yMinBuff) / 50\n yMaxBuff = yMaxBuff + (yMaxBuff - yMinBuff) / 50\n }\n\n const yearMinData = minYear(dataWork)\n const yearMaxData = maxYear(dataWork)\n let yearMinBuff, yearMaxBuff\n if (yearMin) {\n yearMinBuff = yearMin\n } else {\n yearMinBuff = Math.floor(yearMinData - (yearMaxData - yearMinData) / 50)\n }\n if (yearMax) {\n yearMaxBuff = yearMax\n } else {\n yearMaxBuff = Math.floor(yearMaxData + (yearMaxData - yearMinData) / 50)\n }\n\n // Value scales\n const xScale = d3.scaleLinear().domain([yearMinBuff, yearMaxBuff]).range([0, width])\n const yScale = d3.scaleLinear().domain([yMinBuff, yMaxBuff]).range([height, 0])\n\n // Generate axes\n if (tAxis) {\n tAxis\n .call(d3.axisTop()\n .scale(xScale) // Actual scale doesn't matter, but needs one\n .tickValues([])\n .tickSizeOuter(0))\n }\n if (bAxis) {\n bAxis.transition().duration(duration)\n .call(xAxisYear(width, axisBottom === 'tick', yearMinBuff, yearMaxBuff, false))\n }\n if (lAxis) {\n lAxis.transition().duration(duration)\n .call(d3.axisLeft()\n .scale(yScale)\n .ticks(5))\n }\n if (rAxis) {\n rAxis\n .call(d3.axisRight()\n .scale(yScale)\n .tickValues([])\n .tickSizeOuter(0))\n }\n\n // Line path generator\n const linePath = d3.line()\n //.curve(d3.curveMonotoneX)\n .x(d => xScale(d.y))\n .y(d => yScale(d.v))\n\n // Main data line\n const vData = data.map(p => {return {y: p.year, v: p.value}})\n d3Line(gChart2, linePath, duration, vData, 'valueLine', style.vStroke, style.vStrokeWidth, 'none')\n\n // Upper confidence line\n const uData = data.map(p => {return {y: p.year, v: p.upper}})\n d3Line(gChart2, linePath, duration, uData, 'upperLine', style.cStroke, style.cStrokeWidth, 'none')\n\n // Upper confidence line\n const lData = data.map(p => {return {y: p.year, v: p.lower}})\n d3Line(gChart2, linePath, duration, lData, 'lowerLine', style.cStroke, style.cStrokeWidth, 'none')\n\n // Confidence polygon\n lData.sort((a,b) => b.y - a.y) // Reverse order of lData\n const pData = [...uData, ...lData]\n d3Line(gChart1, linePath, duration, pData, 'confidence', 'none', 0, style.cFill)\n\n // Mean and SDs\n const tMeans = means.map(p => {\n return {\n x: xScale(p.year),\n y: yScale(p.mean),\n bar: linePath([{y: p.year, v: p.mean-p.sd}, {y: p.year, v: p.mean+p.sd}])\n }\n })\n d3MeanSd(gChart2, linePath, duration, tMeans, style)\n\n // Add path to ylines and generate\n ylines.forEach(l => {\n l.path = linePath([{y: yearMinBuff, v: l.y}, {y: yearMaxBuff, v: l.y}])\n })\n const tYlines = ylines.filter(l => l.y >= yMinBuff && l.y <= yMaxBuff)\n d3Yline(gChart1, tYlines, duration)\n }\n}\n\nfunction d3Line(gChart, linePath, duration, data, lClass, stroke, strokeWidth, fill) {\n\n let aData\n if (data.length === 0) {\n aData = data\n } else {\n aData = [data]\n }\n\n gChart.selectAll(`.${lClass}`)\n .data(aData)\n .join(\n enter => enter.append('path')\n .attr(\"d\", d => linePath(d))\n .attr('class', lClass)\n .style('fill', fill)\n .style('stroke', stroke)\n .style('stroke-width', strokeWidth)\n .attr(\"opacity\", 0),\n update => update,\n exit => exit\n .transition().duration(duration)\n .style(\"opacity\", 0)\n .remove()\n )\n // Join returns merged enter and update selection\n .transition().duration(duration)\n .attr(\"d\", d => linePath(d))\n .attr(\"opacity\", 1)\n}\n\nfunction d3MeanSd(gChart, linePath, duration, means, style) {\n\n //console.log(means)\n //console.log(style)\n\n // SDs\n gChart.selectAll('.sds')\n .data(means)\n .join(\n enter => enter.append('path')\n .attr('d', d => d.bar)\n .attr('class', 'sds')\n .style('stroke', style.sdStroke)\n .style('stroke-width', style.sdStrokeWidth)\n .style('opacity', 0),\n update => update,\n exit => exit\n .transition().duration(duration)\n .style(\"opacity\", 0)\n .remove()\n )\n // Join returns merged enter and update selection\n .transition().duration(duration)\n .attr('d', d => d.bar)\n .style('opacity', 1)\n\n // Means\n gChart.selectAll('.means')\n .data(means)\n .join(\n enter => enter.append('circle')\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .attr('r', style.mRad)\n .attr('class', 'means')\n .style('fill', style.mFill)\n .style('stroke', style.mStroke)\n .style('stroke-width', style.mStrokeWidth)\n .style('opacity', 0),\n update => update,\n exit => exit\n .transition().duration(duration)\n .style(\"opacity\", 0)\n .remove()\n )\n // Join returns merged enter and update selection\n .transition().duration(duration)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .style('opacity', 1)\n}\n\nfunction d3Yline(gChart, ylines, duration) {\n\n // Horizontal y lines\n gChart.selectAll('.ylines')\n .data(ylines)\n .join(\n enter => enter.append('path')\n .attr('d', d => d.path)\n .attr('class', 'ylines')\n .style('stroke', d => d.stroke)\n .style('stroke-width', d => d.strokeWidth)\n .style('opacity', 0),\n update => update,\n exit => exit\n .transition().duration(duration)\n .style(\"opacity\", 0)\n .remove()\n )\n // Join returns merged enter and update selection\n .transition().duration(duration)\n .attr('d', d => d.path)\n .style('opacity', 1)\n}\n","// README (updated 15/07/2022)\n// This chart is designed to shown multiple gradient lines (data)\n// and, optionally, mean points with confidence bars (means).\n// Although many features of it have been generalised, it was\n// initially constructed to facilitate the BSBI atlas website and is\n// currently undocumented.\n\nimport * as d3 from 'd3'\nimport { xAxisYear } from '../general'\n\nexport function trend3({\n // Default options in here\n selector = 'body',\n elid = 'trend3-chart',\n width = 300,\n height = 200,\n margin = {left: 35, right: 0, top: 20, bottom: 5},\n expand = false,\n axisLabelFontSize = 10,\n axisLeft = 'tick',\n axisBottom = 'tick',\n axisRight = '',\n axisTop = '',\n axisLeftLabel = '',\n duration = 1000,\n yearMin = 1949,\n yearMax = 2019,\n yMin = null,\n yMax = null,\n adjust = false,\n ylines = [],\n data = [],\n means = [],\n style = {}\n} = {}) {\n\n // Ensure default style properties are present\n style.vStroke = style.vStroke ? style.vStroke : 'black'\n style.vStrokeWidth = style.vStrokeWidth ? style.vStrokeWidth : 2\n style.vOpacity = style.vOpacity ? style.vOpacity : 0.1\n style.mFill = style.mFill ? style.mFill : 'white'\n style.mRad = style.mRad ? style.mRad : 2\n style.mStroke = style.mStroke ? style.mStroke : 'black'\n style.mStrokeWidth = style.mStrokeWidth ? style.mStrokeWidth : 1\n style.sdStroke = style.sdStroke ? style.sdStroke : 'black'\n style.sdStrokeWidth = style.sdStrokeWidth ? style.sdStrokeWidth : 1\n\n const updateChart = makeChart(yMin, yMax, adjust, yearMin, yearMax, data, means, ylines, selector, elid, width, height, margin, expand, axisLeft, axisRight, axisTop, axisBottom, axisLeftLabel, axisLabelFontSize, duration, style)\n\n return {\n updateChart: updateChart\n }\n}\n\nfunction maxY(data, means) {\n const dMax = Math.max(...data.map(d => Math.max(d[0].v, d[1].v)))\n const mMax = Math.max(...means.map(d => d.mean + d.sd))\n return Math.max(dMax, mMax)\n}\nfunction minY(data, means) {\n const dMin = Math.min(...data.map(d => Math.min(d[0].v, d[1].v)))\n const mMin = Math.min(...means.map(d => d.mean - d.sd))\n return Math.min(dMin, mMin)\n}\n\nfunction makeChart(yMin, yMax, adjust, yearMin, yearMax, data, means, ylines, selector, elid, width, height, margin, expand, axisLeft, axisRight, axisTop, axisBottom, axisLeftLabel, axisLabelFontSize, duration, style) {\n\n const svgWidth = width + margin.left + margin.right\n const svgHeight = height + margin.top + margin.bottom\n\n // Append the chart svg\n const svgTrend = d3.select(`${selector}`)\n .append('svg')\n .attr('id', elid)\n\n // Size the chart svg\n if (expand) {\n svgTrend.attr(\"viewBox\", `0 0 ${svgWidth} ${svgHeight}`)\n } else {\n svgTrend.attr(\"width\", svgWidth)\n svgTrend.attr(\"height\", svgHeight)\n }\n\n // Axis labels\n if (axisLeftLabel) {\n svgTrend.append(\"text\")\n .attr(\"transform\", `translate(${axisLabelFontSize},${margin.top + height/2}) rotate(270)`)\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisLeftLabel) \n }\n\n // Create axes and position within SVG\n let tAxis, bAxis, lAxis, rAxis\n if (axisLeft === 'on' || axisLeft === 'tick') {\n lAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n }\n if (axisBottom === 'on' || axisBottom === 'tick') {\n bAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top + height})`)\n }\n if (axisTop === 'on') {\n tAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n }\n if (axisRight === 'on') {\n rAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left + width}, ${margin.top})`)\n }\n\n // Create g element for chart elements\n const gChart1 = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n const gChart2 = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n\n // Create the API function for updating chart\n const updateChart = makeUpdateChart(svgTrend, width, height, tAxis, bAxis, lAxis, rAxis, axisBottom, duration, gChart1, gChart2, style)\n \n // Update the chart with current data\n updateChart(data, means, yearMin, yearMax, yMin, yMax, adjust, ylines)\n\n // Return the api\n return updateChart\n}\n\nfunction makeUpdateChart(\n svg,\n width,\n height,\n tAxis,\n bAxis,\n lAxis,\n rAxis,\n axisBottom,\n duration,\n gChart1,\n gChart2,\n style\n) {\n return (data, means, yearMin, yearMax, yMin, yMax, adjust, ylines) => {\n\n // Set ylines to empty array if not set\n if (!ylines) {\n ylines = []\n }\n\n // Convert data from an array of gradients and intercepts to an array \n // of arrays of two point lines\n const dataWork = data.map(d => {\n const yStart = d.gradient * yearMin + d.intercept\n const yEnd = d.gradient * yearMax + d.intercept\n return [{y: yearMin, v: yStart}, {y: yearMax, v: yEnd}]\n })\n\n // Adjustments\n let yMinBuff, yMaxBuff\n if (yMin !== null && yMax !== null && typeof yMin !== 'undefined' && typeof yMax !== 'undefined') { \n yMinBuff = yMin\n yMaxBuff = yMax\n if (adjust) {\n if (minY(dataWork, means) < yMinBuff) yMinBuff = minY(dataWork, means)\n if (maxY(dataWork, means) > yMaxBuff) yMaxBuff = maxY(dataWork, means)\n // Add a margin to min/max values\n yMinBuff = yMinBuff - (yMaxBuff - yMinBuff) / 50\n yMaxBuff = yMaxBuff + (yMaxBuff - yMinBuff) / 50\n }\n } else {\n yMinBuff = minY(dataWork, means)\n yMaxBuff = maxY(dataWork, means)\n // Add a margin to min/max values\n yMinBuff = yMinBuff - (yMaxBuff - yMinBuff) / 50\n yMaxBuff = yMaxBuff + (yMaxBuff - yMinBuff) / 50\n }\n const yearMinBuff = yearMin\n const yearMaxBuff = yearMax\n\n // Value scales\n const xScale = d3.scaleLinear().domain([yearMinBuff, yearMaxBuff]).range([0, width])\n const yScale = d3.scaleLinear().domain([yMinBuff, yMaxBuff]).range([height, 0])\n\n // Generate axes\n if (tAxis) {\n tAxis\n .call(d3.axisTop()\n .scale(xScale) // Actual scale doesn't matter, but needs one\n .tickValues([])\n .tickSizeOuter(0))\n }\n if (bAxis) {\n bAxis.transition().duration(duration)\n .call(xAxisYear(width, axisBottom === 'tick', yearMinBuff, yearMaxBuff, false))\n }\n if (lAxis) {\n lAxis.transition().duration(duration)\n .call(d3.axisLeft()\n .scale(yScale)\n .ticks(5))\n }\n if (rAxis) {\n rAxis\n .call(d3.axisRight()\n .scale(yScale)\n .tickValues([])\n .tickSizeOuter(0))\n }\n\n // Line path generator\n const linePath = d3.line()\n //.curve(d3.curveMonotoneX)\n .x(d => xScale(d.y))\n .y(d => yScale(d.v))\n\n // Main data line\n d3Line(gChart2, linePath, duration, dataWork, style)\n\n // Mean and SDs\n const tMeans = means.map(p => {\n return {\n x: xScale(p.year),\n y: yScale(p.mean),\n bar: linePath([{y: p.year, v: p.mean-p.sd}, {y: p.year, v: p.mean+p.sd}]),\n barStart: linePath([{y: p.year, v: yMinBuff}, {y: p.year, v: yMinBuff}])\n }\n })\n d3MeanSd(gChart2, linePath, yScale(yMinBuff), duration, tMeans, style)\n\n // Add path to ylines and generate\n ylines.forEach(l => {\n l.path = linePath([{y: yearMinBuff, v: l.y}, {y: yearMaxBuff, v: l.y}])\n })\n const tYlines = ylines.filter(l => l.y >= yMinBuff && l.y <= yMaxBuff)\n d3Yline(gChart1, tYlines, duration)\n }\n}\n\nfunction d3Line(gChart, linePath, duration, data, style) {\n\n gChart.selectAll('.trend-line')\n .data(data)\n .join(\n enter => enter.append('path')\n .attr(\"d\", d => linePath(d))\n .attr('class', 'trend-line')\n .style('stroke', style.vStroke)\n .style('stroke-width', style.vStrokeWidth)\n .attr(\"opacity\", 0),\n update => update,\n exit => exit\n .transition().duration(duration)\n .style(\"opacity\", 0)\n .remove()\n )\n // Join returns merged enter and update selection\n .transition().duration(duration)\n .attr(\"d\", d => linePath(d))\n .attr(\"opacity\", style.vOpacity)\n}\n\nfunction d3MeanSd(gChart, linePath, yMinBuff, duration, means, style) {\n\n // SDs\n gChart.selectAll('.sds')\n .data(means)\n .join(\n enter => enter.append('path')\n .attr('d', d => d.bar)\n .attr('class', 'sds')\n .style('stroke', style.sdStroke)\n .style('stroke-width', style.sdStrokeWidth)\n .style('opacity', 0),\n update => update,\n exit => exit\n .transition().duration(duration)\n .style(\"opacity\", 0)\n .remove()\n )\n // Join returns merged enter and update selection\n .transition().duration(duration)\n .attr('d', d => d.bar)\n .style('opacity', 1)\n\n // Means\n gChart.selectAll('.means')\n .data(means)\n .join(\n enter => enter.append('circle')\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .attr('r', style.mRad)\n .attr('class', 'means')\n .style('fill', style.mFill)\n .style('stroke', style.mStroke)\n .style('stroke-width', style.mStrokeWidth)\n .style('opacity', 0),\n update => update,\n exit => exit\n .transition().duration(duration)\n .style(\"opacity\", 0)\n .remove()\n )\n // Join returns merged enter and update selection\n .transition().duration(duration)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .style('opacity', 1)\n}\n\nfunction d3Yline(gChart, ylines, duration) {\n\n // Horizontal y lines\n gChart.selectAll('.ylines')\n .data(ylines)\n .join(\n enter => enter.append('path')\n .attr('d', d => d.path)\n .attr('class', 'ylines')\n .style('stroke', d => d.stroke)\n .style('stroke-width', d => d.strokeWidth)\n .style('opacity', 0),\n update => update,\n exit => exit\n .transition().duration(duration)\n .style(\"opacity\", 0)\n .remove()\n )\n // Join returns merged enter and update selection\n .transition().duration(duration)\n .attr('d', d => d.path)\n .style('opacity', 1)\n}","// README (updated 15/07/2022)\n// This chart is designed to show one or more density plots\n// derived from frequency data (data)\n// It was created to facilitate the BSBI 2020 Atlas website and\n// although some features have been generalised, it contains some\n// code that is specific for that use case.\n// It is currently undocumented.\n\nimport * as d3 from 'd3'\nimport { transPromise, saveChartImage } from '../general'\n\nexport function density({\n // Default options in here\n selector = 'body',\n elid = 'density-chart',\n width = 300,\n height = 200,\n margin = {left: 35, right: 0, top: 20, bottom: 5},\n expand = false,\n axisLabelFontSize = 10,\n axisLeft = 'tick',\n axisBottom = 'tick',\n axisRight = '',\n axisTop = '',\n axisLeftLabel = '',\n axisBottomLabel = '',\n duration = 1000,\n xMin = null,\n xMax = null,\n ylines = [],\n xlines = [],\n data = [],\n styles = [],\n scaleHeight = false\n} = {}) {\n\n const updateChart = makeChart(xMin, xMax, data, xlines, ylines, selector, elid, width, height, margin, expand, axisLeft, axisRight, axisTop, axisBottom, axisLeftLabel, axisBottomLabel, axisLabelFontSize, duration, styles, scaleHeight)\n\n return {\n updateChart: updateChart,\n saveImage: (asSvg, filename) => {\n console.log('generate density image')\n saveChartImage(d3.select(`#${elid}`), expand, asSvg, filename) \n }\n }\n}\n\nfunction maxX(data) {\n return Math.max(...data.map(ds => Math.max(...ds.map(d => d.slope))))\n}\nfunction minX(data) {\n return Math.min(...data.map(ds => Math.min(...ds.map(d => d.slope))))\n}\n\nfunction makeChart(xMin, xMax, data, xlines, ylines, selector, elid, width, height, margin, expand, axisLeft, axisRight, axisTop, axisBottom, axisLeftLabel, axisBottomLabel, axisLabelFontSize, duration, styles, scaleHeight) {\n\n const svgWidth = width + margin.left + margin.right\n const svgHeight = height + margin.top + margin.bottom\n\n // Append the chart svg\n const svgDensity = d3.select(`${selector}`)\n .append('svg')\n .attr('id', elid)\n .style('font-family', 'sans-serif')\n\n // Size the chart svg\n if (expand) {\n svgDensity.attr(\"viewBox\", `0 0 ${svgWidth} ${svgHeight}`)\n } else {\n svgDensity.attr(\"width\", svgWidth)\n svgDensity.attr(\"height\", svgHeight)\n }\n\n // Axis labels\n if (axisLeftLabel) {\n svgDensity.append(\"text\")\n .attr(\"transform\", `translate(${axisLabelFontSize},${margin.top + height/2}) rotate(270)`)\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisLeftLabel) \n }\n if (axisBottomLabel) {\n svgDensity.append(\"text\")\n .attr(\"transform\", `translate(${margin.left + width/2},${margin.top + height + margin.bottom - axisLabelFontSize})`)\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisBottomLabel) \n }\n\n // Create axes and position within SVG\n let tAxis, bAxis, lAxis, rAxis\n if (axisLeft === 'on' || axisLeft === 'tick') {\n lAxis = svgDensity.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`) \n }\n if (axisBottom === 'on' || axisBottom === 'tick') {\n bAxis = svgDensity.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top + height})`)\n }\n if (axisTop === 'on') {\n tAxis = svgDensity.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n }\n if (axisRight === 'on') {\n rAxis = svgDensity.append(\"g\")\n .attr(\"transform\", `translate(${margin.left + width}, ${margin.top})`)\n }\n\n // Create g element for chart elements\n const gChart1 = svgDensity.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n const gChart2 = svgDensity.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n\n // Create the API function for updating chart\n const updateChart = makeUpdateChart(svgDensity, width, height, tAxis, bAxis, lAxis, rAxis, axisBottom, duration, gChart1, gChart2, styles)\n \n // Update the chart with current data\n updateChart(data, xMin, xMax, xlines, ylines, scaleHeight)\n\n // Return the api\n return updateChart\n}\n\nfunction makeUpdateChart(\n svg,\n width,\n height,\n tAxis,\n bAxis,\n lAxis,\n rAxis,\n axisBottom,\n duration,\n gChart1,\n gChart2,\n styles,\n) {\n return (data, xMin, xMax, xlines, ylines, scaleHeight) => {\n\n // d3 transition object\n const t = svg.transition()\n .duration(duration)\n let pTrans = []\n\n // Set ylines and xlines to empty array if not set\n if (!xlines) xlines = []\n if (!ylines) ylines = []\n \n // Data - do any data pre-processing here\n const dataWork = data\n \n // Adjustments - do any min/max adjustments here\n let xMinBuff, xMaxBuff\n if (xMin !== null && xMax !== null && typeof xMin !== 'undefined' && typeof xMax !== 'undefined') { \n xMinBuff = xMin\n xMaxBuff = xMax\n } else {\n xMinBuff = minX(dataWork)\n xMaxBuff = maxX(dataWork)\n // Add a margin to min/max values\n xMinBuff = xMinBuff - (xMaxBuff - xMinBuff) / 50\n xMaxBuff = xMaxBuff + (xMaxBuff - xMinBuff) / 50\n }\n\n // X value scale\n const xScale = d3.scaleLinear().domain([xMinBuff, xMaxBuff]).range([0, width])\n\n // !!!!!!!!!!!!!!!! Non-general custom scale required for BSBI atlas\n const custScale = d3.scaleOrdinal()\n .domain(['', '- -', '-', '0', '+', '+ +', ''])\n .range([xScale(xMinBuff), xScale(-0.004 - (-0.004-xMinBuff)/2), xScale(-0.0025), xScale(0), xScale(0.0025), xScale(0.004 + (xMaxBuff-0.004)/2), xScale(xMaxBuff)])\n\n // Compute kernel density estimation\n const bandwidths = dataWork.map(ds => {\n const dataMin = Math.min(...ds.map(d => d.slope))\n const dataMax = Math.max(...ds.map(d => d.slope))\n const workMin = xMin === null ? dataMin : dataMin < xMin ? xMin : dataMin\n const workMax = xMax === null ? dataMax : dataMax > xMax ? xMax : dataMax\n return (workMax-workMin)/8\n })\n //console.log('bandwidths', bandwidths)\n\n const densities = dataWork.map((ds,i) => {\n //const ticks = xScale.ticks(100)\n const incr = (xMaxBuff-xMinBuff)/99\n const ticks = d3.range(xMinBuff, xMaxBuff+incr, incr) // For transitions need consistent number of ticks\n const kde = kernelDensityEstimator(kernelEpanechnikov(bandwidths[i]), ticks)\n return kde(ds.map(d => d.slope))\n })\n\n // For some reason which I don't understand, x values can occassionally overshoot\n // xMaxBuff - so correct.\n densities.forEach(ds => {\n ds.forEach(d => {\n if (d[0] > xMaxBuff) d[0] = xMaxBuff\n })\n })\n\n // Y value scales must be done on the density values\n // Add a buffer of 1/50 range so y value doesn't go to top of chart\n // Create an overall scale.\n const maxDensity = Math.max(...densities.map(ds => Math.max(...ds.map(d => d[1]))))\n const yScale = d3.scaleLinear().domain([0, maxDensity * 1.02]).range([height, 0])\n // Create a Y scale for each density curve. If the value of scaleHeight is set to false,\n // these scales will all be identical, but if set to true then they will differ so that\n // maximum value of each curve achieves the same height.\n const yScales = densities.map(ds => {\n if (scaleHeight) {\n const maxDensity = Math.max(...ds.map(d => d[1]))\n return d3.scaleLinear().domain([0, maxDensity * 1.02]).range([height, 0])\n } else {\n return yScale\n }\n })\n\n // Generate axes\n if (tAxis) {\n transPromise(tAxis.transition(t)\n .call(d3.axisTop()\n .scale(data.length ? custScale : xScale) \n .tickSize([0])\n .ticks(5)\n .tickSizeOuter(0)), pTrans)\n }\n\n if (bAxis) {\n transPromise(bAxis.transition(t)\n .call(d3.axisBottom()\n .scale(xScale)\n .ticks(5)), pTrans)\n }\n if (lAxis) {\n transPromise(lAxis.transition(t)\n .call(d3.axisLeft()\n .scale(yScale)\n .tickValues([])), pTrans)\n //.ticks(5))\n }\n if (rAxis) {\n rAxis\n .call(d3.axisRight()\n .scale(yScale)\n .tickValues([])\n .tickSizeOuter(0))\n }\n\n // Line path generator\n const linePath = d3.line()\n .curve(d3.curveMonotoneX)\n .x(d => xScale(d[0]))\n .y(d => yScale(d[1]))\n\n const linePaths = yScales.map(s => {\n return d3.line()\n .curve(d3.curveMonotoneX)\n .x(d => xScale(d[0]))\n .y(d => s(d[1]))\n })\n\n if (dataWork.length) {\n // console.log('dataWork', dataWork[0])\n // console.log('densities', densities[0])\n // console.log('linepath', linePath(densities[0]))\n }\n \n // Generate density lines\n pTrans = [...pTrans, ...d3Density(gChart1, densities, linePaths, styles, t)]\n\n // Add path to ylines and generate\n ylines.forEach(l => {\n l.path = linePath([[xMinBuff, l.y], [xMaxBuff, l.y]])\n })\n pTrans = [...pTrans, ...d3Line(gChart1, ylines, 'ylines', t)]\n\n // Add path to xlines and generate\n xlines.forEach(l => {\n l.path = linePath([[l.x, 0], [l.x, maxDensity * 1.02]])\n })\n pTrans = [...pTrans, ...d3Line(gChart1, xlines, 'xlines', t)]\n\n return Promise.allSettled(pTrans)\n }\n}\n\nfunction d3Density(gChart, data, linePaths, styles, t) {\n\n const pTrans = []\n\n gChart.selectAll(`.density-line`)\n .data(data)\n .join(\n enter => enter.append('path')\n .attr(\"opacity\", 0)\n .attr(\"d\", (d,i) => linePaths[i](d))\n .attr(\"class\", \"density-line\")\n .style('fill', 'none')\n .style('stroke', (d,i) => getStyle(styles, i).stroke)\n .style('stroke-width', (d,i) => getStyle(styles, i).strokeWidth),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr(\"opacity\", 1)\n .attr(\"d\", (d,i) => linePaths[i](d)), pTrans))\n\n return pTrans\n}\n\nfunction d3Line(gChart, lines, lineClass, t) {\n\n const pTrans = []\n\n // Horizontal y lines\n gChart.selectAll(`.${lineClass}`)\n .data(lines)\n .join(\n enter => enter.append('path')\n .attr('d', d => d.path)\n .attr('class', lineClass)\n .style('stroke', d => d.stroke)\n .style('stroke-width', d => d.strokeWidth)\n .style ('stroke-dasharray', d => d.strokeDasharray)\n .style('opacity', 0),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr('d', d => d.path)\n .style('opacity', 1), pTrans))\n\n return pTrans\n}\n\n// Function to compute density\nfunction kernelDensityEstimator(kernel, X) {\n return function(V) {\n return X.map(function(x) {\n return [x, d3.mean(V, function(v) { return kernel(x - v) })]\n })\n }\n}\nfunction kernelEpanechnikov(k) {\n return function(v) {\n return Math.abs(v /= k) <= 1 ? 0.75 * (1 - v * v) / k : 0\n }\n}\n\nfunction getStyle(styles, i) {\n let style\n if (styles[i]) {\n style = styles[i]\n } else {\n style = {}\n }\n // Default styles\n style.stroke = style.stroke ? style.stroke : 'black'\n style.strokeWidth = style.strokeWidth ? style.strokeWidth : 1\n style.strokeDasharray = style.strokeDasharray ? style.strokeDasharray : '1'\n\n return style\n}","// README (updated 15/07/2022)\n// This chart is designed to display a bar chart.\n// Although initiallly created to facilitate the BSBI altas website,\n// it has been generalised and can be used in other contexts\n// It is currently undocumented.\n\nimport * as d3 from 'd3'\nimport { transPromise, saveChartImage } from '../general'\n\nexport function bar({\n // Default options in here\n selector = 'body',\n elid = 'bar-chart',\n width = 300,\n height = 200,\n padding = 0,\n barHeightOnZero = 0,\n margin = {left: 35, right: 0, top: 20, bottom: 5},\n expand = false,\n axisLabelFontSize = 10,\n axisLeft = 'tick',\n axisBottom = 'tick',\n axisRight = '',\n axisTop = '',\n axisLeftLabel = '',\n duration = 1000,\n data = [],\n labelPosition = {}\n} = {}) {\n\n const updateChart = makeChart(data, labelPosition, selector, elid, width, height, padding, barHeightOnZero, margin, expand, axisLeft, axisRight, axisTop, axisBottom, axisLeftLabel, axisLabelFontSize, duration)\n\n return {\n updateChart: updateChart,\n saveImage: (asSvg, filename) => {\n console.log('generate density image')\n saveChartImage(d3.select(`#${elid}`), expand, asSvg, filename) \n }\n }\n}\n\nfunction makeChart(data, labelPosition, selector, elid, width, height, padding, barHeightOnZero, margin, expand, axisLeft, axisRight, axisTop, axisBottom, axisLeftLabel, axisLabelFontSize, duration) {\n\n const svgWidth = width + margin.left + margin.right\n const svgHeight = height + margin.top + margin.bottom\n\n // Append the chart svg\n const svgTrend = d3.select(`${selector}`)\n .append('svg')\n .attr('id', elid)\n .style('font-family', 'sans-serif')\n\n // Size the chart svg\n if (expand) {\n svgTrend.attr(\"viewBox\", `0 0 ${svgWidth} ${svgHeight}`)\n } else {\n svgTrend.attr(\"width\", svgWidth)\n svgTrend.attr(\"height\", svgHeight)\n }\n\n // Axis labels\n if (axisLeftLabel) {\n svgTrend.append(\"text\")\n .attr(\"transform\", `translate(${axisLabelFontSize},${margin.top + height/2}) rotate(270)`)\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisLeftLabel) \n }\n\n // Create axes and position within SVG\n let tAxis, bAxis, lAxis, rAxis\n if (axisLeft === 'on' || axisLeft === 'tick') {\n lAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n }\n if (axisBottom === 'on' || axisBottom === 'tick') {\n bAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top + height})`)\n }\n if (axisTop === 'on') {\n tAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n }\n if (axisRight === 'on') {\n rAxis = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left + width}, ${margin.top})`)\n }\n\n // Create g element for chart elements\n const gChart = svgTrend.append(\"g\")\n .attr(\"transform\", `translate(${margin.left},${margin.top})`)\n\n // Create the API function for updating chart\n const updateChart = makeUpdateChart(labelPosition, svgTrend, width, height, padding, barHeightOnZero, tAxis, bAxis, lAxis, rAxis, axisBottom, duration, gChart)\n \n // Update the chart with current data\n updateChart(data)\n\n // Return the api\n return updateChart\n}\n\nfunction makeUpdateChart(\n labelPosition,\n svg,\n width,\n height,\n padding,\n barHeightOnZero,\n tAxis,\n bAxis,\n lAxis,\n rAxis,\n axisBottom,\n duration,\n gChart\n) {\n\n return (data) => {\n\n // d3 transition object\n const t = svg.transition()\n .duration(duration)\n let pTrans = []\n\n // Value scales\n let yMaxBuff = Math.max(...data.map(d => d.value))\n const xScale = d3.scaleLinear().domain([0, 1]).range([0, width])\n const yScale = d3.scaleLinear().domain([yMaxBuff, 0]).range([0, height])\n const xScaleBottom = d3.scaleBand()\n .domain(data.map(d => d.label)) \n .range([0, width]) \n .padding([padding]) \n\n // Generate axes\n if (tAxis) {\n tAxis\n .call(d3.axisTop()\n .scale(xScale) // Actual scale doesn't matter, but needs one\n .tickValues([])\n .tickSizeOuter(0))\n }\n if (bAxis && axisBottom === 'tick') {\n transPromise(bAxis.transition(t)\n .call(d3.axisBottom()\n .scale(xScaleBottom)\n .tickSizeOuter(0)), pTrans)\n\n const labels = bAxis.selectAll(\"text\")\t\n if (labelPosition[\"text-anchor\"]) labels.style(\"text-anchor\", labelPosition[\"text-anchor\"])\n if (labelPosition[\"dx\"]) labels.attr(\"dx\", labelPosition[\"dx\"])\n if (labelPosition[\"dy\"]) labels.attr(\"dy\", labelPosition[\"dy\"])\n if (labelPosition[\"transform\"]) labels.attr(\"transform\", labelPosition[\"transform\"])\n }\n\n if (bAxis && axisBottom === 'on') {\n transPromise(bAxis.transition(t)\n .call(d3.axisBottom()\n .scale(xScale) // Actual scale doesn't matter, but needs one\n .tickValues([])\n .tickSizeOuter(0)), pTrans)\n }\n if (lAxis) {\n transPromise(lAxis.transition(t)\n .call(d3.axisLeft()\n .scale(yScale)\n .ticks(5)), pTrans)\n }\n if (rAxis) {\n transPromise(rAxis.transition(t)\n .call(d3.axisRight()\n .scale(yScale)\n .tickValues([])\n .tickSizeOuter(0)), pTrans)\n }\n // Bar data\n data.forEach(d => {\n d.x = xScaleBottom(d.label)\n d.y = yScale(d.value)\n d.ye = height\n d.width = xScaleBottom.bandwidth()\n d.height = height - yScale(d.value) ? height - yScale(d.value) : barHeightOnZero\n })\n \n pTrans = [...d3Bars(data, gChart, t), ...pTrans]\n\n return Promise.allSettled(pTrans)\n }\n}\n\nfunction d3Bars(data, gChart, t) {\n\n const pTrans = []\n\n gChart.selectAll(`.bar`)\n .data(data)\n .join(\n enter => enter.append('rect')\n .attr('class', 'bar')\n .style('fill', d => d.fill)\n .style('stroke', d => d.stroke)\n .style('stroke-width', d => d.strokeWidth)\n .style('opacity', 0)\n .attr('x', d => d.x)\n .attr('y', d => d.ye)\n .attr('width', d => d.width)\n .attr('height', 0),\n\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style('opacity', 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .style('opacity', 1)\n .attr('x', d => d.x)\n .attr('y', d => d.y)\n .attr('width', d => d.width)\n .attr('height', d => d.height), pTrans))\n\n gChart.selectAll(`.barLabel`)\n .data(data)\n .join(\n enter => enter.append('text')\n .attr('class', 'barLabel')\n .style('opacity', 0)\n .attr('x', d => d.x)\n .attr('y', d => d.ye)\n .attr('width', d => d.width)\n .attr('height', 0),\n\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style('opacity', 0)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .style('opacity', 1)\n .attr('x', d => d.x)\n .attr('y', d => d.y)\n .attr('width', d => d.width)\n .attr('height', d => d.height), pTrans))\n \n return pTrans\n}","import * as d3 from 'd3'\n\nexport function addEventHandlers(sel, prop, svgChart, interactivity) {\n sel\n .on(\"mouseover\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d[prop], true, svgChart)\n }\n })\n .on(\"mouseout\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d[prop], false, svgChart)\n }\n })\n .on(\"click\", function(d) {\n if (interactivity === 'mouseclick') {\n highlightItem(d[prop], true, svgChart)\n d3.event.stopPropagation()\n }\n })\n}\n\nexport function highlightItem(id, highlight, svgChart) {\n\n svgChart.selectAll('.yearly-graphic')\n .classed('lowlight', false)\n\n if (highlight) {\n svgChart.selectAll('.yearly-graphic')\n .classed('lowlight', true)\n svgChart.selectAll(`.yearly-${id}`)\n .classed('lowlight', false)\n }\n}","import * as d3 from 'd3'\nimport { xAxisYear, safeId, transPromise } from '../general'\nimport { addEventHandlers } from './highlightitem'\n\nexport function makeYearly (\n svgChart,\n taxon,\n taxa,\n data,\n dataPoints,\n dataTrendLines,\n minYear,\n maxYear,\n minYearTrans,\n maxYearTrans,\n minCount,\n maxCount,\n xPadPercent,\n yPadPercent,\n metricsPlus,\n width,\n height,\n axisTop,\n axisBottom,\n showCounts,\n axisLeft,\n yAxisOpts,\n axisRight,\n duration,\n interactivity,\n margin,\n showTaxonLabel,\n taxonLabelFontSize,\n taxonLabelItalics,\n axisLabelFontSize,\n axisLeftLabel,\n axisRightLabel,\n missingValues,\n pTrans\n) {\n // Pre-process data.\n // Filter to named taxon and to min and max year and sort in year order\n // Add max value to each.\n\n const dataFiltered = data\n .filter(d => d.taxon === taxon && d.year >= minYear && d.year <= maxYear)\n .sort((a, b) => (a.year > b.year) ? 1 : -1)\n\n const dataPointsFiltered = dataPoints\n .filter(d => d.taxon === taxon && d.year >= minYear && d.year <= maxYear)\n .sort((a, b) => (a.year > b.year) ? 1 : -1)\n\n // Filter dataTrendLinesFiltered data on taxon and also from an array \n // of gradients and intercepts to an array of arrays of two point lines\n const dataTrendLinesFiltered = dataTrendLines\n .filter(d => d.taxon === taxon)\n .map(d => {\n return {\n taxon: d.taxon,\n colour: d.colour,\n width: d.width,\n opacity: d.opacity,\n y1: d.gradient * minYear + d.intercept,\n y2: d.gradient * maxYear + d.intercept\n }\n })\n\n\n //Set the min and maximum values for the y axis\n const maxMetricCounts = metricsPlus.map(m => Math.max(\n ...dataFiltered.map(d => d[m.prop]),\n ...dataFiltered.filter(d => d[m.bandUpper]).map(d => d[m.bandUpper])\n ))\n\n const maxCountA = maxCount !== null ? [maxCount] : []\n let yMaxCount = Math.max(\n ...maxCountA,\n ...maxMetricCounts,\n ...dataPointsFiltered.map(d => d.y),\n ...dataPointsFiltered.filter(d => d.upper).map(d => d.upper),\n ...dataTrendLinesFiltered.map(d => d.y1),\n ...dataTrendLinesFiltered.map(d => d.y2)\n )\n const minMetricCounts = metricsPlus.map(m => Math.min(\n ...dataFiltered.map(d => d[m.prop]),\n ...dataFiltered.filter(d => d[m.bandLower]).map(d => d[m.bandLower])\n ))\n\n const minCountA = minCount !== null ? [minCount] : []\n let yMinCount = Math.min(\n ...minCountA,\n ...minMetricCounts,\n ...dataPointsFiltered.map(d => d.y),\n ...dataPointsFiltered.filter(d => d.lower).map(d => d.lower),\n ...dataTrendLinesFiltered.map(d => d.y1),\n ...dataTrendLinesFiltered.map(d => d.y2)\n )\n\n if (yAxisOpts.minMax !== null) {\n if (yMaxCount < yAxisOpts.minMax) {\n yMaxCount = yAxisOpts.minMax\n }\n }\n if (yAxisOpts.fixedMin !== null) {\n yMinCount = yAxisOpts.fixedMin\n }\n \n // Value scales\n let years = []\n for (let i = minYear; i <= maxYear; i++) {\n years.push(i)\n }\n\n const xPadding = (maxYear-minYear) * xPadPercent\n const yPadding = (yMaxCount-yMinCount) * yPadPercent\n\n const xScaleBar = d3.scaleBand().domain(years).range([0, width]).paddingInner(0.1)\n const xScaleLine = d3.scaleLinear().domain([minYear - xPadding, maxYear + xPadding]).range([0, width])\n const yScale = d3.scaleLinear().domain([yMinCount - yPadding, yMaxCount + yPadding]).range([height, 0])\n \n // Top axis\n let tAxis\n if (axisTop === 'on') {\n tAxis = d3.axisTop()\n .scale(xScaleLine) // Actual scale doesn't matter, but needs one\n .tickValues([])\n .tickSizeOuter(0)\n }\n\n // Bottom axis\n let bAxis\n if (axisBottom === 'on' || axisBottom === 'tick') {\n bAxis = xAxisYear(width, axisBottom === 'tick', minYear - xPadding, maxYear + xPadding, showCounts === 'bar')\n }\n\n // Left and right axes\n const makeXaxis = (leftRight, axisOpt) => {\n let axis\n const d3axis = leftRight === 'left' ? d3.axisLeft() : d3.axisRight()\n switch(axisOpt) {\n case 'on':\n axis = d3axis.scale(yScale).tickValues([]).tickSizeOuter(0)\n break\n case 'tick':\n axis = d3axis.scale(yScale).ticks(5).tickFormat(d3.format(yAxisOpts.numFormat))\n break\n }\n return axis\n }\n const lAxis = makeXaxis('left', axisLeft)\n const rAxis = makeXaxis('right', axisRight)\n\n // Create or get the relevant chart svg\n let init, svgYearly, gYearly\n\n if (taxa.length === 1 && svgChart.selectAll('.brc-chart-yearly').size() === 1) {\n svgYearly = svgChart.select('.brc-chart-yearly')\n gYearly = svgYearly.select('.brc-chart-yearly-g')\n init = false\n } else if (svgChart.select(`#${safeId(taxon)}`).size()) {\n svgYearly = svgChart.select(`#${safeId(taxon)}`)\n gYearly = svgYearly.select('.brc-chart-yearly-g')\n init = false\n } else {\n svgYearly = svgChart.append('svg')\n .classed('brc-chart-yearly', true)\n .attr('id', safeId(taxon))\n .style('overflow', 'visible')\n .style('font-family', 'sans-serif')\n gYearly = svgYearly.append('g')\n .classed('brc-chart-yearly-g', true)\n init = true\n }\n\n // Line path generator\n const lineCounts = d3.line()\n //.curve(d3.curveMonotoneX) // Interpolating curves can make transitions of polygons iffy\n // because resulting number of points in path is not constant.\n .x(d => xScaleLine(d.year))\n .y(d => yScale(d.n))\n\n let chartLines = []\n let chartBars = []\n let chartBands = []\n let chartPoints = []\n let chartErrorBars = []\n\n metricsPlus.forEach(m => {\n\n // Create a collection of the years in the dataset.\n const dataDict = dataFiltered.reduce((a,d) => {\n a[d.year]=d[m.prop]\n return a\n }, {})\n\n // Construct data structure for line charts.\n if (showCounts === 'line' && isFinite(yMinCount)) {\n\n const pointSets = adjustForTrans(years.map(y => {\n // Replace any missing values (for a given year)\n // with the missing value specified (can be a value\n // or 'bridge' or 'break')\n return {\n year: y,\n n: dataDict[y] ? dataDict[y] : missingValues,\n }\n }))\n pointSets.forEach((points, i) => {\n chartLines.push({\n colour: m.colour,\n opacity: m.opacity,\n strokeWidth: m.strokeWidth,\n type: 'counts',\n prop: m.prop,\n part: i,\n yMin: yMinCount,\n pathEnter: lineCounts(points.map(p => {\n return {\n n: yMinCount,\n year: p.year\n }\n })),\n path: lineCounts(points)\n })\n })\n }\n\n // Construct data structure for confidence band on line charts.\n if (showCounts === 'line' && m.bandUpper && m.bandLower && isFinite(yMinCount)) {\n const ddUpper = dataFiltered.reduce((a,d) => {\n a[d.year]=d[m.bandUpper]\n return a\n }, {})\n const ddLower = dataFiltered.reduce((a,d) => {\n a[d.year]=d[m.bandLower]\n return a\n }, {})\n const upperLine = years.map(y => {\n return {\n year: y,\n n: ddUpper[y] ? ddUpper[y] : missingValues,\n }\n })\n const lowerLine = [...years].map(y => {\n return {\n year: y,\n n: ddLower[y] ? ddLower[y] : missingValues,\n }\n })\n\n const pointsLowerSet = adjustForTrans(lowerLine)\n const pointsUpperSet = adjustForTrans(upperLine)\n for (let i=0; i {\n return {\n n: yMinCount,\n year: p.year\n }\n })\n const pointsUpperEnter = pointsUpper.map(p => {\n return {\n n: yMinCount,\n year: p.year\n }\n })\n\n chartBands.push({\n fill: m.bandFill ? m.bandFill : 'silver',\n stroke: m.bandStroke ? m.bandStroke : 'grey',\n fillOpacity: m.bandOpacity !== undefined ? m.bandOpacity : 0.5,\n strokeOpacity: m.bandStrokeOpacity !== undefined ? m.bandStrokeOpacity : 1,\n strokeWidth: m.bandStrokeWidth !== undefined ? m.bandStrokeWidth : 1,\n type: 'counts',\n prop: m.prop,\n part: i,\n bandPath: lineCounts(pointsBand),\n bandPathEnter: lineCounts(pointsBand.map(p => {\n return {\n n: yMinCount,\n year: p.year\n }\n })),\n bandBorders: [lineCounts(pointsLower), lineCounts(pointsUpper)],\n bandBordersEnter: [lineCounts(pointsLowerEnter), lineCounts(pointsUpperEnter)]\n })\n }\n }\n\n // Construct data structure for bar charts.\n if (showCounts === 'bar') {\n const bars = dataFiltered.map(d => {\n return {\n colour: m.colour,\n opacity: m.opacity,\n type: 'counts',\n prop: m.prop,\n year: d.year,\n n: yScale(d[m.prop]),\n }\n })\n chartBars = [...chartBars, ...bars]\n }\n\n // Construct data structure for points.\n // TODO - if at some point we parameterise display styles\n // for points bars, then it must be specified in here.\n if (m.points) {\n const points = dataFiltered.filter(d => d[m.prop]).map(d => {\n let x\n if (showCounts === 'bar') {\n x = xScaleBar(d.year) + xScaleBar.bandwidth() / 2\n } else {\n x = xScaleLine(d.year)\n }\n return {\n x: x,\n y: yScale(d[m.prop]),\n year: d.year,\n prop: m.prop,\n }\n })\n chartPoints = [...chartPoints, ...points]\n }\n\n // Construct data structure for error bars.\n // TODO - if at some point we parameterise display styles\n // for error bars, then it must be specified in here.\n if (m.errorBarUpper && m.errorBarLower) {\n const errorBars = dataFiltered.map(d => {\n let x\n if (showCounts === 'bar') {\n x = xScaleBar(d.year) + xScaleBar.bandwidth() / 2\n } else {\n x = xScaleLine(d.year)\n }\n return {\n year: d.year,\n pathEnter: `M ${x} ${height} L ${x} ${height}`,\n path: `M ${x} ${yScale(d[m.errorBarLower])} L ${x} ${yScale(d[m.errorBarUpper])}`,\n prop: m.prop,\n }\n })\n chartErrorBars = [...chartErrorBars, ...errorBars]\n } \n })\n\n // Construct data structure for supplementary trend lines.\n // TODO - if at some point we parameterise display styles,\n // then it must be specified in here.\n const chartTrendLineSup = dataTrendLinesFiltered.map(d => {\n // y = mx + c\n let x1, x2\n const minx = minYear - xPadding\n const maxx = maxYear + xPadding\n if (showCounts === 'bar') {\n x1 = xScaleBar(minx)\n x2 = xScaleBar(maxx) + xScaleBar.bandwidth() \n } else {\n x1 = xScaleLine(minx)\n x2 = xScaleLine(maxx)\n }\n return {\n colour: d.colour ? d.colour : 'red',\n width: d.width ? d.width : '1',\n opacity: d.opacity ? d.opacity : '1',\n pathEnter: `M ${x1} ${height} L ${x2} ${height}`,\n path: `M ${x1} ${yScale( d.y1)} L ${x2} ${yScale( d.y2)}`,\n }\n })\n\n // Construct data structure for supplementary points.\n // TODO - if at some point we parameterise display styles,\n // then it must be specified in here.\n const chartPointsSup = dataPointsFiltered.map(d => {\n let x \n // if (showCounts === 'bar') {\n // x = xScaleBar(Math.floor(d.year)) + xScaleBar.bandwidth() * 0.5 +(d.year % 1)\n // } else {\n // x = xScaleLine(d.year)\n // }\n x = xScaleLine(d.year)\n\n return {\n x: x,\n y: yScale(d.y),\n year: d.year\n }\n })\n\n // Construct data structure for supplementary point error bars.\n // TODO - if at some point we parameterise display styles,\n // then it must be specified in here.\n const chartPointsSupErrorBars = dataPointsFiltered.map(d => {\n const x = xScaleLine(d.year)\n return {\n pathEnter: `M ${x} ${height} L ${x} ${height}`,\n path: `M ${x} ${yScale(d.lower)} L ${x} ${yScale(d.upper)}`,\n year: d.year\n }\n })\n\n // d3 transition object\n const t = svgYearly.transition()\n .duration(duration)\n\n // Bars\n gYearly.selectAll(\".yearly-bar\")\n .data(chartBars, d => `bars-${d.prop}-${d.year}`)\n .join(\n enter => enter.append(\"rect\")\n .attr(\"class\", d => `yearly-bar yearly-graphic yearly-${d.prop}`)\n .attr('width', xScaleBar.bandwidth())\n .attr('height', 0)\n .attr('fill', d => d.colour)\n .attr('opacity', 0)\n .attr('y', height)\n .attr('x', d => xScaleBar(d.year)),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .attr('height', 0)\n .attr('y', height)\n .style(\"opacity\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr('y', d => d.n)\n .attr('x', d => xScaleBar(d.year))\n .attr('height', d => height - d.n)\n .attr('width', xScaleBar.bandwidth())\n .attr(\"fill\", d => d.colour)\n .attr(\"opacity\", d => d.opacity), pTrans))\n\n // Bands\n gYearly.selectAll(\".yearly-band\")\n .data(chartBands, d => `band-${d.prop}-${d.part}`)\n .join(\n enter => enter.append(\"path\")\n .attr(\"class\", d => `yearly-band yearly-graphic yearly-${d.prop}`)\n .attr(\"opacity\", 0)\n .attr(\"fill\", d => d.fill)\n .attr(\"stroke\", \"none\")\n .attr(\"d\", d => d.bandPathEnter),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .attr(\"d\", d => d.bandPathEnter)\n .style(\"opacity\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr(\"d\", d => d.bandPath)\n .attr(\"opacity\", d => d.fillOpacity)\n .attr(\"fill\", d => d.fill), pTrans))\n\n\n // Band lines\n for (let iLine=0; iLine<2; iLine++) { \n gYearly.selectAll(`.yearly-band-border-${iLine}`)\n .data(chartBands, d => `band-line-${d.prop}-${iLine}-${d.part}`)\n .join(\n enter => enter.append(\"path\")\n .attr(\"class\", d => `yearly-band-border-${iLine} yearly-graphic yearly-${d.prop}`)\n .attr(\"opacity\", 0)\n .attr(\"fill\",\"none\")\n .attr(\"stroke\", d => d.stroke)\n .attr(\"stroke-width\", d => d.strokeWidth)\n .attr(\"d\", d => d.bandBordersEnter[iLine]),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .attr(\"d\", d => d.bandBordersEnter[iLine])\n .style(\"opacity\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr(\"d\", d => d.bandBorders[iLine])\n .attr(\"opacity\", d => d.strokeOpacity)\n .attr(\"stroke\", d => d.stroke)\n .attr(\"stroke-width\", d => d.strokeWidth), pTrans))\n }\n\n // Main lines\n gYearly.selectAll(\".yearly-line\")\n .data(chartLines, d => `line-${d.prop}-${d.part}`)\n .join(\n enter => enter.append(\"path\")\n .attr(\"class\", d => `yearly-line yearly-graphic yearly-${d.prop}`)\n .attr(\"opacity\", 0)\n .attr(\"fill\", \"none\")\n .attr(\"stroke\", d => d.colour)\n .attr(\"stroke-width\", d => d.strokeWidth)\n .attr(\"d\", d => d.pathEnter),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .attr(\"d\", d => d.pathEnter)\n .style(\"opacity\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr(\"d\", d => d.path)\n .attr(\"opacity\", d => d.opacity)\n .attr(\"stroke\", d => d.colour)\n .attr(\"stroke-width\", d => d.strokeWidth), pTrans))\n\n // Error bars\n gYearly.selectAll('.yearly-error-bars')\n .data(chartErrorBars, d => `error-bars-${d.prop}-${d.year}`)\n .join(\n enter => enter.append('path')\n .attr(\"class\", d => `yearly-error-bars yearly-graphic yearly-${d.prop}`)\n .attr(\"d\", d => d.pathEnter)\n .style('fill', 'none')\n .style('stroke', 'black')\n .style('stroke-width', 1)\n .style('opacity', 0),\n update => update,\n exit => exit.call(exit => transPromise(exit\n .transition(t)\n .style(\"opacity\", 0)\n .attr(\"d\", d => d.pathEnter)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr(\"d\", d => d.path)\n .style('opacity', 1), pTrans))\n\n // Points\n gYearly.selectAll('.yearly-point')\n .data(chartPoints, d => `point-${d.prop}-${d.year}`)\n .join(\n enter => enter.append('circle')\n .attr(\"class\", d => `yearly-point yearly-graphic yearly-${d.prop}`)\n .attr('cx', d => d.x)\n //.attr('cy', d => d.y)\n .attr('cy', height)\n .attr('r', 3)\n .style('fill', 'white')\n .style('stroke', 'black')\n .style('stroke-width', 1)\n .style('opacity', 0),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n .attr('cy', height)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .style('opacity', 1), pTrans))\n\n // Supplementary trend lines\n gYearly.selectAll('.yearly-trend-lines-sup')\n .data(chartTrendLineSup)\n .join(\n enter => enter.append('path')\n .attr(\"d\", d => d.pathEnter)\n .attr('class', 'yearly-trend-lines-sup')\n .style('stroke', d => d.colour)\n .style('stroke-width', d => d.width)\n .attr(\"opacity\", 0),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n .attr(\"d\", d => d.pathEnter)\n .remove(), pTrans))\n )\n // Join returns merged enter and update selection\n .call(merge => transPromise(merge.transition(t)\n .attr(\"d\", d => d.path)\n .attr(\"opacity\", d => d.opacity)\n .style('stroke', d => d.colour)\n .style('stroke-width', d => d.width), pTrans))\n \n // Supplementary points error bars\n gYearly.selectAll('.yearly-error-bars-sup')\n .data(chartPointsSupErrorBars, d => `error-bars-sup-${d.year}`)\n .join(\n enter => enter.append('path')\n .attr(\"class\", `yearly-error-bars-sup`)\n .attr(\"d\", d => d.pathEnter)\n .style('fill', 'none')\n .style('stroke', 'black')\n .style('stroke-width', 1)\n .style('opacity', 0),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n .attr(\"d\", d => d.pathEnter)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr(\"d\", d => d.path)\n .style('opacity', 1), pTrans))\n \n // Supplementary points\n gYearly.selectAll('.yearly-point-data-sup')\n .data(chartPointsSup, d => `point-data-sup-${d.year}`)\n .join(\n enter => enter.append('circle')\n .attr(\"class\", `yearly-point-data-sup`)\n .attr('cx', d => d.x)\n //.attr('cy', d => d.y)\n .attr('cy', height)\n .attr('r', 3)\n .style('fill', 'white')\n .style('stroke', 'black')\n .style('stroke-width', 1)\n .style('opacity', 0),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n .attr('cy', height)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .style('opacity', 1), pTrans))\n\n addEventHandlers(gYearly.selectAll(\"path\"), 'prop', svgChart, interactivity)\n addEventHandlers(gYearly.selectAll(\".yearly-bar\"), 'prop', svgChart, interactivity)\n addEventHandlers(gYearly.selectAll(\".yearly-point\"), 'prop', svgChart, interactivity)\n \n if (init) {\n\n // Constants for positioning\n const axisLeftPadX = margin.left ? margin.left : 0\n const axisRightPadX = margin.right ? margin.right : 0\n const axisBottomPadY = margin.bottom ? margin.bottom : 0\n const axisTopPadY = margin.top ? margin.top : 0\n\n // Taxon title\n if (showTaxonLabel) {\n const taxonLabel = svgYearly\n .append('text')\n .classed('brc-chart-yearly-label', true)\n .text(taxon)\n .style('font-size', taxonLabelFontSize)\n .style('font-style', taxonLabelItalics ? 'italic' : '')\n\n const labelHeight = taxonLabel.node().getBBox().height\n taxonLabel.attr(\"transform\", `translate(${axisLeftPadX}, ${labelHeight})`)\n }\n \n // Size SVG\n svgYearly\n .attr('width', width + axisLeftPadX + axisRightPadX)\n .attr('height', height + axisBottomPadY + axisTopPadY)\n\n // Position chart\n gYearly.attr(\"transform\", `translate(${axisLeftPadX},${axisTopPadY})`)\n \n // Create axes and position within SVG\n const leftYaxisTrans = `translate(${axisLeftPadX},${axisTopPadY})`\n const leftYaxisLabelTrans = `translate(${axisLabelFontSize},${axisTopPadY + height/2}) rotate(270)`\n const rightYaxisTrans = `translate(${axisLeftPadX + width}, ${axisTopPadY})`\n const rightYaxisLabelTrans = `translate(${axisLeftPadX + width + axisRightPadX - axisLabelFontSize}, ${axisTopPadY + height/2}) rotate(90)`\n const topXaxisTrans = `translate(${axisLeftPadX},${axisTopPadY})`\n const bottomXaxisTrans = `translate(${axisLeftPadX},${axisTopPadY + height})`\n\n // Create axes and position within SVG\n if (lAxis) {\n const gLaxis = svgYearly.append(\"g\")\n .attr(\"class\", \"l-axis\")\n // .classed('yearly-type-counts', axisLeft === 'tick')\n // .classed('yearly-type-props', axisLeft !== 'tick')\n gLaxis.attr(\"transform\", leftYaxisTrans)\n }\n if (bAxis) {\n const gBaxis = svgYearly.append(\"g\")\n .attr(\"class\", \"x axis\")\n .call(bAxis)\n gBaxis.attr(\"transform\", bottomXaxisTrans)\n }\n if (tAxis) {\n const gTaxis = svgYearly.append(\"g\")\n .call(tAxis)\n gTaxis.attr(\"transform\", topXaxisTrans)\n }\n if (rAxis) {\n const gRaxis = svgYearly.append(\"g\")\n //.call(rAxis)\n .attr(\"class\", \"r-axis\")\n // .classed('yearly-type-counts', axisRight === 'tick')\n // .classed('yearly-type-props', axisRight !== 'tick')\n gRaxis.attr(\"transform\", rightYaxisTrans)\n }\n\n const tYaxisLeftLabel = svgYearly.append(\"text\")\n // .classed('yearly-type-counts', axisLeft === 'tick')\n // .classed('yearly-type-props', axisLeft !== 'tick')\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisLeftLabel) \n tYaxisLeftLabel.attr(\"transform\", leftYaxisLabelTrans)\n\n const tYaxisRightLabel = svgYearly.append(\"text\")\n // .classed('yearly-type-counts', axisRight === 'tick')\n // .classed('yearly-type-props', axisRight !== 'tick')\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisRightLabel) \n tYaxisRightLabel.attr(\"transform\", rightYaxisLabelTrans)\n\n } else {\n if (taxa.length === 1) {\n // Update taxon label\n if (showTaxonLabel) {\n svgYearly.select('.brc-chart-yearly-label').text(taxon)\n }\n }\n\n // Update the bottom axis if it exists. We do this because\n // yearMin and/or yearMax may have changed.\n if (axisBottom === 'on' || axisBottom === 'tick') {\n transPromise(svgYearly.select(\".x.axis\")\n .transition(t)\n .call(bAxis), pTrans)\n }\n }\n\n if (svgYearly.selectAll(\".l-axis\").size()){\n\n transPromise(svgYearly.select(\".l-axis\")\n .transition(t)\n .call(lAxis), pTrans)\n }\n\n if (svgYearly.selectAll(\".r-axis\").size()){\n transPromise(svgYearly.select(\".r-axis\")\n .transition(t)\n .call(rAxis), pTrans)\n }\n \n return svgYearly\n\n function adjustForTrans(pntsIn) {\n // Return an array of arrays of points. There may be more than one array\n // of points in the main array if there are breaks in the input array\n // of points.\n\n // First restructure the passed in points to an array of arrays.\n let pntsSplit = []\n pntsIn.forEach(p => {\n if (p.n === 'break') {\n // Add a new array\n pntsSplit.push([])\n } else {\n if (pntsSplit.length === 0) {\n // Fist value so first add a new array\n pntsSplit.push([])\n }\n // Add point to array\n pntsSplit[pntsSplit.length - 1].push(p)\n }\n })\n // At this point pntsSplit could have empty arrays, e.g. if there\n // where consecutive 'breaks' so weed these out.\n pntsSplit = pntsSplit.filter(a => a.length > 0)\n\n // Adjust of transition year ranges\n const retSet = []\n pntsSplit.forEach(pnts => {\n\n const ret = [...pnts]\n retSet.push(ret)\n\n // If missing year values are being bridged, add a point at last\n // known value.\n for (let i = 0; i < pnts.length; i++) {\n if (pnts[i].n === 'bridge') {\n pnts[i].n = pnts[i-1].n\n pnts[i].year = pnts[i-1].year\n }\n }\n\n // When minYearTans and MaxYearTrans are set, then each trend line\n // must have the same number of points in (MaxYearTrans - minYearTans + 1 points).\n // This is to make nice looking transitions between lines with otherwise\n // different numbers of points.\n if (minYearTrans) {\n for(let i=minYearTrans; i {\n const tmpText = svgChart.append('text') //.style('display', 'none')\n .text(m.label)\n .style('font-size', legendFontSize)\n\n const widthText = tmpText.node().getBBox().width\n tmpText.remove()\n\n if (lineWidth + swatchSize + swatchSize * swatchFact + widthText > legendWidth) {\n ++rows\n lineWidth = -swatchSize\n }\n m.x = lineWidth + swatchSize + headPad\n m.y = rows * swatchSize * swatchFact\n\n lineWidth = lineWidth + swatchSize + swatchSize * swatchFact + widthText\n })\n\n const ls = svgChart.selectAll('.brc-legend-item-rect')\n .data(metricsReversed, m => gen.safeId(m.label))\n .join(enter => {\n const rect = enter.append(\"rect\")\n .attr(\"class\", m=> `brc-legend-item brc-legend-item-rect yearly-graphic yearly-${m.prop}`)\n .attr('width', swatchSize)\n .attr('height', showCounts === 'bar' ? swatchSize : 2)\n return rect\n })\n .attr('x', m => m.x)\n .attr('y', m => showCounts === 'bar' ? m.y + swatchSize/5 : m.y + swatchSize/2)\n .attr('fill', m => m.colour)\n\n const lt = svgChart.selectAll('.brc-legend-item-text')\n .data(metricsReversed, m => gen.safeId(m.label))\n .join(enter => {\n const text = enter.append(\"text\")\n .attr(\"class\", m=> `brc-legend-item brc-legend-item-text yearly-graphic yearly-${m.prop}`)\n .text(m => m.label)\n .style('font-size', legendFontSize)\n return text\n })\n .attr('x', m => m.x + swatchSize * swatchFact)\n .attr('y', m => m.y + legendFontSize * 1)\n\n addEventHandlers(ls, 'prop', svgChart, interactivity)\n addEventHandlers(lt, 'prop', svgChart, interactivity)\n\n return swatchSize * swatchFact * (rows + 1)\n}","import * as d3 from 'd3'\n\nexport function addEventHandlers(sel, prop, svgChart, interactivity) {\n sel\n .on(\"mouseover\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d[prop], true, svgChart)\n }\n })\n .on(\"mouseout\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d[prop], false, svgChart)\n }\n })\n .on(\"click\", function(d) {\n if (interactivity === 'mouseclick') {\n highlightItem(d[prop], true, svgChart)\n d3.event.stopPropagation()\n }\n })\n}\n\nexport function highlightItem(id, highlight, svgChart) {\n\n //console.log('highlightItem', id, highlight)\n\n svgChart.selectAll('.temporal-graphic')\n .classed('lowlight', false)\n svgChart.selectAll('.temporal-graphic')\n .classed('highlight', false)\n\n if (highlight) {\n svgChart.selectAll('.temporal-graphic')\n .classed('lowlight', true)\n svgChart.selectAll(`.temporal-${id}`)\n .classed('lowlight', false)\n svgChart.selectAll(`.temporal-${id}`)\n .classed('highlight', true)\n }\n}","import * as d3 from 'd3'\nimport { addG, xAxisYear, xAxisMonthText, xAxisMonthNoText, temporalScale, spreadScale, safeId, transPromise } from '../general'\nimport { generateBars } from './chartBar'\nimport { generateLines } from './chartLine'\nimport { generatePointsAndErrors } from './chartPointAndError'\nimport { generateSupPointsAndErrors } from './chartSupPointAndError'\nimport { generateSupTrendLines } from './chartSupTrendLine'\nimport { generateSupVerticals } from './chartSupVertical'\n\nexport function makeTemporal (\n svgChart,\n taxon,\n taxa,\n data,\n dataPoints,\n dataTrendLines,\n periodType,\n monthScaleRange,\n minPeriod,\n maxPeriod,\n minPeriodTrans,\n maxPeriodTrans,\n minY,\n maxY,\n minMaxY,\n xPadPercent,\n yPadPercent,\n metricsPlus,\n width,\n height,\n axisTop,\n axisBottom,\n chartStyle,\n axisLeft,\n //yAxisOpts,\n axisRight,\n duration,\n interactivity,\n margin,\n showTaxonLabel,\n taxonLabelFontSize,\n taxonLabelItalics,\n axisLabelFontSize,\n axisLeftLabel,\n axisRightLabel,\n missingValues,\n lineInterpolator,\n verticals,\n metricExpression,\n composition,\n spreadOverlap,\n pTrans\n) {\n \n // xPadding is calculated before yPadding because it is needed early\n const xPadding = (maxPeriod-minPeriod) * xPadPercent/100\n \n // Pre-process data.\n // Filter to named taxon and to min and max period and sort in period order\n // Adjust metrics data to accoutn for metricExpress value.\n const dataFiltered = JSON.parse(JSON.stringify(data))\n .filter(d => taxon ? d.taxon === taxon : true)\n .filter(d => (d.period >= minPeriod && d.period <= maxPeriod))\n .sort((a, b) => (a.period > b.period) ? 1 : -1)\n // Adjust metric values and record, in metric structure,\n // hightest values (required in spread display)\n\n metricsPlus.forEach(m => {\n // If taxon named in metric, further filter data to the named taxon.\n const dataFilteredMetric = dataFiltered.filter(d => m.taxon ? d.taxon === m.taxon : true)\n\n let denominator \n if (metricExpression === 'proportion') {\n denominator = dataFilteredMetric.map(d => d[m.prop]).reduce((a, v) => a + v, 0)\n } else if (metricExpression === 'normalized') {\n denominator = Math.max(...dataFilteredMetric.map(d => d[m.prop]))\n } else {\n denominator = 1\n }\n dataFilteredMetric.forEach(d => {\n d[m.prop] = d[m.prop] / denominator\n })\n // Record max data value in metric\n const errorBarUppers = m.errorBarUpper && m.errorBarLower ? dataFilteredMetric.map(d => d[m.errorBarUpper]) : []\n const bandUppers = m.bandUpper && m.bandLower ? dataFilteredMetric.map(d => d[m.bandUpper]) : []\n m.maxValue = Math.max(...dataFilteredMetric.map(d => d[m.prop]), ...errorBarUppers, ...bandUppers)\n })\n\n // Add data displacement values for cummulative displays such as stacked\n dataFiltered.forEach(d => {\n metricsPlus.forEach((m,i) => {\n if (!m.taxon || d.taxon === m.taxon) {\n if (!d.displacement) {\n d.displacement = [0]\n } else {\n d.displacement.push(d.displacement[i-1] + d[metricsPlus[i-1].prop])\n }\n }\n })\n })\n\n // Filter dataPoints data on taxon (if specified) and to within min and max period.\n const dataPointsFiltered = dataPoints\n .filter(d => (taxon && d.taxon ? d.taxon === taxon : true) && d.period >= minPeriod && d.period <= maxPeriod)\n .sort((a, b) => (a.period > b.period) ? 1 : -1)\n\n // Filter dataTrendLines data on taxon (if specified) and convert from an \n // array of gradients and intercepts to an array of arrays of two point lines.\n // If the coords of the lines are included in dataTrendLines rather than\n // gradients and intercepts, then these values are used. \n\n const dataTrendLinesFiltered = dataTrendLines\n .filter(d => taxon && d.taxon ? d.taxon === taxon : true)\n .map(d => {\n let y1, y2, p1, p2\n if (d.p1 && d.p2 && d.v1 && d.v2 ) {\n p1 = d.p1\n p2 = d.p2\n y1 = d.v1\n y2 = d.v2\n } else {\n p1 = minPeriod - xPadding\n p2 = maxPeriod + xPadding\n if(d.gradient === 0) {\n y1 = d.intercept\n y2 = d.intercept\n } else {\n y1 = d.gradient * minPeriod + d.intercept \n y2 = d.gradient * maxPeriod + d.intercept\n }\n }\n\n return {\n id: d.id,\n taxon: d.taxon,\n colour: d.colour,\n width: d.width,\n opacity: d.opacity,\n y1: y1,\n y2: y2,\n p1: p1,\n p2: p2\n }\n })\n\n // Filter verticals on taxon (if specified) and to within min and max period.\n const verticalsFiltered = verticals\n .filter(d => (d.taxon && taxon ? d.taxon === taxon : true))\n .sort((a, b) => (a.period > b.period) ? 1 : -1)\n\n //Set the min and maximum values for the y axis\n function v(d) {\n return typeof(d) === 'number'\n }\n\n function inRange(m,d) {\n let ret = true\n if (m.periodMin && d.period < m.periodMin) ret = false\n if (m.periodMax && d.period > m.periodMax) ret = false\n return ret\n }\n\n // This next section is all about working out the minimum and maximum Y values\n // (minYscale and maxYscale) which are required for generating the Y scale. It is \n // complicated because it depends on the type of data used and the display\n // composition.\n let missing = []\n if (typeof(missingValues) !== 'undefined' && missingValues !== 'break' && missingValues !== 'bridge') {\n // Maybe need to be more nuanced here - only adding missing value if it is actually used\n // to replace missing values in dataset.\n missing = [Number(missingValues)]\n }\n let cumulativeTotals = []\n const extensionValues = []\n if (composition === 'stack') {\n // For stacked displays, need to create cumulative totals array\n cumulativeTotals = new Array(dataFiltered.length).fill(0)\n dataFiltered.forEach((d,i) => {\n metricsPlus.forEach(m => {\n // In stacked displays, error bars/bands from metrics other\n // than the one stacked on top can extend beyond the limit\n // of the metric on top, so we create an array to hold all\n // the possible values that could be the maximum value.\n if (!m.taxon || d.taxon === m.taxon) {\n if (v(d[m.bandUpper])) {\n extensionValues.push(cumulativeTotals[i] + d[m.bandUpper])\n }\n if (v(d[m.errorBarUpper])) {\n extensionValues.push(cumulativeTotals[i] + d[m.errorBarUpper])\n }\n // Increment the cumulative total\n cumulativeTotals[i] += d[m.prop]\n }\n })\n })\n }\n\n const maxMetricYs = metricsPlus.map(m => Math.max(\n ...dataFiltered.filter(d => m.taxon ? d.taxon === m.taxon : true).filter(d => v(d[m.prop])).filter(d => inRange(m,d)).map(d => d[m.prop]),\n ...dataFiltered.filter(d => m.taxon ? d.taxon === m.taxon : true).filter(d => v(d[m.bandUpper])).filter(d => inRange(m,d)).map(d => d[m.bandUpper]),\n ...dataFiltered.filter(d => m.taxon ? d.taxon === m.taxon : true).filter(d => v(d[m.errorBarUpper])).filter(d => inRange(m,d)).map(d => d[m.errorBarUpper]),\n ))\n const maxYA = maxY !== null ? [maxY] : []\n let maxYscale = Math.max(\n ...maxYA,\n ...maxMetricYs,\n ...cumulativeTotals,\n ...extensionValues,\n ...dataPointsFiltered.map(d => d.y),\n ...dataPointsFiltered.filter(d => v(d.upper)).map(d => d.upper),\n ...dataTrendLinesFiltered.map(d => d.y1),\n ...dataTrendLinesFiltered.map(d => d.y2)\n )\n\n const minMetricYs = metricsPlus.map(m => Math.min(\n ...dataFiltered.filter(d => m.taxon ? d.taxon === m.taxon : true).filter(d => v(d[m.prop])).filter(d => inRange(m,d)).map(d => d[m.prop]),\n ...dataFiltered.filter(d => m.taxon ? d.taxon === m.taxon : true).filter(d => v(d[m.bandLower])).filter(d => inRange(m,d)).map(d => d[m.bandLower]),\n ...dataFiltered.filter(d => m.taxon ? d.taxon === m.taxon : true).filter(d => v(d[m.errorBarLower])).filter(d => inRange(m,d)).map(d => d[m.errorBarLower]),\n ...missing\n ))\n\n //console.log('dataFiltered', dataFiltered)\n //console.log('minMetricYs', minMetricYs)\n\n const minYA = minY !== null ? [minY] : []\n let minYscale = Math.min(\n ...minYA,\n ...minMetricYs,\n ...dataPointsFiltered.map(d => d.y),\n ...dataPointsFiltered.filter(d => d.lower).map(d => d.lower),\n ...dataTrendLinesFiltered.map(d => d.y1),\n ...dataTrendLinesFiltered.map(d => d.y2)\n )\n if (minMaxY !== null) {\n if (maxYscale < minMaxY) {\n maxYscale = minMaxY\n }\n }\n\n // Value scales\n let periods = []\n for (let i = minPeriod; i <= maxPeriod; i++) {\n periods.push(i)\n }\n\n // yPadding (xPadding calculated earlier when needed)\n const yPadding = (maxYscale-minYscale) * yPadPercent/100\n\n const xScale = temporalScale(chartStyle, periodType, minPeriod, maxPeriod, xPadding, monthScaleRange, width)\n const yScale = spreadScale(minYscale, maxYscale, yPadding, metricsPlus, height, composition, spreadOverlap)\n\n // Top axis\n let tAxis\n if (axisTop === 'on') {\n tAxis = d3.axisTop()\n .scale(d3.scaleLinear().domain([0,1]).range([0, width])) // Needs a d3 scale obj\n .tickValues([])\n .tickSizeOuter(0)\n }\n\n // Bottom axis\n let bAxis, bAxis1\n if (axisBottom === 'on' || axisBottom === 'tick') {\n if (periodType === 'year') {\n bAxis = xAxisYear(width, axisBottom === 'tick', minPeriod - xPadding, maxPeriod + xPadding, chartStyle === 'bar')\n } else {\n // PeriodType is month or week.\n // For month or week periodTypes, axis is generated in two parts,\n // one for the ticks and one for the annotation because\n // default axes tick in centre of text. bAxis1 takes\n // care of the text.\n bAxis = xAxisMonthNoText(width, monthScaleRange)\n bAxis1 = xAxisMonthText(width, axisBottom === 'tick', axisLabelFontSize, 'Arial', monthScaleRange)\n }\n }\n\n // Left and right axes\n const makeXaxis = (leftRight, axisOpt) => {\n let axis\n const d3axis = leftRight === 'left' ? d3.axisLeft() : d3.axisRight()\n switch(axisOpt) {\n case 'on':\n axis = d3axis.scale(yScale.yAxis).tickValues([]).tickSizeOuter(0)\n break\n case 'tick':\n axis = d3axis.scale(yScale.yAxis).ticks(5).tickFormat(d3.format(yScale.tickFormat))\n break\n }\n return axis\n }\n const lAxis = makeXaxis('left', axisLeft)\n const rAxis = makeXaxis('right', axisRight)\n\n // Create or get the relevant chart svg\n let init, svgTemporal, gTemporal\n\n if (taxa.length === 1 && svgChart.selectAll('.brc-chart-temporal').size() === 1) {\n svgTemporal = svgChart.select('.brc-chart-temporal')\n gTemporal = svgTemporal.select('.brc-chart-temporal-g')\n init = false\n } else if (svgChart.select(`#${safeId(taxon)}`).size()) {\n svgTemporal = svgChart.select(`#${safeId(taxon)}`)\n gTemporal = svgTemporal.select('.brc-chart-temporal-g')\n init = false\n } else {\n svgTemporal = svgChart.append('svg')\n .classed('brc-chart-temporal', true)\n .attr('id', safeId(taxon))\n .style('overflow', 'visible')\n .style('font-family', 'sans-serif')\n gTemporal = svgTemporal.append('g')\n .classed('brc-chart-temporal-g', true)\n init = true\n }\n\n // d3 transition object\n const t = svgTemporal.transition().duration(duration)\n\n // Add specific g elements to gTemporal for different chart element groups\n // The order they are added affects there position in the display stack\n // Those added last are displayed on top.\n const gVerticals = addG('gSupVerticals', gTemporal)\n const gBars = addG('gTemporalBars', gTemporal)\n const gLines = addG('gTemporalLines', gTemporal)\n const gPointsAndErrors = addG('gTemporalPointsAndErrors', gTemporal)\n const gSupTrendLines = addG('gTemporalSupTrendLines', gTemporal)\n const gSupPointsAndErrors = addG('gTemporalSupPointsAndErrors', gTemporal)\n\n // Generate/regenerate chart elements\n generateBars(dataFiltered, metricsPlus, gBars, t, xScale, yScale, height, pTrans, minYscale, svgChart, interactivity, chartStyle, composition)\n generateLines(dataFiltered, metricsPlus, gLines, t, xScale, yScale, height, pTrans, minYscale, periods, minPeriodTrans, maxPeriodTrans, lineInterpolator, missingValues, svgChart, interactivity, chartStyle, composition)\n generatePointsAndErrors(dataFiltered, metricsPlus, gPointsAndErrors, t, xScale, yScale, height, pTrans, chartStyle, svgChart, interactivity, composition)\n generateSupTrendLines(dataTrendLinesFiltered, metricsPlus, gSupTrendLines, t, xScale, yScale, height, pTrans, chartStyle, svgChart, interactivity)\n generateSupPointsAndErrors(dataPointsFiltered, gSupPointsAndErrors, t, xScale, yScale, height, pTrans)\n generateSupVerticals(verticalsFiltered, gVerticals, t, xScale, height, pTrans)\n\n if (init) {\n\n // Constants for positioning\n const axisLeftPadX = margin.left ? margin.left : 0\n const axisRightPadX = margin.right ? margin.right : 0\n const axisBottomPadY = margin.bottom ? margin.bottom : 0\n const axisTopPadY = margin.top ? margin.top : 0\n\n // Taxon title\n if (showTaxonLabel) {\n const taxonLabel = svgTemporal\n .append('text')\n .classed('brc-chart-temporal-label', true)\n .text(taxon)\n .style('font-size', taxonLabelFontSize)\n .style('font-style', taxonLabelItalics ? 'italic' : '')\n\n const labelHeight = taxonLabel.node().getBBox().height\n taxonLabel.attr(\"transform\", `translate(${axisLeftPadX}, ${labelHeight})`)\n }\n \n // Size SVG\n svgTemporal\n .attr('width', width + axisLeftPadX + axisRightPadX)\n .attr('height', height + axisBottomPadY + axisTopPadY)\n\n // Position chart\n gTemporal.attr(\"transform\", `translate(${axisLeftPadX},${axisTopPadY})`)\n \n //} else {\n // Create axes and position within SVG\n const leftYaxisTrans = `translate(${axisLeftPadX},${axisTopPadY})`\n const leftYaxisLabelTrans = `translate(${axisLabelFontSize},${axisTopPadY + height/2}) rotate(270)`\n const rightYaxisTrans = `translate(${axisLeftPadX + width}, ${axisTopPadY})`\n const rightYaxisLabelTrans = `translate(${axisLeftPadX + width + axisRightPadX - axisLabelFontSize}, ${axisTopPadY + height/2}) rotate(90)`\n const topXaxisTrans = `translate(${axisLeftPadX},${axisTopPadY})`\n const bottomXaxisTrans = `translate(${axisLeftPadX},${axisTopPadY + height})`\n\n // Create axes and position within SVG\n if (lAxis) {\n const gLaxis = svgTemporal.append(\"g\")\n .attr(\"class\", \"l-axis\")\n // .classed('temporal-type-counts', axisLeft === 'tick')\n // .classed('temporal-type-props', axisLeft !== 'tick')\n gLaxis.attr(\"transform\", leftYaxisTrans)\n }\n if (bAxis) {\n const gBaxis = svgTemporal.append(\"g\")\n .attr(\"class\", \"x axis\")\n .call(bAxis)\n gBaxis.attr(\"transform\", bottomXaxisTrans)\n }\n if (bAxis1) {\n // For month or week periodType charts, axis is generated in two parts,\n // one for the ticks and one for the annotation because\n // default places tick in centre of text. Baxis 1 takes\n // care of the text.\n const gBaxis1 = svgTemporal.append(\"g\")\n .attr(\"class\", \"x axis1\")\n .call(bAxis1)\n gBaxis1.attr(\"transform\", bottomXaxisTrans)\n }\n if (tAxis) {\n const gTaxis = svgTemporal.append(\"g\")\n .call(tAxis)\n gTaxis.attr(\"transform\", topXaxisTrans)\n }\n if (rAxis) {\n const gRaxis = svgTemporal.append(\"g\")\n //.call(rAxis)\n .attr(\"class\", \"r-axis\")\n // .classed('temporal-type-counts', axisRight === 'tick')\n // .classed('temporal-type-props', axisRight !== 'tick')\n gRaxis.attr(\"transform\", rightYaxisTrans)\n }\n\n const tYaxisLeftLabel = svgTemporal.append(\"text\")\n // .classed('temporal-type-counts', axisLeft === 'tick')\n // .classed('temporal-type-props', axisLeft !== 'tick')\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisLeftLabel) \n tYaxisLeftLabel.attr(\"transform\", leftYaxisLabelTrans)\n\n const tYaxisRightLabel = svgTemporal.append(\"text\")\n // .classed('temporal-type-counts', axisRight === 'tick')\n // .classed('temporal-type-props', axisRight !== 'tick')\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisRightLabel) \n tYaxisRightLabel.attr(\"transform\", rightYaxisLabelTrans)\n\n } else {\n if (taxa.length === 1) {\n // Update taxon label\n if (showTaxonLabel) {\n svgTemporal.select('.brc-chart-temporal-label').text(taxon)\n }\n }\n\n // Update the bottom axis if it exists. We do this because\n // periodMin and/or periodMax may have changed.\n if (axisBottom === 'on' || axisBottom === 'tick') {\n transPromise(svgTemporal.select(\".x.axis\")\n .transition(t)\n .call(bAxis), pTrans)\n if (bAxis1) {\n transPromise(svgTemporal.select(\".x.axis1\")\n .transition(t)\n .call(bAxis1), pTrans)\n }\n }\n }\n\n if (svgTemporal.selectAll(\".l-axis\").size()){\n\n transPromise(svgTemporal.select(\".l-axis\")\n .transition(t)\n .call(lAxis), pTrans)\n }\n\n if (svgTemporal.selectAll(\".r-axis\").size()){\n transPromise(svgTemporal.select(\".r-axis\")\n .transition(t)\n .call(rAxis), pTrans)\n }\n \n return svgTemporal\n}","import { transPromise } from '../general'\nimport { addEventHandlers } from './highlightitem'\n\nexport function generateBars(dataFilteredAll, metricsPlus, gTemporal, t, xScale, yScale, height, pTrans, yminY, svgChart, interactivity, chartStyle, composition) {\n\n let chartBars = []\n const displacement = {}\n\n metricsPlus.forEach((m, i) => {\n\n //####\n const dataFiltered = dataFilteredAll.filter(d => m.taxon ? d.taxon === m.taxon : true)\n\n if (chartStyle === 'bar') {\n const bars = dataFiltered.map(d => {\n let n, barHeight\n if (composition === 'stack') {\n const displace = displacement[d.period] \n if (typeof(displace) === 'undefined') {\n n = yScale(d[m.prop], i)\n barHeight = height - n\n displacement[d.period] = d[m.prop]\n } else {\n n = yScale(d[m.prop] + displace, i)\n barHeight = yScale(displace, i) - n\n displacement[d.period] += d[m.prop]\n }\n } else {\n n = yScale(d[m.prop], i)\n barHeight = yScale(yminY, i) - n\n }\n return {\n colour: m.colour,\n opacity: m.fillOpacity,\n prop: m.id ? m.id : `${m.prop}-${m.index}`,\n period: d.period,\n n: n,\n height: barHeight\n }\n })\n chartBars = [...chartBars, ...bars]\n }\n })\n chartBars.reverse()\n\n gTemporal.selectAll(\".temporal-bar\")\n .data(chartBars, d => `bars-${d.prop}-${d.period}`)\n .join(\n enter => enter.append(\"rect\")\n .attr(\"class\", d => `temporal-bar temporal-graphic temporal-${d.prop}`)\n .attr('width', d => xScale.bandwidth(d.period))\n .attr('height', 0)\n .attr('fill', d => d.colour)\n .attr('opacity', 0)\n .attr('y', yScale.height)\n .attr('x', d => xScale(d.period)),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .attr('height', 0)\n .attr('y', yScale.height)\n .style(\"opacity\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr('y', d => d.n)\n .attr('x', d => xScale(d.period))\n .attr('height', d => d.height)\n .attr('width', d => xScale.bandwidth(d.period))\n .attr(\"fill\", d => d.colour)\n .attr(\"opacity\", d => d.opacity), pTrans))\n\n addEventHandlers(gTemporal.selectAll(\".temporal-bar\"), 'prop', svgChart, interactivity)\n}","import * as d3 from 'd3'\nimport { addG, transPromise } from '../general'\nimport { addEventHandlers } from './highlightitem'\n\nexport function generateLines(\n dataFilteredAll, \n metricsPlus, \n gTemporal, \n t, \n xScale, \n yScale, \n height, \n pTrans, \n yminY, \n periods, \n minPeriodTrans, \n maxPeriodTrans,\n lineInterpolator,\n missingValues,\n svgChart, \n interactivity,\n chartStyle,\n composition\n) {\n\n // Add g elements in increasing order of display priority\n const gLinesAreas = addG('gLinesAreas', gTemporal)\n const gLinesBands = addG('gLinesBands', gTemporal)\n const gLinesBandLines = addG('gLinesBandLines', gTemporal)\n const gLinesLines = addG('gLinesLines', gTemporal)\n\n const lineValues = (points, iPart) => {\n const d3LineGen = d3.line()\n .x(d => xScale(d.period))\n .y(d => yScale(d.n, iPart))\n if (lineInterpolator) {\n // Interpolating curves can make transitions of polygons iffy\n // because resulting number of points in path is not constant.\n d3LineGen.curve(d3[lineInterpolator]) \n }\n return d3LineGen(points)\n }\n\n let chartLines = []\n let chartBands = []\n let chartLineFills = []\n\n metricsPlus.forEach((m, iMetric) => {\n\n const dataFiltered = dataFilteredAll.filter(d => m.taxon ? d.taxon === m.taxon : true)\n\n // Construct data structure for line/area charts.\n let pointSets\n if (dataFiltered.length && (chartStyle === 'line' || chartStyle === 'area')) {\n pointSets = adjustForTrans(periods.map(p => {\n \n const d = dataFiltered.find(d => d.period === p)\n const ret = {\n period: p,\n displacement: d ? d.displacement[iMetric] : null\n }\n if(!d){\n // Replace any missing values (for a given period)\n // with the missing value specified (can be a value\n // or 'bridge' or 'break').\n ret.n = missingValues\n } else if ((m.periodMin && p < m.periodMin) || (m.periodMax && p > m.periodMax)) {\n // If metric has periodMin or periodMax specfied, then replace values beyond\n // this range with specifed missing value.\n ret.n = missingValues\n } else {\n ret.n = d[m.prop]\n }\n return ret\n }))\n } else {\n pointSets = []\n }\n\n pointSets.forEach((points, i) => {\n let pnts\n if (composition === 'stack') {\n pnts = points.map(p => {\n return {\n n: p.n + p.displacement,\n period: p.period,\n displacement: p.displacement\n }\n })\n } else {\n pnts = points\n }\n chartLines.push({\n colour: m.colour,\n opacity: m.opacity,\n strokeWidth: m.strokeWidth,\n prop: m.id ? m.id : `${m.prop}-${m.index}`,\n index: m.index,\n part: i,\n yMin: yminY,\n pathEnter: lineValues(pnts.map(p => {\n return {\n n: yminY,\n period: p.period\n }\n }), iMetric),\n path: lineValues(pnts, iMetric)\n })\n chartLines.sort((a,b) => b.index - a.index)\n\n if (chartStyle === 'area') {\n // Add bottom line of area to match displacement\n // Always add the same number of points to a baseline\n // as in the mainline - even if it is unstacked (straight line)\n // in order to give nice transitions if switching from overlayed\n // (or spread) to stacked and visa versa.\n const pntsBase = [...points].reverse().map(p => {\n return {\n n: composition === 'stack' && p.displacement > yminY ? p.displacement : yminY,\n period: p.period\n }\n })\n chartLineFills.push({\n opacity: m.fillOpacity,\n fill: m.fill,\n prop: m.id ? m.id : `${m.prop}-${m.index}`,\n index: m.index,\n part: i,\n yMin: yminY,\n pathEnter: lineValues(pnts, iMetric) + lineValues(pntsBase.map(p => {\n return {\n n: yminY,\n period: p.period\n }\n }), iMetric).replace('M', 'L'),\n path: lineValues(pnts, iMetric) + lineValues(pntsBase, iMetric).replace('M', 'L')\n })\n chartLineFills.sort((a,b) => b.index - a.index)\n }\n })\n\n // Construct data structure for confidence band on line charts.\n if (m.bandUpper && m.bandLower ) {\n\n const upperLine = periods.map(p => {\n const d = dataFiltered.find(d => d.period === p)\n const ret = {\n period: p,\n //n: d ? d[m.bandUpper] : missingValues,\n displacement: d ? d.displacement[iMetric] : null\n }\n\n if(!d){\n // Replace any missing values (for a given period)\n // with the missing value specified (can be a value\n // or 'bridge' or 'break').\n ret.n = missingValues\n } else if ((m.periodMin && p < m.periodMin) || (m.periodMax && p > m.periodMax)) {\n // If metric has periodMin or periodMax specfied, then replace values beyond\n // this range with specifed missing value.\n ret.n = missingValues\n } else {\n ret.n = d[m.bandUpper]\n }\n return ret\n })\n const lowerLine = [...periods].map(p => {\n const d = dataFiltered.find(d => d.period === p)\n const ret = {\n period: p,\n //n: d ? d[m.bandLower] : missingValues,\n displacement: d ? d.displacement[iMetric] : null\n }\n\n if(!d){\n // Replace any missing values (for a given period)\n // with the missing value specified (can be a value\n // or 'bridge' or 'break').\n ret.n = missingValues\n } else if ((m.periodMin && p < m.periodMin) || (m.periodMax && p > m.periodMax)) {\n // If metric has periodMin or periodMax specfied, then replace values beyond\n // this range with specifed missing value.\n ret.n = missingValues\n } else {\n ret.n = d[m.bandLower]\n }\n return ret\n })\n\n const pointsLowerSet = adjustForTrans(lowerLine)\n const pointsUpperSet = adjustForTrans(upperLine)\n for (let i=0; i {\n if (composition === 'stack') {\n return pnts.map(p => {\n return {\n n: p.n + p.displacement, \n period: p.period,\n displacement: p.displacement\n }\n })\n } else {\n return pnts\n }\n }\n\n const pointsLower = displace(pointsLowerSet[i])\n const pointsUpper = displace(pointsUpperSet[i])\n \n const pointsLowerEnter = pointsLower.map(p => {\n return {\n n: yminY,\n period: p.period\n }\n })\n const pointsUpperEnter = pointsUpper.map(p => {\n return {\n n: yminY,\n period: p.period\n }\n })\n\n chartBands.push({\n fill: m.bandFill ? m.bandFill : 'silver',\n stroke: m.bandStroke ? m.bandStroke : 'grey',\n fillOpacity: m.bandOpacity !== undefined ? m.bandOpacity : 0.5,\n strokeOpacity: m.bandStrokeOpacity !== undefined ? m.bandStrokeOpacity : 1,\n strokeWidth: m.bandStrokeWidth !== undefined ? m.bandStrokeWidth : 1,\n prop: m.id ? m.id : `${m.prop}-${m.index}`,\n part: i,\n bandPath: lineValues(pointsUpper, iMetric) + lineValues([...pointsLower].reverse(), iMetric).replace('M', 'L'),\n bandPathEnter: lineValues(pointsUpperEnter, iMetric) + lineValues([...pointsLowerEnter].reverse(), iMetric).replace('M', 'L'),\n bandBorders: [lineValues(pointsLower, iMetric), lineValues(pointsUpper, iMetric)],\n bandBordersEnter: [lineValues(pointsLowerEnter, iMetric), lineValues(pointsUpperEnter, iMetric)]\n })\n chartBands.sort((a,b) => b.index - a.index)\n }\n }\n })\n\n // Bands\n gLinesBands.selectAll(\".temporal-band\")\n .data(chartBands, d => `band-${d.prop}-${d.part}`)\n .join(\n enter => enter.append(\"path\")\n .attr(\"class\", d => `temporal-band temporal-graphic temporal-${d.prop}`)\n .attr(\"opacity\", 0)\n .attr(\"fill\", d => d.fill)\n .attr(\"stroke\", \"none\")\n //.attr(\"d\", d => d.bandPathEnter),\n .attr(\"d\", d => d.bandPath),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n //.attr(\"d\", d => d.bandPathEnter)\n .attr(\"opacity\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr(\"d\", d => d.bandPath)\n .attr(\"opacity\", d => d.fillOpacity)\n .attr(\"fill\", d => d.fill), pTrans))\n\n addEventHandlers(gLinesBands.selectAll(\".temporal-band\"), 'prop', svgChart, interactivity)\n\n // Band lines\n for (let iLine=0; iLine<2; iLine++) { \n gLinesBandLines.selectAll(`.temporal-band-border-${iLine}`)\n .data(chartBands, d => `band-line-${d.prop}-${iLine}-${d.part}`)\n .join(\n enter => enter.append(\"path\")\n .attr(\"class\", d => `temporal-band-border-${iLine} temporal-graphic temporal-${d.prop}`)\n .attr(\"opacity\", 0)\n .attr(\"fill\",\"none\")\n .attr(\"stroke\", d => d.stroke)\n .attr(\"stroke-width\", d => d.strokeWidth)\n //.attr(\"d\", d => d.bandBordersEnter[iLine]),\n .attr(\"d\", d => d.bandBorders[iLine]),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n //.attr(\"d\", d => d.bandBordersEnter[iLine])\n .attr(\"opacity\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr(\"d\", d => d.bandBorders[iLine])\n .attr(\"opacity\", d => d.strokeOpacity)\n .attr(\"stroke\", d => d.stroke)\n .attr(\"stroke-width\", d => d.strokeWidth), pTrans))\n \n addEventHandlers(gLinesBandLines.selectAll(`.temporal-band-border-${iLine}`), 'prop', svgChart, interactivity)\n\n // Main lines\n gLinesLines.selectAll(\".temporal-line\")\n .data(chartLines, d => `line-${d.prop}-${d.part}`)\n .join(\n enter => enter.append(\"path\")\n .attr(\"class\", d => `temporal-line temporal-graphic temporal-${d.prop}`)\n .attr(\"opacity\", 0)\n .attr(\"fill\", \"none\")\n .attr(\"stroke\", d => d.colour)\n .attr(\"stroke-width\", d => d.strokeWidth)\n //.attr(\"d\", d => d.pathEnter),\n .attr(\"d\", d => d.path),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n //.attr(\"d\", d => d.pathEnter)\n .attr(\"opacity\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr(\"d\", d => d.path)\n .attr(\"opacity\", d => d.opacity)\n .attr(\"stroke\", d => d.colour)\n .attr(\"stroke-width\", d => d.strokeWidth), pTrans))\n\n addEventHandlers(gLinesLines.selectAll(\".temporal-line\"), 'prop', svgChart, interactivity)\n\n // Main line fill\n gLinesAreas.selectAll(\".temporal-line-fill\")\n .data(chartLineFills, d => `band-${d.prop}-${d.part}`)\n .join(\n enter => enter.append(\"path\")\n .attr(\"class\", d => `temporal-line-fill temporal-graphic temporal-${d.prop}`)\n .attr(\"opacity\", 0)\n .attr(\"fill\", d => d.fill)\n .attr(\"stroke\", \"none\")\n //.attr(\"d\", d => d.pathEnter),\n .attr(\"d\", d => d.path),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n //.attr(\"d\", d => d.pathEnter)\n .attr(\"opacity\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr(\"d\", d => d.path)\n .attr(\"opacity\", d => d.opacity)\n .attr(\"fill\", d => d.fill), pTrans))\n\n addEventHandlers(gLinesAreas.selectAll(\".temporal-line-fill\"), 'prop', svgChart, interactivity)\n }\n\n function adjustForTrans(pntsIn) {\n // Return an array of arrays of points. There may be more than one array\n // of points in the main array if there are breaks in the input array\n // of points.\n\n // First restructure the passed in points to an array of arrays.\n // Fist check to see that all values are not 'bridge' which can\n // happen for empty metrics.\n let pntsSplit = []\n if (pntsIn.filter(p => p.n === 'bridge').length !== pntsIn.length) {\n pntsIn.forEach(p => {\n if (p.n === 'break') {\n // Add a new array\n pntsSplit.push([])\n } else {\n if (pntsSplit.length === 0) {\n // Fist value so first add a new array\n pntsSplit.push([])\n }\n // Add point to array\n pntsSplit[pntsSplit.length - 1].push(p)\n }\n })\n }\n\n // At this point pntsSplit could have empty arrays, e.g. if there\n // where consecutive 'breaks' so weed these out.\n pntsSplit = pntsSplit.filter(a => a.length > 0)\n\n // Adjust of transition temporal ranges\n const retSet = []\n pntsSplit.forEach(pnts => {\n\n const ret = [...pnts]\n retSet.push(ret)\n\n // If missing period values are being bridged, add a point at last\n // known value. Have to traverse the array in both directions in\n // order to correctly set leading and trailing 'bridge' values.\n for (let i = 0; i < pnts.length; i++) {\n if (pnts[i].n === 'bridge' && i > 0) {\n pnts[i].n = pnts[i-1].n\n pnts[i].period = pnts[i-1].period\n pnts[i].displacement = pnts[i-1].displacement\n }\n }\n for (let i = pnts.length-1; i >= 0; i--) {\n if (pnts[i].n === 'bridge') {\n pnts[i].n = pnts[i+1].n\n pnts[i].period = pnts[i+1].period\n pnts[i].displacement = pnts[i+1].displacement\n }\n }\n\n // When minPeriodTrans and MaxPeriodTrans are set, then each trend line\n // must have the same number of points in (MaxPeriodTrans - minPeriodTrans + 1 points).\n // This is to make nice looking transitions between lines with otherwise\n // different numbers of points.\n \n if (minPeriodTrans && pnts.length < maxPeriodTrans-minPeriodTrans) {\n for(let i=minPeriodTrans; i {\n\n // Filter to taxon and also filter out any that are outside min/max period if specified\n const dataFiltered = dataFilteredAll.filter(d => m.taxon ? d.taxon === m.taxon : true)\n .filter(d => {\n if (m.periodMin && d.period < m.periodMin) return false\n if (m.periodMax && d.period > m.periodMax) return false\n return true\n })\n \n // Construct data structure for points.\n const bErrorBars = m.errorBarUpper && m.errorBarLower\n const bPoints = m.points\n\n if (bPoints || bErrorBars) {\n const points = dataFiltered.map(d => {\n\n let n, u, l\n if (composition === 'stack') {\n const displace = displacement[d.period] \n if (typeof(displace) === 'undefined') {\n if (bPoints) {\n n = yScale(d[m.prop], i)\n }\n if (bErrorBars) {\n u = yScale(d[m.errorBarUpper], i)\n l = yScale(d[m.errorBarLower], i)\n }\n displacement[d.period] = d[m.prop]\n } else {\n if (bPoints) {\n n = yScale(d[m.prop] + displace, i)\n }\n if (bErrorBars) {\n u = yScale(d[m.errorBarUpper] + displace, i)\n l = yScale(d[m.errorBarLower] + displace, i)\n }\n displacement[d.period] += d[m.prop]\n }\n } else {\n if (bPoints) {\n n = yScale(d[m.prop], i)\n }\n if (bErrorBars) {\n u = yScale(d[m.errorBarUpper], i)\n l = yScale(d[m.errorBarLower], i)\n }\n }\n\n let x\n if (chartStyle === 'bar') {\n x = xScale(d.period) + xScale.bandwidth(d.period) / 2\n } else {\n x = xScale(d.period)\n }\n\n const ret = {\n x: x,\n period: d.period,\n prop: m.id ? m.id : `${m.prop}-${m.index}`,\n }\n\n if (bPoints) {\n ret.y = n\n }\n\n if (bErrorBars) {\n ret.pathEnter = `M ${x} ${height} L ${x} ${height}`\n ret.path = `M ${x} ${l} L ${x} ${u}`\n }\n\n return ret\n })\n if (bPoints) chartPoints = [...chartPoints, ...points]\n if (bErrorBars) chartErrorBars = [...chartErrorBars, ...points]\n }\n })\n\n // Error bars\n gErrors.selectAll('.temporal-error-bars')\n .data(chartErrorBars, d => `error-bars-${d.prop}-${d.period}`)\n .join(\n enter => enter.append('path')\n .attr(\"class\", d => `temporal-error-bars temporal-graphic temporal-${d.prop}`)\n //.attr(\"d\", d => d.pathEnter)\n .attr(\"d\", d => d.path)\n .style('fill', 'none')\n .style('stroke', 'black')\n .style('stroke-width', 1)\n .style('opacity', 0),\n update => update,\n exit => exit.call(exit => transPromise(exit\n .transition(t)\n .style(\"opacity\", 0)\n //.attr(\"d\", d => d.pathEnter)\n .attr(\"d\", d => d.path)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr(\"d\", d => d.path)\n .style('opacity', 1), pTrans))\n\n addEventHandlers(gErrors.selectAll(\".temporal-error-bars\"), 'prop', svgChart, interactivity)\n\n // Points\n gPoints.selectAll('.temporal-point')\n .data(chartPoints, d => `point-${d.prop}-${d.period}`)\n .join(\n enter => enter.append('circle')\n .attr(\"class\", d => `temporal-point temporal-graphic temporal-${d.prop}`)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n //.attr('cy', height)\n .attr('r', 3)\n .style('fill', 'white')\n .style('stroke', 'black')\n .style('stroke-width', 1)\n .style('opacity', 0),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n //.attr('cy', height)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .style('opacity', 1), pTrans))\n\n addEventHandlers(gPoints.selectAll(\".temporal-point\"), 'prop', svgChart, interactivity)\n}","import { transPromise } from '../general'\nimport { addEventHandlers } from './highlightitem'\n\nexport function generateSupTrendLines(dataTrendLinesFiltered, metricsPlus, gTemporal, t, xScale, yScale, height, pTrans, chartStyle, svgChart, interactivity) {\n\n //console.log('dataTrendLinesFiltered', dataTrendLinesFiltered)\n\n // Construct data structure for supplementary trend lines.\n // TODO - if at some point we parameterise display styles,\n // then it must be specified in here.\n const chartTrendLineSup = dataTrendLinesFiltered.filter(d => {\n // p1 and p2 can be infinite if data is empty\n return isFinite(d.p1) && isFinite(d.p2)\n })\n .map(d => {\n // y = mx + c\n const x1 = xScale(d.p1)\n let x2\n if (chartStyle === 'bar') {\n x2 = xScale(d.p2) + xScale.bandwidth(d.p2)\n } else {\n x2 = xScale(d.p2)\n }\n return {\n id: d.id,\n colour: d.colour ? d.colour : 'red',\n width: d.width ? d.width : '1',\n opacity: d.opacity ? d.opacity : '1',\n pathEnter: `M ${x1} ${height} L ${x2} ${height}`,\n path: `M ${x1} ${yScale(d.y1)} L ${x2} ${yScale(d.y2)}`,\n }\n })\n\n // Supplementary trend lines\n gTemporal.selectAll('.temporal-trend-lines-sup')\n .data(chartTrendLineSup, d => d.id)\n .join(\n enter => enter.append('path')\n //.attr(\"d\", d => d.pathEnter)\n .attr(\"d\", d => d.path)\n .attr('class', d => d.id ? `temporal-${d.id}` : '')\n .classed('temporal-trend-lines-sup', true)\n .classed('temporal-graphic', d => d.id ? true : false)\n .style('stroke', d => d.colour)\n .style('stroke-width', d => d.width)\n .attr(\"opacity\", 0),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n //.attr(\"d\", d => d.pathEnter)\n .remove(), pTrans))\n )\n // Join returns merged enter and update selection\n .call(merge => transPromise(merge.transition(t)\n .attr(\"d\", d => d.path)\n .attr(\"opacity\", d => d.opacity)\n .style('stroke', d => d.colour)\n .style('stroke-width', d => d.width), pTrans))\n\n addEventHandlers(gTemporal.selectAll(\".temporal-trend-lines-sup\"), 'id', svgChart, interactivity)\n}","import { transPromise } from '../general'\n\nexport function generateSupPointsAndErrors(dataPointsFiltered, gTemporal, t, xScale, yScale, height, pTrans) {\n\n // Construct data structure for supplementary points.\n // TODO - if at some point we parameterise display styles,\n // then it must be specified in here.\n const chartPointsSup = dataPointsFiltered.map(d => {\n let x \n x = xScale(d.period)\n return {\n x: x,\n y: yScale(d.y),\n period: d.period\n }\n })\n\n // Construct data structure for supplementary point error bars.\n // TODO - if at some point we parameterise display styles,\n // then it must be specified in here.\n const chartPointsSupErrorBars = dataPointsFiltered.map(d => {\n const x = xScale(d.period)\n return {\n pathEnter: `M ${x} ${height} L ${x} ${height}`,\n path: `M ${x} ${yScale(d.lower)} L ${x} ${yScale(d.upper)}`,\n period: d.period\n }\n })\n\n // Supplementary point error bars\n gTemporal.selectAll('.temporal-error-bars-sup')\n .data(chartPointsSupErrorBars, d => `error-bars-sup-${d.period}`)\n .join(\n enter => enter.append('path')\n .attr(\"class\", `temporal-error-bars-sup`)\n .attr(\"d\", d => d.pathEnter)\n .style('fill', 'none')\n .style('stroke', 'black')\n .style('stroke-width', 1)\n .style('opacity', 0),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n .attr(\"d\", d => d.pathEnter)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr(\"d\", d => d.path)\n .style('opacity', 1), pTrans))\n \n // Supplementary points\n gTemporal.selectAll('.temporal-point-data-sup')\n .data(chartPointsSup, d => `point-data-sup-${d.period}`)\n .join(\n enter => enter.append('circle')\n .attr(\"class\", `temporal-point-data-sup`)\n .attr('cx', d => d.x)\n //.attr('cy', d => d.y)\n .attr('cy', height)\n .attr('r', 3)\n .style('fill', 'white')\n .style('stroke', 'black')\n .style('stroke-width', 1)\n .style('opacity', 0),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n .attr('cy', height)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .style('opacity', 1), pTrans))\n}","import { transPromise } from '../general'\n\nexport function generateSupVerticals(verticals, gTemporal, t, xScale, height, pTrans) {\n\n // Construct data structures for vertical lines and bars\n const chartVerticalLines = verticals.filter(d => !d.width).map((d,i) => {\n // Use the D3 scale function (not v) because in charts of type periodType\n // week or month, the start and width values are in *days* not periods\n // (week or month number).\n const x = xScale.d3(d.start)\n return {\n path: `M ${x} 0 L ${x} ${height}`,\n colour: d.colour,\n index: i\n }\n })\n\n // Construct data structures for vertical lines and bars\n const chartVerticalBands = verticals.filter(d => d.width).map((d,i) => {\n // Use the D3 scale function (not v) because in charts of type periodType\n // week or month, the start and width values are in *days* not periods\n // (week or month number).\n return {\n x: xScale.d3(d.start),\n width: xScale.d3(d.start + d.width) - xScale.d3(d.start),\n colour: d.colour,\n index: i\n }\n })\n\n // Vertical lines\n gTemporal.selectAll('.temporal-vertical-line-sup')\n .data(chartVerticalLines, d => `vertical-line-sup-${d.index}`)\n .join(\n enter => enter.append('path')\n .attr(\"class\", `temporal-vertical-line-sup`)\n .attr(\"d\", d => d.path)\n .style('stroke', d => d.colour)\n .style('stroke-width', 1)\n .style('opacity', 0),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n .remove(), pTrans))\n )\n // The selection returned by the join function is the merged\n // enter and update selections\n .call(merge => transPromise(merge.transition(t)\n .attr(\"d\", d => d.path)\n .style('stroke', d => d.colour)\n .style('opacity', 1), pTrans))\n\n // Vertical bands\n gTemporal.selectAll('.temporal-vertical-band-sup')\n .data(chartVerticalBands, d => `vertical-band-sup-${d.index}`)\n .join(\n enter => enter.append(\"rect\")\n .attr(\"class\", `temporal-vertical-band-sup`)\n .attr('width', d => d.width)\n .attr('height', height)\n .attr('fill', d => d.colour)\n .attr('opacity', 0)\n .attr('y', 0)\n .attr('x', d => d.x),\n update => update,\n exit => exit\n .call(exit => transPromise(exit.transition(t)\n .style(\"opacity\", 0)\n .remove(), pTrans))\n ).call(merge => transPromise(merge.transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr('width', d => d.width)\n .attr('height', height)\n .attr('fill', d => d.colour)\n .attr('y', 0)\n .attr('x', d => d.x)\n .attr(\"opacity\", 1), pTrans))\n}","import * as gen from '../general'\nimport { addEventHandlers } from './highlightitem'\n\nexport function makeLegend (\n svgChart,\n metricsPlus,\n legendWidth,\n legendFontSize,\n headPad,\n showCounts,\n interactivity\n) {\n \n // Swatch size based on font size\n const tmpText = svgChart.append('text') \n .text('X')\n .style('font-size', legendFontSize)\n const swatchSize = tmpText.node().getBBox().height\n tmpText.remove()\n const swatchFact = 1.3\n\n // Loop through all the legend elements and work out their\n // positions based on swatch size, item label text size and\n // legend width.\n const legendItems = gen.cloneData(metricsPlus)\n legendItems.forEach(m => {\n m.prop = m.id ? m.id : `${m.prop}-${m.index}`\n })\n\n let rows = 0\n let lineWidth = -swatchSize\n legendItems.forEach(m => {\n const tmpText = svgChart.append('text') //.style('display', 'none')\n .text(m.label)\n .style('font-size', legendFontSize)\n\n const widthText = tmpText.node().getBBox().width\n tmpText.remove()\n\n if (lineWidth + swatchSize + swatchSize * swatchFact + widthText > legendWidth) {\n ++rows\n lineWidth = -swatchSize\n }\n m.x = lineWidth + swatchSize + headPad\n m.y = rows * swatchSize * swatchFact\n\n lineWidth = lineWidth + swatchSize + swatchSize * swatchFact + widthText\n })\n\n const ls = svgChart.selectAll('.brc-legend-item-rect')\n .data(legendItems, m => gen.safeId(m.label))\n .join(enter => {\n const rect = enter.append(\"rect\")\n .attr(\"class\", m=> `brc-legend-item brc-legend-item-rect temporal-graphic temporal-${m.prop}`)\n .attr('width', swatchSize)\n .attr('height', showCounts === 'bar' ? swatchSize : 2)\n return rect\n })\n .attr('x', m => m.x)\n .attr('y', m => showCounts === 'bar' ? m.y + swatchSize/5 : m.y + swatchSize/2)\n .attr('fill', m => m.colour)\n .attr('height', showCounts === 'bar' ? swatchSize : 2)\n\n const lt = svgChart.selectAll('.brc-legend-item-text')\n .data(legendItems, m => gen.safeId(m.label))\n .join(enter => {\n const text = enter.append(\"text\")\n .attr(\"class\", m=> `brc-legend-item brc-legend-item-text temporal-graphic temporal-${m.prop}`)\n .text(m => m.label)\n .style('font-size', legendFontSize)\n return text\n })\n .attr('x', m => m.x + swatchSize * swatchFact)\n .attr('y', m => m.y + legendFontSize * 1)\n\n addEventHandlers(ls, 'prop', svgChart, interactivity)\n addEventHandlers(lt, 'prop', svgChart, interactivity)\n\n return swatchSize * swatchFact * (rows + 1)\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.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 calulated 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} 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 ((source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84') || ((dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM) && 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 }\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 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];\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, this.cos_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, this.cos_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, this.cos_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, this.cos_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 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';\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}","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","export const constants = {\n thisCdn: 'https://cdn.jsdelivr.net/gh/biologicalrecordscentre/brc-charts@latest/dist'\n}","import { pie } from './src/pie/pie'\nimport { phen1 } from './src/phen1/phen1'\nimport { phen2 } from './src/phen2'\nimport { accum } from './src/accum'\nimport { links } from './src/links'\nimport { trend } from './src/trend'\nimport { trend2 } from './src/trend2/trend2'\nimport { trend3 } from './src/trend3/trend3'\nimport { density } from './src/density/density'\nimport { bar } from './src/bar/bar'\nimport { yearly } from './src/yearly/yearly'\nimport { temporal } from './src/temporal/temporal'\nimport { altlat } from './src/altlat'\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 pie,\n phen1,\n phen2,\n accum,\n links,\n trend,\n trend2,\n trend3,\n density,\n bar,\n yearly,\n temporal,\n altlat\n} ","/** @module accum */\n\nimport * as d3 from 'd3'\nimport * as gen from './general'\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.elid - The id for the dom object created.\n * @param {number} opts.width - The width of the main chart area in pixels (excludes margins).\n * @param {number} opts.height - The height of the main chart area in pixels (excludes margins).\n * @param {Object} opts.margin - An object indicating the margins to add around the main chart area. \n * @param {number} opts.margin.left - Left margin in pixels. \n * @param {number} opts.margin.right - Right margin in pixels. \n * @param {number} opts.margin.top - Top margin in pixels. \n * @param {number} opts.margin.bottom - Bottom margin in pixels. \n * @param {boolean} opts.expand - Indicates whether or not the chart will expand to fill parent element and scale as that element resized.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {string} opts.legendFontSize - Font size (pixels) of legend item text.\n * @param {string} opts.axisLeft - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis.\n * @param {string} opts.axisBottom - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis.\n * @param {string} opts.axisRight - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis.\n * @param {string} opts.axisTop - If set to 'on' line is drawn otherwise not.\n * @param {string} opts.axisTaxaLabel - Value for labelling taxa accumulation axis.\n * @param {string} opts.axisCountLabel - Value for labelling count accumulation axis.\n * @param {string} opts.axisLabelFontSize - Font size (pixels) for axis labels.\n * @param {string} opts.show - Indicates whether to show accumulation curves for taxa, counts or both. Permitted values: 'taxa', 'counts' or 'both'.\n * @param {boolean} opts.swapYaxes - The default display is number of taxa on left axis and counts on right. Set this to true to swap that.\n * @param {number} opts.duration - The duration of each transition phase in milliseconds.\n * @param {string} opts.interactivity - Specifies how item highlighting occurs. Can be 'mousemove', 'mouseclick' or 'none'.\n * If empty, graphs for all taxa are created.\n * @param {Array.} opts.metrics - An array of objects, each describing a numeric property in the input\n * data for which taxa and/or count accumulation lines should be generated on the chart.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • prop - the name of the numeric property in the data (count properties - 'c1' or 'c2' in the example below).\n *
  • labelTaxa - a label for the taxa accumulation metric.\n *
  • labelCounts - a label for the counts accumulation metric.\n *
  • key - a base key for this metric. If the options are updated using the setChartOpts API method, then if this value is set, it is used to uniquely identify the graphic elements. If not set, then the label is used.\n *
  • ColourTaxa - optional colour to give the line for the taxa accumulation metric. Any accepted way of specifying web colours can be used. Use the special term 'fading' to successively fading shades of grey.\n *
  • ColourCounts - optional colour to give the line for the counts accumulation metric. Any accepted way of specifying web colours can be used. Use the special term 'fading' to successively fading shades of grey.\n *
  • styleTaxa - options style to give the line for the taxa accumulation metric. Accepted value is 'dashed' which results in a dashed line. Anything else results in a solid line.\n *
  • styleCounts - options style to give the line for the counts accumulation metric. Accepted value is 'dashed' which results in a dashed line. Anything else results in a solid line.\n *
\n * @param {Array.} opts.data - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • taxon - name of a taxon.\n *
  • week - a number between 1 and 53 indicating the week of the year.\n *
  • c1 - a count for a given time period (can have any name). \n *
  • c2 - a count for a given time period (can have any name).\n * ... - there can be any number of these count columns.\n *
\n * @returns {module:accum~api} api - Returns an API for the chart.\n */\n\nexport function accum({\n // Default options in here\n selector = 'body',\n elid = 'accum-chart',\n width = 300,\n height = 200,\n margin = {left: 0, right: 0, top: 0, bottom: 0},\n ytype = 'count',\n expand = false,\n title = '',\n subtitle = '',\n footer = '',\n titleFontSize = 24,\n subtitleFontSize = 16,\n footerFontSize = 10,\n legendFontSize = 16,\n titleAlign = 'left',\n subtitleAlign = 'left',\n footerAlign = 'left',\n axisLeft = 'tick',\n axisBottom = 'tick',\n axisRight = 'tick',\n axisTop = '',\n axisTaxaLabel = '',\n axisCountLabel = '',\n axisLabelFontSize = 10,\n show = 'both',\n swapYaxes = false,\n duration = 1000,\n interactivity = 'mousemove',\n data = [],\n metrics = []\n} = {}) {\n\n let metricsPlus\n \n const mainDiv = d3.select(`${selector}`)\n .append('div')\n .attr('id', elid)\n .attr('class', 'brc-chart-accum')\n .style('position', 'relative')\n .style('display', 'inline')\n\n const svg = mainDiv.append('svg')\n svg.on(\"click\", function() {\n if (interactivity === 'mouseclick') {\n highlightItem(null, null, false)\n }\n })\n\n const svgChart = svg.append('svg').attr('class', 'mainChart')\n\n preProcessMetrics()\n makeChart()\n\n // Texts must come after chart because \n // the chart width is required\n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n gen.positionMainElements(svg, expand)\n\n function preProcessMetrics () {\n // Look for 'fading' colour in taxa and colour appropriately \n // in fading shades of grey.\n \n let iFadingTaxa = 0\n let iFadingCounts = 0\n let iFadeTaxa, iFadeCounts, strokeWidth\n metricsPlus = metrics.map(m => {\n if (m.colourCounts === 'fading') {\n iFadeCounts = ++iFadingCounts\n strokeWidth = 1\n } else {\n strokeWidth = 2\n }\n if (m.colourTaxa === 'fading') {\n iFadeTaxa = ++iFadingTaxa\n strokeWidth = 1\n } else {\n strokeWidth = 2\n }\n\n return {\n prop: m.prop,\n key: m.key,\n labelTaxa: m.labelTaxa,\n labelCounts: m.labelCounts,\n colourTaxa: m.colourTaxa,\n colourCounts: m.colourCounts,\n styleTaxa: m.styleTaxa,\n styleCounts: m.styleCounts,\n fadingTaxa: iFadeTaxa,\n fadingCounts: iFadeCounts,\n strokeWidth: strokeWidth\n }\n }).reverse()\n\n const greyTaxa = d3.scaleLinear()\n .range(['#808080', '#E0E0E0'])\n .domain([1, iFadeTaxa])\n const greyCounts = d3.scaleLinear()\n .range(['#808080', '#E0E0E0'])\n .domain([1, iFadeCounts])\n\n metricsPlus.forEach(m => {\n if (m.fadingTaxa) {\n m.colourTaxa = greyTaxa(m.fadingTaxa)\n }\n if (m.fadingCounts) {\n m.colourCounts = greyCounts(m.fadingCounts)\n }\n })\n }\n\n function makeChart () {\n\n const showTaxa = (show === 'taxa' || show === 'both')\n const showCounts = (show === 'counts' || show === 'both') \n let lineData = [] \n\n metricsPlus.forEach(m => {\n\n const pointsTaxa = []\n const pointsCount = []\n let accumTaxa = []\n let accumCount = 0\n\n for (let week = 1; week <= 53; week++) {\n // Taxa for this week and property (normally a year)\n // Must have at least one non-zero) count to contribute to taxa count\n const weekStats = data.filter(d => d.week === week).reduce((a, d) => {\n a.total = a.total + d[m.prop]\n if (!a.taxa.includes(d.taxon) && d[m.prop]) {\n a.taxa.push(d.taxon)\n }\n return(a)\n }, {total: 0, taxa: []})\n\n accumTaxa = [...new Set([...accumTaxa, ...weekStats.taxa])]\n accumCount = accumCount + weekStats.total\n pointsTaxa.push({\n num: weekStats.taxa.length,\n accum: accumTaxa.length,\n week: week\n })\n pointsCount.push({\n num: weekStats.total,\n accum: accumCount,\n week: week\n })\n }\n\n if (showTaxa) {\n lineData.push({\n id: `${gen.safeId(m.labelTaxa)}`,\n key: m.key ? `${m.key}_taxa` : `${gen.safeId(m.labelTaxa)}`,\n type: 'taxa',\n label: m.labelTaxa,\n colour: m.colourTaxa,\n style: m.styleTaxa,\n strokeWidth: m.strokeWidth,\n max: Math.max(...pointsTaxa.map(p => p.accum)),\n points: pointsTaxa\n })\n }\n\n if (showCounts){\n lineData.push({\n id: `${gen.safeId(m.labelCounts)}`,\n key: m.key ? `${m.key}_counts` : `${gen.safeId(m.labelCounts)}`,\n type: 'count',\n label: m.labelCounts,\n colour: m.colourCounts,\n style: m.styleCounts,\n strokeWidth: m.strokeWidth,\n max: Math.max(...pointsCount.map(p => p.accum)),\n points: pointsCount\n })\n }\n })\n\n // Do the legend\n const legendHeight = makeLegend(lineData)\n\n // Value scales\n const xScale = d3.scaleLinear().domain([1, 53]).range([0, width])\n let yScaleCount, yScaleTaxa\n if (showCounts) {\n yScaleCount = d3.scaleLinear().domain([0, Math.max(...lineData.filter(l => l.type ==='count').map(l => l.max))]).range([height, 0])\n }\n if (showTaxa) {\n yScaleTaxa = d3.scaleLinear().domain([0, Math.max(...lineData.filter(l => l.type ==='taxa').map(l => l.max))]).range([height, 0])\n }\n\n // Top axis\n let tAxis\n if (axisTop === 'on') {\n tAxis = d3.axisTop()\n .scale(xScale)\n .tickValues([])\n .tickSizeOuter(0)\n }\n\n // Bottom axis\n let xAxis\n if (axisBottom === 'on' || axisBottom === 'tick') {\n xAxis = gen.xAxisMonth(width, axisBottom === 'tick')\n }\n\n const yScaleRight = swapYaxes ? yScaleTaxa : yScaleCount\n const yScaleLeft = swapYaxes ? yScaleCount : yScaleTaxa\n \n // Left axis\n let yAxisLeft\n if (axisLeft === 'on' || axisLeft === 'tick') {\n if (yScaleLeft) {\n yAxisLeft = d3.axisLeft()\n .scale(yScaleLeft)\n .ticks(5)\n if (axisLeft !== 'tick') {\n yAxisLeft.tickValues([]).tickSizeOuter(0)\n } else if (ytype === 'count') {\n yAxisLeft.tickFormat(d3.format(\"d\"))\n }\n } else {\n yAxisLeft = d3.axisLeft()\n .scale(d3.scaleLinear().range([height, 0]))\n .tickValues([])\n .tickSizeOuter(0)\n }\n }\n // Right axis\n let yAxisRight\n if (axisRight === 'on' || axisRight === 'tick') {\n if (yScaleRight) {\n yAxisRight = d3.axisRight()\n .scale(yScaleRight)\n .ticks(5)\n if (axisRight !== 'tick') {\n yAxisRight.tickValues([]).tickSizeOuter(0)\n } else if (ytype === 'count') {\n yAxisRight.tickFormat(d3.format(\"d\"))\n }\n } else {\n yAxisRight = d3.axisRight()\n .scale(d3.scaleLinear().range([height, 0]))\n .tickValues([])\n .tickSizeOuter(0)\n }\n }\n \n // Line path generators\n let lineTaxa\n if (showTaxa) {\n lineTaxa = d3.line()\n .curve(d3.curveMonotoneX)\n .x(d => xScale(d.week))\n .y(d => yScaleTaxa(d.accum))\n }\n\n let lineCount\n if (showCounts) {\n lineCount = d3.line()\n .curve(d3.curveMonotoneX)\n .x(d => xScale(d.week))\n .y(d => yScaleCount(d.accum))\n }\n\n // Create or get the relevant chart svg\n let init, svgAccum, gAccum\n if (svgChart.select('.brc-chart-accum').size()) {\n svgAccum = svgChart.select('.brc-chart-accum')\n gAccum = svgAccum.select('.brc-chart-accum-g')\n init = false\n } else {\n svgAccum = svgChart.append('svg')\n .classed('brc-chart-accum', true)\n .style('overflow', 'visible')\n gAccum = svgAccum.append('g')\n .classed('brc-chart-accum-g', true)\n init = true\n }\n \n // Create/update the line paths with D3\n const mlines = gAccum.selectAll(\"path\")\n .data(lineData, d => d.key)\n \n const eLines = mlines.enter()\n .append(\"path\")\n //.attr(\"class\", d => `accum-path accum-path-${d.id}`)\n .attr(\"class\", d => `accum-path accum-path-${d.key}`)\n .style(\"fill\", \"none\")\n .attr(\"d\", d => {\n const lineGen = d.type === 'taxa' ? lineTaxa : lineCount\n return lineGen(d.points.map(p => {\n return {\n accum: 0,\n week: p.week\n }\n }))\n })\n\n addEventHandlers(eLines)\n\n mlines.merge(eLines)\n .transition()\n .duration(duration)\n .attr(\"d\", d => {\n const lineGen = d.type === 'taxa' ? lineTaxa : lineCount\n return lineGen(d.points)\n })\n .attr(\"stroke\", d => d.colour)\n .attr(\"stroke-dasharray\", d => d.style === 'dashed' ? '5,5' : '')\n .attr(\"stroke-width\", d => d.strokeWidth)\n\n mlines.exit()\n .transition()\n .duration(duration)\n .attr(\"d\", d => {\n const lineGen = d.type === 'taxa' ? lineTaxa : lineCount\n return lineGen(d.points.map(p => {\n return {\n accum: 0,\n week: p.week\n }\n }))\n })\n .remove()\n\n if (init) {\n const axisLeftPadX = margin.left ? margin.left : 0\n const axisRightPadX = margin.right ? margin.right : 0\n const axisBottomPadY = margin.bottom ? margin.bottom : 0\n const axisTopPadY = margin.top ? margin.top : 0\n\n // Size SVG\n svgAccum\n .attr('width', width + axisLeftPadX + axisRightPadX)\n .attr('height', height + axisBottomPadY + axisTopPadY + legendHeight)\n\n // Position chart\n gAccum.attr(\"transform\", `translate(${axisLeftPadX},${legendHeight + axisTopPadY})`)\n \n // Create axes and position within SVG\n const leftYaxisTrans = `translate(${axisLeftPadX},${legendHeight + axisTopPadY})`\n const leftYaxisLabelTrans = `translate(${axisLabelFontSize},${legendHeight + axisTopPadY + height/2}) rotate(270)`\n const rightYaxisTrans = `translate(${axisLeftPadX + width}, ${legendHeight + axisTopPadY})`\n const rightYaxisLabelTrans = `translate(${axisLeftPadX + width + axisRightPadX - axisLabelFontSize}, ${legendHeight + axisTopPadY + height/2}) rotate(90)`\n\n if (yAxisLeft) {\n const axisLabelClass = swapYaxes ? 'brc-accum-axis-count' : 'brc-accum-axis-taxa'\n const gYaxisLeft = svgAccum.append(\"g\")\n .attr(\"class\", \"y-axis y-axis-left\")\n .classed(axisLabelClass, true)\n gYaxisLeft.attr(\"transform\", leftYaxisTrans)\n\n if ((!swapYaxes && showTaxa) || (swapYaxes && showCounts )) {\n const axisLeftLabel = swapYaxes ? axisCountLabel : axisTaxaLabel\n const tYaxisLeftLabel = svgAccum.append(\"text\")\n .classed(axisLabelClass, true)\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisLeftLabel) \n tYaxisLeftLabel.attr(\"transform\", leftYaxisLabelTrans)\n }\n }\n\n if (yAxisRight) {\n const axisLabelClass = swapYaxes ? 'brc-accum-axis-taxa' : 'brc-accum-axis-count'\n const gYaxisCount = svgAccum.append(\"g\")\n .attr(\"class\", \"y-axis y-axis-right\")\n .classed(axisLabelClass, true)\n gYaxisCount.attr(\"transform\", rightYaxisTrans)\n\n if ((!swapYaxes && showCounts) || (swapYaxes && showTaxa )) {\n const axisRightLabel = swapYaxes ? axisTaxaLabel : axisCountLabel\n const tYaxisCountLabel = svgAccum.append(\"text\")\n .classed(axisLabelClass, true)\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisRightLabel) \n tYaxisCountLabel.attr(\"transform\", rightYaxisLabelTrans)\n }\n }\n\n if (xAxis) {\n const gXaxis = svgAccum.append(\"g\")\n .attr(\"class\", \"x axis\")\n .call(xAxis)\n\n gXaxis.selectAll(\".tick text\")\n .style(\"text-anchor\", \"start\")\n .attr(\"x\", 6)\n .attr(\"y\", 6)\n\n gXaxis.attr(\"transform\", `translate(${axisLeftPadX},${legendHeight + axisTopPadY + height})`)\n }\n if (tAxis) {\n const gTaxis = svgAccum.append(\"g\")\n .call(tAxis)\n gTaxis.attr(\"transform\", `translate(${axisLeftPadX},${legendHeight + axisTopPadY})`)\n }\n }\n\n if (yAxisLeft) {\n svgAccum.select(\".y-axis-left\")\n .transition()\n .duration(duration)\n .call(yAxisLeft)\n }\n\n if (yAxisRight) {\n svgAccum.select(\".y-axis-right\")\n .transition()\n .duration(duration)\n .call(yAxisRight)\n }\n\n svgChart.attr(\"width\", svgAccum.attr('width'))\n svgChart.attr(\"height\", svgAccum.attr('height'))\n\n return svgAccum\n }\n\n function makeLegend (lineData) {\n\n const legendWidth = width + margin.left + margin.right\n const swatchSize = 20\n const swatchFact = 1.3\n\n // Loop through all the legend elements and work out their positions\n // based on swatch size, item label text size and legend width.\n const metricsReversed = gen.cloneData(lineData).reverse()\n\n let rows = 0\n let lineWidth = -swatchSize\n metricsReversed.forEach(m => {\n const tmpText = svgChart.append('text')\n .text(m.label)\n .style('font-size', legendFontSize)\n\n const widthText = tmpText.node().getBBox().width\n tmpText.remove()\n\n if (lineWidth + swatchSize + swatchSize * swatchFact + widthText > legendWidth) {\n ++rows\n lineWidth = -swatchSize\n }\n m.x = lineWidth + swatchSize\n m.y = rows * swatchSize * swatchFact\n\n lineWidth = lineWidth + swatchSize + swatchSize * swatchFact + widthText\n })\n \n const ls = svgChart.selectAll('.brc-legend-item-rect')\n .data(metricsReversed, m => m.key)\n .join(enter => {\n const path = enter.append(\"path\")\n .attr(\"class\", m => `brc-legend-item brc-legend-item-rect brc-legend-item-${m.key}`)\n .attr('d', m => `M ${m.x} ${m.y + swatchSize/2} L ${m.x + swatchSize} ${m.y + swatchSize/2}`)\n return path\n })\n .attr('fill', m => m.colour)\n .attr(\"stroke\", m => m.colour)\n .attr(\"stroke-dasharray\", m => m.style === 'dashed' ? '5,5' : '')\n .attr(\"stroke-width\", m => m.strokeWidth)\n\n const lt = svgChart.selectAll('.brc-legend-item-text')\n .data(metricsReversed, m => m.key)\n .join(\n enter => {\n const text = enter.append(\"text\")\n .attr(\"class\", m=> `brc-legend-item brc-legend-item-text brc-legend-item-${m.key}`)\n .style('font-size', legendFontSize)\n return text\n })\n .text(m => m.label)\n .attr('x', m => m.x + swatchSize * swatchFact)\n .attr('y', m => m.y + legendFontSize * 1)\n\n addEventHandlers(ls)\n addEventHandlers(lt)\n\n return swatchSize * swatchFact * (rows + 1)\n }\n\n function highlightItem(key, type, highlight) {\n\n // Graph lines\n svgChart.selectAll('.accum-path')\n .classed('lowlight', highlight)\n\n svgChart.selectAll(`.accum-path-${key}`)\n .classed('lowlight', false)\n \n svgChart.selectAll(`.accum-path`)\n .classed('highlight', false)\n\n if (key) {\n svgChart.selectAll(`.accum-path-${key}`)\n .classed('highlight', highlight)\n }\n \n // Legend items\n svgChart.selectAll('.brc-legend-item')\n .classed('lowlight', highlight)\n\n if (key) {\n svgChart.selectAll(`.brc-legend-item-${key}`)\n .classed('lowlight', false)\n }\n\n if (key) {\n svgChart.selectAll(`.brc-legend-item-${key}`)\n .classed('highlight', highlight)\n } else {\n svgChart.selectAll(`.brc-legend-item`)\n .classed('highlight', false)\n }\n\n // Axes and axis labels\n svgChart.selectAll('.brc-accum-axis-taxa, .brc-accum-axis-count')\n .classed('lowlight', highlight)\n\n if (key) {\n svgChart.selectAll(`.brc-accum-axis-${type}`)\n .classed('lowlight', false)\n }\n\n if (key) {\n svgChart.selectAll(`.brc-accum-axis-${type}`)\n .classed('highlight', highlight)\n } else {\n svgChart.selectAll(`.brc-accum-axis-taxa, .brc-accum-axis-count`)\n .classed('highlight', false)\n }\n }\n\n function addEventHandlers(sel) {\n sel\n .on(\"mouseover\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d.key, d.type, true)\n }\n })\n .on(\"mouseout\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d.key, d.type, false)\n }\n })\n .on(\"click\", function(d) {\n if (interactivity === 'mouseclick') {\n highlightItem(d.key, d.type, true)\n d3.event.stopPropagation()\n }\n })\n }\n\n/** @function setChartOpts\n * @param {Object} opts - text options.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {Array.} opts.metrics - An array of objects, each describing a numeric property in the input data (see main interface for details).\n * @param {Array.} opts.data - Specifies an array of data objects (see main interface for details).\n * @description This function is exposed as a method on the API returned from the accum function.\n * Set's the value of the chart data, title, subtitle and/or footer. If an element is missing from the \n * options object, it's value is not changed.\n */\n function setChartOpts(opts){\n\n if ('title' in opts) {\n title = opts.title\n }\n if ('subtitle' in opts) {\n subtitle = opts.subtitle\n }\n if ('footer' in opts) {\n footer = opts.footer\n }\n if ('titleFontSize' in opts) {\n titleFontSize = opts.titleFontSize\n }\n if ('subtitleFontSize' in opts) {\n subtitleFontSize = opts.subtitleFontSize\n }\n if ('footerFontSize' in opts) {\n footerFontSize = opts.footerFontSize\n }\n if ('titleAlign' in opts) {\n titleAlign = opts.titleAlign\n }\n if ('subtitleAlign' in opts) {\n subtitleAlign = opts.subtitleAlign\n }\n if ('footerAlign' in opts) {\n footerAlign = opts.footerAlign\n }\n\n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n\n let remakeChart = false\n\n if ('data' in opts) {\n data = opts.data\n remakeChart = true\n }\n\n if ('metrics' in opts) {\n metrics = opts.metrics\n preProcessMetrics()\n remakeChart = true\n }\n\n if (remakeChart) makeChart()\n gen.positionMainElements(svg, expand)\n }\n\n\n/** @function getChartWidth\n * @description This function is exposed as a method on the API returned from the accum function.\n * Return the full width of the chart svg.\n */\n function getChartWidth(){\n return svg.attr(\"width\") ? svg.attr(\"width\") : svg.attr(\"viewBox\").split(' ')[2]\n }\n\n/** @function getChartHeight\n * @description This function is exposed as a method on the API returned from the accum function.\n * Return the full height of the chart svg.\n */\n function getChartHeight(){\n return svg.attr(\"height\") ? svg.attr(\"height\") : svg.attr(\"viewBox\").split(' ')[3]\n }\n\n/** @function saveImage\n * @param {boolean} asSvg - If true, file is generated as SVG, otherwise PNG.\n * @param {string} filename - Name of the file (without extension) to generate and download.\n * If 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 promise's 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 accum function.\n * Download the chart as an image file.\n */\n function saveImage(asSvg, filename){\n return gen.saveChartImage(svg, expand, asSvg, filename) \n }\n\n /**\n * @typedef {Object} api\n * @property {module:accum~getChartWidth} getChartWidth - Gets and returns the current width of the chart.\n * @property {module:accum~getChartHeight} getChartHeight - Gets and returns the current height of the chart. \n * @property {module:accum~setChartOpts} setChartOpts - Sets text options for the chart. \n * @property {module:accum~setChartOpts} setTaxon - Changes the displayed taxon for single taxon charts. \n * @property {module:accum~saveImage} saveImage - Generates and downloads and image file for the SVG. \n */\n return {\n getChartHeight: getChartHeight,\n getChartWidth: getChartWidth,\n setChartOpts: setChartOpts,\n saveImage: saveImage\n }\n\n}","/** @module altlat */\n\nimport * as d3 from 'd3'\nimport { makeText, positionMainElements, safeId, saveChartImage, transPromise } from './general'\nimport { getCentroid } from 'brc-atlas-bigr'\nimport { constants } from './constants.js'\nimport backData from './altlat.json'\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. (Default - 'body'.)\n * @param {string} opts.elid - The id for the dom object created. (Default - 'altlat-chart'.)\n * @param {number} opts.width - The width of each sub-chart area in pixels. (Default - 300.)\n * @param {number} opts.height - The height of the each sub-chart area in pixels. (Default - 200.)\n * @param {Object} opts.margin - An object indicating the margins to add around each sub-chart area.\n * @param {number} opts.margin.left - Left margin in pixels. (Default - 40.)\n * @param {number} opts.margin.right - Right margin in pixels. (Default - 40.)\n * @param {number} opts.margin.top - Top margin in pixels. (Default - 20.)\n * @param {number} opts.margin.bottom - Bottom margin in pixels. (Default - 20.)\n * @param {number} opts.perRow - The number of sub-charts per row. (Default - 2.)\n * @param {boolean} opts.expand - Indicates whether or not the chart will expand to fill parent element and scale as that element resized. (Default - false.)\n * @param {string } opts.font - Font to use for chart. (Default - sans-serif.)\n * @param {string} opts.title - Title for the chart. (Default - ''.)\n * @param {string} opts.subtitle - Subtitle for the chart. (Default - ''.)\n * @param {string} opts.footer - Footer for the chart. (Default - ''.)\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title. (Default - 24.)\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle. (Default - 16.)\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer. (Default - 10.)\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {boolean} opts.showTaxonLabel - Whether or not to show taxon label above each sub-graph. (Default - true.)\n * @param {boolean} opts.showLegend - Whether or not to show an overall chart legend. (Default - true.)\n * @param {string} opts.taxonLabelFontSize - Font size (pixels) of taxon sub-chart label. (Default - 10.)\n * @param {boolean} opts.taxonLabelItalics - Whether or not to italicise taxon label.(Default - true.)\n * @param {string} opts.legendFontSize - Font size (pixels) of legend item text. (Default - 10.)\n * @param {number | null} opts.legendSpacing - A value (pixels) the separate the centres of the legend cirles. If not set, calcualted automatically. (Default - null.)\n * @param {string} opts.legendBaseline - Allows the 'dominant-baseline' CSS property to be set on legend text. (Default - 'central'.)\n * @param {number} opts.legendXoffset - Allows the legend to be positioned precisely. This is the x value in pixels. (Default - 1050.)\n * @param {number} opts.legendYoffset - Allows the legend to be positioned precisely. This is the y value in pixels. (Default - 1150.)* @param {string} opts.axisLeftLabel - Value for labelling left axis. (Default - 'Altitude (m)'.)\n * @param {string} opts.axisBottomLabel - Value for labelling bottom axis. (Default - 'Distance north (km)'.)\n * @param {string} opts.axisLabelFontSize - Font size (pixels) for axist labels. (Default - 10.)\n * @param {string} opts.axisLeft - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis. (Default - 'tick'.)\n * @param {string} opts.axisRight - If set to 'on' line is drawn without ticks. Any other value results in no axis. (Default - ''.)\n * @param {string} opts.axisTop - If set to 'on' line is drawn without ticks. Any other value results in no axis. (Default - ''.)\n * @param {string} opts.axisBottom - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis. (Default - 'tick'.)\n * @param {string | number | null} opts.axisTickFontSize - Sets the font size of the axis values. Will accept any valid SVG font-size units. If not set, uses D3 default. (Default - null.)\n * @param {boolean} opts.yAxisLabelToTop - If set to true the y-axis label is moved to the top of the axis and not rotated. (Default - false.)\n * @param {string | number} opts.lineWidth - Sets the stroke-width of all lines on the chart. Can use any permitted SVG stroke-width units. (Default - 1.)\n * @param {number} opts.duration - The duration of each transition phase in milliseconds. (Default - 1000.)\n * @param {string} opts.interactivity - Specifies how item highlighting occurs. Can be 'mousemove', 'mouseclick', 'toggle' or 'none'. (Default - 'none'.)\n * @param {Array.} opts.data - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n * For each taxon, there is assumed to be a single data item for each rounded distance/altitude combination for which there is a metric value.\n *
    \n *
  • taxon - The taxon for which this point refers.\n *
  • distance - The distance north (OS northing) in kilometers rounded down to the nearest 50 km.\n *
  • altitude - The altitude (asl) in metres rounded down to the nearest 100 m.\n *
  • metric - a metric (number) for the given distance and altitude. \n *
\n * @param {Array.} opts.ranges - Specifies an array of objects defining ranges for displaying the metrics.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order affects how they appear in the legend.)\n *
    \n *
  • min - The minimum metric value to be included in this range.\n *
  • max - The maximum metric value to be included in this range.\n *
  • radius - The radius of the dot to be drawn for this range.\n *
  • legend - Text for the legend item for this range. \n *
\n * @param {Array.} opts.taxa - An array of taxa (names), indicating which taxa create charts for. \n * If empty, graphs for all taxa are created. (Default - [].)\n * @returns {module:altlat~api} api - Returns an API for the chart.\n */\n\nexport function altlat({\n // Default options in here\n selector = 'body',\n elid = 'altlat-chart',\n width = 300,\n height = 200,\n margin = {left: 30, right: 30, top: 15, bottom: 15},\n perRow = 2,\n expand = false,\n title = '',\n subtitle = '',\n footer = '',\n font = 'sans-serif',\n lineWidth = 1,\n titleFontSize = 24,\n subtitleFontSize = 16,\n footerFontSize = 10,\n legendFontSize = 10,\n showLegend = true,\n legendSpacing = null,\n axisLeftLabel = 'Altitude (m)',\n axisBottomLabel = 'Distance north (km)',\n axisLabelFontSize = 10,\n axisTickFontSize = null,\n yAxisLabelToTop = false,\n legendBaseline = 'central',\n legendXoffset = 1050,\n legendYoffset = 1150,\n titleAlign = 'left',\n subtitleAlign = 'left',\n footerAlign = 'left',\n showTaxonLabel = true,\n taxonLabelFontSize = 10,\n taxonLabelItalics = false,\n axisLeft = 'tick',\n axisBottom = 'tick',\n axisRight = '',\n axisTop = '',\n duration = 1000,\n interactivity = 'none',\n data = [],\n taxa = [],\n ranges = [],\n} = {}) {\n\n const mainDiv = d3.select(`${selector}`)\n .append('div')\n .attr('id', elid)\n .style('position', 'relative')\n .style('display', 'inline')\n\n const svg = mainDiv.append('svg')\n svg.on(\"click\", function() {\n if (interactivity === 'mouseclick') {\n highlightItem({}, false)\n }\n })\n\n const svgChart = svg.append('svg').attr('class', 'mainChart brc-chart-altlat')\n\n // Value scales\n const xScale = d3.scaleLinear().domain([0, 1250]).range([0, width])\n const yScale = d3.scaleLinear().domain([0, 1200]).range([height, 0])\n \n makeChart().then(() => {\n // Texts must come after chartbecause \n // the chart width is required\n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n positionMainElements(svg, expand)\n\n svg.selectAll('rect, path, line').style('stroke-width', lineWidth)\n })\n \n function makeChart () {\n\n // If taxa for graphs not set, set to all in dataset\n if (!taxa.length) {\n taxa = data.map(d => d.taxon).filter((v, i, a) => a.indexOf(v) === i)\n }\n\n const subChartPad = 10\n const pSvgsTaxa = taxa.map(t => makeAltLat(t))\n\n return Promise.all(pSvgsTaxa).then(svgsTaxa => {\n const subChartWidth = Number(svgsTaxa[0].attr(\"width\"))\n const subChartHeight = Number(svgsTaxa[0].attr(\"height\"))\n\n svgsTaxa.forEach((svgTaxon, i) => {\n \n const col = i%perRow\n const row = Math.floor(i/perRow)\n\n svgTaxon.attr(\"x\", col * (subChartWidth + subChartPad))\n svgTaxon.attr(\"y\", row * (subChartHeight + subChartPad))\n })\n\n svgChart.attr(\"width\", perRow * (subChartWidth + subChartPad))\n svgChart.attr(\"height\", Math.ceil(svgsTaxa.length/perRow) * (subChartHeight + subChartPad))\n })\n }\n\n function makeAltLat (taxon) {\n\n // Filter out any empty rows\n data = data.filter(d => d.metric !== 0)\n\n // Top axis\n let tAxis\n if (axisTop === 'on') {\n tAxis = d3.axisTop()\n .scale(xScale) // Actual scale doesn't matter, but needs one\n .tickValues([])\n .tickSizeOuter(0)\n }\n\n // Bottom axis\n let bAxis\n if (axisBottom === 'on' || axisBottom === 'tick') {\n const tickVals = axisBottom === 'tick' ? [200, 400, 600, 800, 1000, 1200] : []\n bAxis = d3.axisBottom()\n .scale(xScale)\n .tickValues(tickVals) // km north\n .tickFormat(d3.format(\"d\"))\n .tickSizeOuter(0)\n }\n\n // Left axis\n let lAxis\n if (axisLeft === 'on' || axisLeft === 'tick') {\n const tickVals = axisLeft === 'tick' ? [200, 400, 600, 800, 1000, 1200] : []\n lAxis = d3.axisLeft()\n .scale(yScale)\n .tickValues(tickVals) // m above sea level\n .tickFormat(d3.format(\"d\"))\n .tickSizeOuter(0)\n }\n\n // right axis\n let rAxis\n if (axisRight === 'on') {\n rAxis = d3.axisRight()\n .scale(yScale) // Actual scale doesn't matter, but needs one\n .tickValues([])\n .tickSizeOuter(0)\n }\n\n // Create or get the relevant chart svg\n let init, svgAltLat, gAltLat\n if (taxa.length === 1 && svgChart.selectAll('.brc-chart-altlat').size() === 1) {\n svgAltLat = svgChart.select('.brc-chart-altlat')\n gAltLat = svgAltLat.select('.brc-chart-altlat-g')\n init = false\n } else if (svgChart.select(`#${safeId(taxon)}`).size()) {\n svgAltLat = svgChart.select(`#${safeId(taxon)}`)\n gAltLat = svgAltLat.select('.brc-chart-altlat-g')\n init = false\n } else {\n svgAltLat = svgChart.append('svg')\n .classed('brc-chart-altlat', true)\n .attr('id', safeId(taxon))\n .style('overflow', 'visible')\n gAltLat = svgAltLat.append('g')\n .classed('brc-chart-altlat-g', true)\n init = true\n }\n\n const backSquareWidth = xScale(50)\n const backSquareHeight = height - yScale(100)\n\n // Create the background squares\n gAltLat.selectAll(\"rect\")\n .data(backData)\n .join(\n enter => enter.append(\"rect\")\n .attr('width',backSquareWidth)\n .attr('height',backSquareHeight)\n .attr('stroke', 'black')\n .attr('stroke-width', 0.5)\n .attr('fill', d => {\n if (d[1] < 200) {\n return 'white'\n }\n if (d[1] < 400) {\n return '#CCE192'\n }\n if (d[1] < 600) {\n return '#AED367'\n }\n if (d[1] < 800) {\n return '#ECDA49'\n }\n if (d[1] < 1000) {\n return '#D9A738'\n }\n return '#BE8D66'\n })\n .attr('y', d => yScale(d[1]) - backSquareHeight)\n .attr('x', d => xScale(d[0])),\n )\n \n // Create the metric circles\n const t = svgAltLat.transition()\n .duration(duration)\n\n const mainTrans = gAltLat.selectAll(\".brc-altlat-metric-circle\")\n .data(data, d => `${d.distance}-${d.altitude}`)\n .join(\n enter => enter.append(\"circle\")\n .attr(\"r\", 0)\n .attr(\"cx\", d => xScale(d.distance + 25))\n .attr(\"cy\", d => yScale(d.altitude + 50)),\n update => update,\n exit => exit\n .call(exit => exit.transition(t)\n .attr(\"r\", 0)\n .remove())\n )\n .attr(\"class\", d => `brc-altlat-metric-circle brc-altlat brc-altlat-${getRadius(d.metric)}`)\n .transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr(\"r\", d => xScale(getRadius(d.metric)))\n\n addEventHandlers(gAltLat.selectAll(\".brc-altlat-metric-circle\"))\n \n if (init) {\n\n // Constants for positioning\n const axisLeftPadX = margin.left ? margin.left : 0\n const axisRightPadX = margin.right ? margin.right : 0\n const axisBottomPadY = margin.bottom ? margin.bottom : 0\n const axisTopPadY = margin.top ? margin.top : 0\n\n // Taxon title\n if (showTaxonLabel) {\n const taxonLabel = svgAltLat\n .append('text')\n .classed('brc-chart-altlat-label', true)\n .text(taxon)\n .style('font-family', font)\n .style('font-size', taxonLabelFontSize)\n .style('font-style', taxonLabelItalics ? 'italic' : '')\n\n const labelHeight = taxonLabel.node().getBBox().height\n taxonLabel.attr(\"transform\", `translate(${axisLeftPadX}, ${labelHeight})`)\n }\n \n // Size SVG\n svgAltLat\n .attr('width', width + axisLeftPadX + axisRightPadX)\n .attr('height', height + axisBottomPadY + axisTopPadY)\n\n // Position chart and legend\n gAltLat.attr(\"transform\", `translate(${axisLeftPadX},${axisTopPadY})`)\n \n // Create axes and position within SVG\n const leftYaxisTrans = `translate(${axisLeftPadX},${axisTopPadY})`\n //const leftYaxisLabelTrans = `translate(${axisLabelFontSize},${axisTopPadY + height/2}) rotate(270)`\n let leftYaxisLabelTrans\n if (yAxisLabelToTop) {\n leftYaxisLabelTrans = `translate(0,0)`\n } else {\n leftYaxisLabelTrans = `translate(0,${axisTopPadY + height/2}) rotate(270)`\n }\n const rightYaxisTrans = `translate(${axisLeftPadX + width}, ${axisTopPadY})`\n const topXaxisTrans = `translate(${axisLeftPadX},${axisTopPadY})`\n const bottomXaxisTrans = `translate(${axisLeftPadX},${axisTopPadY + height})`\n const bottomXaxisLabelTrans = `translate(${axisLeftPadX + width/2}, ${height + axisTopPadY + axisBottomPadY})`\n\n // Create axes and position within SVG\n if (lAxis) {\n const gLaxis = svgAltLat.append(\"g\")\n .style('font-family', font)\n .style('font-size', axisTickFontSize)\n .call(lAxis)\n gLaxis.attr(\"transform\", leftYaxisTrans)\n }\n if (bAxis) {\n const gBaxis = svgAltLat.append(\"g\")\n .style('font-family', font)\n .style('font-size', axisTickFontSize)\n .call(bAxis)\n gBaxis.attr(\"transform\", bottomXaxisTrans)\n }\n if (tAxis) {\n const gTaxis = svgAltLat.append(\"g\")\n .style('font-family', font)\n .style('font-size', axisTickFontSize)\n .call(tAxis)\n gTaxis.attr(\"transform\", topXaxisTrans)\n }\n if (rAxis) {\n const gRaxis = svgAltLat.append(\"g\")\n .style('font-family', font)\n .style('font-size', axisTickFontSize)\n .call(rAxis)\n gRaxis.attr(\"transform\", rightYaxisTrans)\n }\n\n const tYaxisLabel = svgAltLat.append(\"text\")\n .style(\"text-anchor\", yAxisLabelToTop ? \"left\" : \"middle\")\n .style('font-size', axisLabelFontSize)\n .style('font-family', font)\n .style('dominant-baseline', 'hanging')\n .text(axisLeftLabel) \n tYaxisLabel.attr(\"transform\", leftYaxisLabelTrans)\n\n const tXaxisLabel = svgAltLat.append(\"text\")\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .style('font-family', font)\n .text(axisBottomLabel) \n tXaxisLabel.attr(\"transform\", bottomXaxisLabelTrans)\n\n } else if (taxa.length === 1) {\n // Update taxon label\n if (showTaxonLabel) {\n svgAltLat.select('.brc-chart-altlat-label').text(taxon)\n }\n }\n\n // Make the legend\n let pLegend\n if (showLegend) {\n pLegend = makeLegend(gAltLat)\n } else {\n pLegend = Promise.resolve()\n }\n\n // Return a promise which resolves to the svg when transitions complete\n return new Promise((resolve) => {\n\n const pTrans = [pLegend]\n transPromise(mainTrans, pTrans)\n\n Promise.allSettled(pTrans).then(() => {\n resolve(svgAltLat)\n })//.catch(e => console.log(e))\n })\n }\n\n function makeLegend (gAltLat) {\n\n const items = ranges.map(r => {\n return {\n text: r.legend,\n radiusTrans: xScale(r.radius),\n radius: r.radius\n }\n })\n\n const maxRadius = Math.max(...items.map(i => i.radiusTrans))\n let spacing\n if (legendSpacing) {\n spacing = legendSpacing\n } else {\n spacing = maxRadius * 2.2\n }\n\n const xOffset = xScale(legendXoffset)\n const yOffset = yScale(legendYoffset)\n\n const t = gAltLat.transition()\n .duration(duration)\n\n const lt = gAltLat.selectAll('.brc-altlat-legend-item-text')\n .data(items, i => safeId(i.text))\n .join(\n enter => {\n const text = enter.append(\"text\")\n .text(i => i.text)\n .style('font-family', font)\n .style('font-size', legendFontSize)\n .style('dominant-baseline', legendBaseline)\n .attr('x', xOffset + maxRadius * 1.3)\n .attr('y', (i,j) => yOffset + spacing * j)\n .style('opacity', 0)\n return text\n },\n update => update\n )\n .attr(\"class\", i => `brc-altlat-legend-item-text brc-altlat brc-altlat-${i.radius}`)\n\n const ls = gAltLat.selectAll('.brc-altlat-legend-item-circle')\n .data(items, i => safeId(i.text))\n .join(\n enter => {\n const swatches = enter.append(\"circle\")\n .attr('r', 0)\n .attr('cx', xOffset)\n .attr('cy', (i,j) => yOffset + spacing * j)\n return swatches\n },\n update => update\n )\n .attr(\"class\", i => `brc-altlat-legend-item-circle brc-altlat brc-altlat-${i.radius}`)\n\n const textTrans = lt.transition(t)\n .attr('x', xOffset + maxRadius * 1.3)\n .attr('y', (i,j) => yOffset + spacing * j)\n .style('opacity', 1)\n\n const swatchTrans = ls.transition(t)\n .attr('r', i => i.radiusTrans)\n .attr('cx', xOffset)\n .attr('cy', (i,j) => yOffset + spacing * j)\n\n addEventHandlers(ls)\n addEventHandlers(lt)\n\n const pTrans = []\n transPromise(swatchTrans, pTrans)\n transPromise(textTrans, pTrans)\n return Promise.allSettled(pTrans)\n }\n\n function getRadius (metric) {\n for (let i=0; i= ranges[i].min && metric <= ranges[i].max) {\n return ranges[i].radius\n }\n }\n }\n\n function highlightItem(d, highlight) {\n\n svgChart.selectAll(`.brc-altlat`)\n .classed('lowlight', false)\n\n const rad = d.radius ? d.radius : d.metric ? getRadius(d.metric) : null\n\n if (highlight && rad) {\n svgChart.selectAll(`.brc-altlat`)\n .classed('lowlight', true)\n\n svgChart.selectAll(`.brc-altlat-${rad}`)\n .classed('lowlight', false)\n }\n }\n\n function highlightItemToggle(d) {\n const rad = d.radius ? d.radius : d.metric ? getRadius(d.metric) : null\n if (rad) {\n const lowlighted = svgChart.selectAll(`.brc-altlat-${rad}`).classed('lowlight')\n svgChart.selectAll(`.brc-altlat-${rad}`).classed('lowlight', !lowlighted)\n }\n }\n\n function addEventHandlers(sel) {\n sel\n .on(\"mouseover\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d, true)\n }\n })\n .on(\"mouseout\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d, false)\n }\n })\n .on(\"click\", function(d) {\n if (interactivity === 'mouseclick') {\n highlightItem(d, true)\n d3.event.stopPropagation()\n }\n if (interactivity === 'toggle') {\n highlightItemToggle(d)\n d3.event.stopPropagation()\n }\n })\n }\n\n/** @function dataFromTetrads\n * @param {Array.} tetrads\n * @description This function is exposed as a method on the API returned from the altlat function.\n * This function takes a single list of tetrad references and returns a promise that resolves to a\n * data object suitable for displaying with the chart.\n */\n function dataFromTetrads(tetrads) {\n\n let altlatTetrads \n if (location.hostname === \"localhost\" || location.hostname === \"127.0.0.1\") {\n altlatTetrads = `../dist/altlat-tetrads.csv`\n } else {\n altlatTetrads = `${constants.thisCdn}/altlat-tetrads.csv`\n }\n\n return d3.csv(altlatTetrads).then(function(altlat){\n\n // To maximise the performance of this function, both the altlat and tetrad arrays\n // are sorted on tetrad name. Then when we loop the tetrad array, when a match is\n // found and the tetrad processed, all the leading tetrads in the altlat list, up\n // to and including the matched tetrad, are removed from the list.\n\n const altlatSorted = altlat.sort((a,b) => {\n if (a.tetrad < b.tetrad) {\n return -1\n }\n if (a.tetrad > b.tetrad) {\n return 1\n }\n return 0\n })\n\n const tetradsSorted = tetrads.sort((a,b) => {\n if (a.tetrad < b.tetrad) {\n return -1\n }\n if (a.tetrad > b.tetrad) {\n return 1\n }\n return 0\n })\n\n const groups = []\n\n console.time(\"process tetrads\")\n tetradsSorted.forEach(t => {\n //const tmi = altlatSorted.findIndex(al => al.tetrad === t)\n // A for loop is faster that the findIndex array method\n let tmi\n for (let i=0; i g.distance === gDistance && g.altitude === gAltitude)\n\n if (group) {\n group.tetrads += 1\n } else {\n groups.push({\n distance: gDistance,\n altitude: gAltitude,\n tetrads: 1,\n })\n }\n }\n // Remove all tetrads from the altlat array up to and including the matched tetrad\n // to speed up subsequent searches.\n altlatSorted.splice(0, tmi+1)\n })\n console.timeEnd(\"process tetrads\")\n\n // Convert the tetrad counts to a proportion of all tetrads in group\n const pgroupss = groups.map(g => {\n const backSquare = backData.find(bd => g.distance === bd[0] && g.altitude === bd[1])\n const totalTetrads = backSquare[2]\n\n //console.log(g.tetrads, totalTetrads)\n return {\n distance: g.distance,\n altitude: g.altitude,\n metric: g.tetrads/totalTetrads * 100,\n taxon: 'dummy'\n }\n })\n\n return new Promise((resolve) => {\n resolve(pgroupss)\n })\n })\n }\n\n/** @function setChartOpts\n * @param {Object} opts - text options.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {string} opts.interactivity - Specifies how item highlighting occurs. Can be 'mousemove', 'mouseclick', 'toggle' or 'none'. (Default - 'none'.)\n * @param {Array.} opts.data - Specifies an array of data objects (see main interface for details).\n * @param {Array.} opts.ranges - Specifies an array of objects defining ranges for displaying the metrics (see main interface for details).\n * @returns {Promise} promise resolves when all transitions complete.\n * @description This function is exposed as a method on the API returned from the altlat function.\n * Set's the value of the chart data, title, subtitle and/or footer. If an element is missing from the \n * options object, it's value is not changed.\n */\n function setChartOpts(opts){\n\n if ('title' in opts) {\n title = opts.title\n }\n if ('subtitle' in opts) {\n subtitle = opts.subtitle\n }\n if ('footer' in opts) {\n footer = opts.footer\n }\n if ('titleFontSize' in opts) {\n titleFontSize = opts.titleFontSize\n }\n if ('subtitleFontSize' in opts) {\n subtitleFontSize = opts.subtitleFontSize\n }\n if ('footerFontSize' in opts) {\n footerFontSize = opts.footerFontSize\n }\n if ('titleAlign' in opts) {\n titleAlign = opts.titleAlign\n }\n if ('subtitleAlign' in opts) {\n subtitleAlign = opts.subtitleAlign\n }\n if ('footerAlign' in opts) {\n footerAlign = opts.footerAlign\n }\n if ('interactivity' in opts) {\n interactivity = opts.interactivity\n }\n\n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n\n let remakeChart = false\n\n if ('data' in opts) {\n data = opts.data\n remakeChart = true\n }\n\n if ('ranges' in opts) {\n ranges = opts.ranges\n remakeChart = true\n }\n\n if (remakeChart) {\n return makeChart().then(() => {\n positionMainElements(svg, expand)\n })\n } else {\n return Promise.resolve()\n }\n }\n\n/** @function setTaxon\n * @param {string} taxon - The taxon to display.\n * @returns {Promise} promise resolves when all transitions complete.\n * @description This function is exposed as a method on the API returned from the altlat function.\n * This allows you to change the taxon displayed.\n */\n function setTaxon(taxon){\n if (taxa.length !== 1) {\n console.log(\"You can only use the setTaxon method when your chart displays a single taxon.\")\n } else {\n taxa = [taxon]\n highlightItem({}, false)\n return makeChart()\n }\n }\n\n\n/** @function getChartWidth\n * @description This function is exposed as a method on the API returned from the altlat function.\n * Return the full width of the chart svg.\n */\n function getChartWidth(){\n return svg.attr(\"width\") ? svg.attr(\"width\") : svg.attr(\"viewBox\").split(' ')[2]\n }\n\n/** @function getChartHeight\n * @description This function is exposed as a method on the API returned from the altlat function.\n * Return the full height of the chart svg.\n */\n function getChartHeight(){\n return svg.attr(\"height\") ? svg.attr(\"height\") : svg.attr(\"viewBox\").split(' ')[3]\n }\n\n/** @function saveImage\n * @param {boolean} asSvg - If true, file is generated as SVG, otherwise PNG.\n * @param {string} filename - Name of the file (without extension) to generate and download.\n * If 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 promise's 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 altlat function.\n * Download the chart as an image file.\n */\n function saveImage(asSvg, filename){\n return saveChartImage(svg, expand, asSvg, filename) \n }\n\n /**\n * @typedef {Object} api\n * @property {module:altlat~getChartWidth} getChartWidth - Gets and returns the current width of the chart.\n * @property {module:altlat~getChartHeight} getChartHeight - Gets and returns the current height of the chart. \n * @property {module:altlat~setChartOpts} setChartOpts - Sets text options for the chart. \n * @property {module:altlat~setTaxon} setTaxon - Changes the displayed taxon for single taxon charts. \n * @property {module:altlat~dataFromTetrads} dataFromTetrads - Generates data in the format required for the chart from a raw list of tetrad references. \n * @property {module:altlat~saveImage} saveImage - Generates and downloads and image file for the SVG. \n */\n return {\n getChartHeight: getChartHeight,\n getChartWidth: getChartWidth,\n setChartOpts: setChartOpts,\n setTaxon: setTaxon,\n dataFromTetrads: dataFromTetrads,\n saveImage: saveImage\n }\n}","/** @module links */\n\nimport * as d3 from 'd3'\nimport * as gen from './general'\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.elid - The id for the dom object created.\n * @param {number} opts.width - The width of the main chart area in pixels (excludes margins).\n * @param {number} opts.height - The height of the main chart area in pixels (excludes margins).\n * @param {number} opts.radius - The radius of the node in pixels. (Default - 5.)\n * @param {boolean} opts.expand - Indicates whether or not the chart will expand to fill parent element and scale as that element resized.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {string} opts.interactivityLink - Specifies how link interactivity occurs. Can be 'mousemove', 'mouseclick' or 'none'. (Default - 'none'.)\n * @param {number} opts.duration - The duration of each transition phase in milliseconds (when nodes removed). (Default - 1000.)\n * @param {string} opts.backgroundColour - The background colour of the main chart area. Can be set to empty string for none. (Default - empty.)\n * @param {string} opts.taxa1colour - The colour to use for taxa in column taxa1. Can be any valid CSS colour string or 'auto' to specify a colour automatically. (Deafult - 'black'.)\n * @param {string} opts.taxa2colour - The colour to use for taxa in column taxa2. Can be any valid CSS colour string or 'auto' to specify a colour automatically. (Deafult - 'black'.)\n * @param {boolean} opts.overflow - A boolean that indicates whether or not to show graphics that overflow the svg boundary. (Default - true.)\n * @param {boolean} opts.zoom - A boolean that indicates whether or not implement zoom behaviour. (Default - true.)\n * @param {Object} opts.taxonInfoFn - A function called when the user interacts with a taxon node. \n * Two arguments are passed to the function: the taxon name and a boolean indicating if this was from the field taxon1 in the input data. \n * If the function returns a non-null value, it is displayed in a tool-tip. If no value is returned, no tool-tip is generated.\n * (Default - null.)\n * @param {Object} opts.linkInfoFn - A function called when the user interacts with a link.\n * Three arguments are passed to the function: the taxon name from the taxon1 property, the taxon name from the taxon2 property,\n * and the data object from the data property. If no value is returned, no tool-tip is generated.\n * If the function returns a non-null value, it is displayed in a tool-tip.\n * (Default - null.)\n * @param {Array.} opts.data - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • taxon1 - the name of a taxon.\n *
  • taxon2 - the name of a taxon linked with the taxon specified in taxon1.\n *
  • data - a data object, e.g. with data describing the relationship between taxon1 and taxon2, that will be passed to any\n * function specified in the linkInfoFn parameter.\n *
\n * @returns {module:links~api} api - Returns an API for the chart.\n */\n\nexport function links({\n // Default options in here\n selector = 'body',\n elid = 'link-chart',\n width = 300,\n height = 200,\n expand = false,\n title = '',\n subtitle = '',\n footer = '',\n titleFontSize = 24,\n subtitleFontSize = 16,\n footerFontSize = 14,\n titleAlign = 'left',\n subtitleAlign = 'left',\n footerAlign = 'left',\n duration = 1000,\n overflow = true,\n zoom = true,\n interactivityLink = 'none',\n backgroundColour = '',\n taxa1colour = 'auto',\n taxa2colour = 'black',\n taxonInfoFn = null,\n linkInfoFn = null,\n radius = 5,\n data = []\n} = {}) {\n\n const mainDiv = d3.select(`${selector}`)\n .append('div')\n .attr('id', elid)\n .attr('class', 'brc-chart-links')\n .style('position', 'relative')\n .style('display', 'inline')\n \n mainDiv.classed('chart-overflow', overflow)\n\n // Define the div for the tooltip\n const popupDiv = d3.select(\"body\").append(\"div\")\t\n .attr(\"class\", \"brc-chart-links-popup\")\t\t\t\t\n .style(\"opacity\", 0)\n \n const svg = mainDiv.append('svg')\n .style(\"cursor\", zoom ? \"move\" : null)\n\n if (backgroundColour) {\n svg.style('background-color', backgroundColour)\n }\n\n svg.on(\"click\", function() {\n if (interactivityLink === 'mouseclick' && d3.event.srcElement.tagName === 'svg') {\n unhighlightAllLinks()\n }\n })\n\n const svgChart = svg.append('svg')\n .attr('class', 'mainChart')\n .attr(\"width\", width)\n .attr(\"height\", height)\n\n const gChart = svgChart.append('g')\n const gLinks = gChart.append('g')\n const gNodes = gChart.append('g')\n\n if (zoom) {\n svg.call(d3.zoom()\n .scaleExtent([1/4, 4])\n .on('zoom', function () {\n gChart.attr('transform', d3.event.transform)\n }))\n }\n\n const simulation = d3.forceSimulation()\n let nodes\n\n makeChart(data)\n // Texts must come after chart because \n // the chart width is required\n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n gen.positionMainElements(svg, expand)\n\n function makeChart(data) {\n\n // Make two separate arrays - one for nodes and one for links\n // We are using Set to get unique values and then spread these into an array\n const taxa1 = [...new Set(data.map(d => d.taxon1))]\n const taxa2 = [...new Set(data.map(d => d.taxon2))]\n const taxa = [...taxa1, ...taxa2]\n\n // Good example of modifying force layout here:\n // https://observablehq.com/@d3/modifying-a-force-directed-graph\n // In a force directed layout, the current positions of the nodes is stored\n // within the data objects - NOT the DOM ojbects. So to preserve current\n // position of elements when data is updated, we have to keep previous\n // version of the node object.\n let nodesPrev\n if (nodes) {\n // Map gives a dictionary that can be used to lookup\n nodesPrev = new Map(nodes.map(d => [d.id, d]))\n }\n nodes = taxa.map(t => {\n return {\n id: t,\n t1: taxa1.includes(t),\n }\n })\n if (nodesPrev) {\n // Use previous node where it exists\n nodes = nodes.map(d => Object.assign(nodesPrev.get(d.id) || {}, d))\n }\n \n const links = data.map(d => {\n return {\n key: gen.safeId(`${d.taxon1}-${d.taxon2}`),\n source: d.taxon1,\n target: d.taxon2,\n data: d.data\n }\n })\n\n //const simulation = d3.forceSimulation(nodes)\n simulation.nodes(nodes)\n .force(\"link\", d3.forceLink(links).id(d => d.id))\n .force(\"charge\", d3.forceManyBody().strength(-30)) // default strength is -30 (repel)\n .force(\"center\", d3.forceCenter(width / 2, height / 2))\n simulation.alpha(1).restart()\n\n const link = gLinks.selectAll(\".display-link\")\n .data(links, d => d.key)\n .join(\n enter => enter.append(\"line\")\n .classed('display-link', true)\n .attr(\"id\", d => d.key),\n update => update,\n exit => exit.remove()\n )\n\n const selectLink = gLinks.selectAll(\".select-link\")\n .data(links, d => d.key)\n .join(\n enter => enter.append(\"line\")\n .classed('select-link', true)\n .style(\"cursor\", interactivityLink !== \"none\" ? \"pointer\" : \"\")\n .on(\"mouseover\", function(d) {\t\n linkHit(d, \"mouseover\")\n })\n .on(\"click\", function(d) {\t\n linkHit(d, \"click\")\n })\t\t\t\t\t\n .on(\"mouseout\", function(d) {\t\t\n linkHitRemove(d)\n }),\n update => update,\n exit => exit.remove()\n )\n\n function linkHit (d, eventType) {\n if ((eventType == \"mouseover\" && interactivityLink === \"mousemove\") ||\n (eventType == \"click\" && interactivityLink === \"mouseclick\")) {\n\n if (eventType == \"click\") {\n unhighlightAllLinks()\n }\n d3.select(`.display-link#${d.key}`).classed('highlighted', true)\n d3.select(`circle#${gen.safeId(d.source.id)}`).classed('highlighted', true)\n d3.select(`circle#${gen.safeId(d.target.id)}`).classed('highlighted', true)\n const html = linkInfoFn ? linkInfoFn(d.source.id, d.target.id, d.data) : ''\n if (html) {\n popupDiv.transition()\t\t\n .duration(200)\t\t\n .style(\"opacity\", 0.9)\n popupDiv.html(html)\n .style(\"left\", (d3.event.pageX + 10) + \"px\")\t\t\n .style(\"top\", (d3.event.pageY - 30) + \"px\")\n }\n }\n }\n\n function linkHitRemove(d) {\n if (interactivityLink === \"mousemove\") {\n d3.select(`.display-link#${d.key}`).classed('highlighted', false)\n d3.select(`circle#${gen.safeId(d.source.id)}`).classed('highlighted', false)\n d3.select(`circle#${gen.safeId(d.target.id)}`).classed('highlighted', false)\n popupDiv.transition()\t\t\n .duration(500)\t\t\n .style(\"opacity\", 0)\n }\n }\n\n const node = gNodes.selectAll(\"circle\")\n .data(nodes, d => d.id)\n .join(\n enter => enter.append(\"circle\")\n .attr('id', d => gen.safeId(d.id))\n .attr(\"r\", radius)\n .attr(\"x\", width/2)\n .attr(\"y\", height/2)\n .attr(\"fill\", (d, i) => getColour(taxa1, taxa2, taxa, d, i))\n .style(\"cursor\", \"pointer\")\n .on(\"click\", function(d) {\n delete d.fx\n delete d.fy\n d3.select(this).classed(\"fixed\", false)\n simulation.alpha(1).restart()\n })\n .on(\"mouseover\", function(d) {\n //gNodes.selectAll('circle').classed(\"lowlighted\", true)\n //d3.select(this).classed(\"lowlighted\", false)\n d3.select(this).classed(\"highlighted\", true)\n highLightLinks(d.id, true)\n const html = taxonInfoFn ? taxonInfoFn(d.id, d.t1) : d.id\n if (html) {\n popupDiv.transition()\t\t\n .duration(200)\t\t\n .style(\"opacity\", 0.9)\n popupDiv.html(html)\t\n .style(\"left\", (d3.event.pageX + 10) + \"px\")\t\t\n .style(\"top\", (d3.event.pageY - 30) + \"px\")\n }\n })\t\t\t\n .on(\"mouseout\", function() {\n //gNodes.selectAll('circle').classed(\"lowlighted\", false)\n\n gLinks.selectAll(`.display-link`).classed('lowlighted', false)\n\n d3.select(this).classed(\"highlighted\", false)\n //highLightLinks(d.id, false)\n popupDiv.transition()\t\t\n .duration(500)\t\t\n .style(\"opacity\", 0)\n }),\n update => update,\n exit => exit\n .call(exit => exit.transition().duration(duration)\n .attr(\"r\", 0)\n .remove())\n )\n .call(drag(simulation))\n\n simulation.on(\"tick\", () => {\n node\n .attr(\"cx\", d => {\n if (overflow) {\n return d.x\n } else {\n return d.x\n //Restrain to SVG\n //return d.x = Math.max(radius, Math.min(width - radius, d.x))\n }\n })\n .attr(\"cy\", d => {\n if (overflow) {\n return d.y\n } else {\n return d.y\n //Restrain to SVG\n //return d.y = Math.max(radius, Math.min(height - radius, d.y))\n }\n })\n link\n .attr(\"x1\", d => d.source.x)\n .attr(\"y1\", d => d.source.y)\n .attr(\"x2\", d => d.target.x)\n .attr(\"y2\", d => d.target.y)\n selectLink\n .attr(\"x1\", d => d.source.x)\n .attr(\"y1\", d => d.source.y)\n .attr(\"x2\", d => d.target.x)\n .attr(\"y2\", d => d.target.y)\n })\n\n function highLightLinks(id, highlight) {\n const hLinks = links.filter(l => l.source.id === id || l.target.id === id)\n\n gLinks.selectAll(`.display-link`).classed('lowlighted', true)\n\n hLinks.forEach(link => {\n //d3.selectAll(`.display-link#${link.key}`).classed('highlighted', highlight)\n d3.selectAll(`.display-link#${link.key}`).classed('lowlighted', !highlight)\n })\n }\n }\n\n function getColour(taxa1, taxa2, taxa, d) {\n let iAuto\n if (taxa1colour === 'auto' && taxa2colour === 'auto') {\n iAuto = taxa.indexOf(d.id)\n } else if (taxa1colour === 'auto') {\n iAuto = taxa1.indexOf(d.id)\n } else if (taxa2colour === 'auto') {\n iAuto = taxa2.indexOf(d.id)\n }\n\n if (d.t1) {\n if (taxa1colour === 'auto') {\n return autoColour(iAuto)\n } else {\n return taxa1colour\n }\n } else {\n if (taxa2colour === 'auto') {\n return autoColour(iAuto)\n } else {\n return taxa2colour\n }\n }\n\n function autoColour(i) {\n\n //console.log(i)\n\n if (!d.colour) {\n if (i < 10) {\n return d3.schemeCategory10[i]\n }\n else if (i < 18) {\n return d3.schemeDark2[i - 10]\n }\n else if (i < 26) {\n return d3.schemeAccent[i - 18]\n }\n else {\n return d3.interpolateSpectral(Math.random())\n }\n }\n }\n \n }\n\n function drag(simulation) {\n \n function dragstart() {\n d3.select(this).classed(\"fixed\", true)\n }\n\n function dragged() {\n d3.event.subject.fx = clamp(d3.event.x, 0, width)\n d3.event.subject.fy = clamp(d3.event.y, 0, height)\n simulation.alpha(1).restart()\n }\n\n return d3.drag()\n .on(\"start\", dragstart)\n .on(\"drag\", dragged)\n }\n\n function clamp(x) {\n //return x < lo ? lo : x > hi ? hi : x;\n return x\n }\n\n function unhighlightAllLinks() {\n d3.selectAll(`.display-link`).classed('highlighted', false)\n d3.selectAll(`circle`).classed('highlighted', false)\n d3.selectAll(`circle`).classed('highlighted', false)\n }\n\n/** @function setChartOpts\n * @param {Object} opts - text options.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {Array.} opts.data - Specifies an array of data objects.\n * @description This function is exposed as a method on the API returned from the links function.\n * Set's the value of the chart data, title, subtitle and/or footer. If an element is missing from the \n * options object, it's value is not changed.\n */\n function setChartOpts(opts){\n\n if ('title' in opts) {\n title = opts.title\n }\n if ('subtitle' in opts) {\n subtitle = opts.subtitle\n }\n if ('footer' in opts) {\n footer = opts.footer\n }\n if ('titleFontSize' in opts) {\n titleFontSize = opts.titleFontSize\n }\n if ('subtitleFontSize' in opts) {\n subtitleFontSize = opts.subtitleFontSize\n }\n if ('footerFontSize' in opts) {\n footerFontSize = opts.footerFontSize\n }\n if ('titleAlign' in opts) {\n titleAlign = opts.titleAlign\n }\n if ('subtitleAlign' in opts) {\n subtitleAlign = opts.subtitleAlign\n }\n if ('footerAlign' in opts) {\n footerAlign = opts.footerAlign\n }\n\n const textWidth = Number(svgChart.attr(\"width\"))\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n\n if ('data' in opts) {\n makeChart(opts.data)\n }\n\n //positionElements()\n gen.positionMainElements(svg, expand)\n }\n\n/** @function getChartWidth\n * @description This function is exposed as a method on the API returned from the links function.\n * Return the full width of the chart svg.\n */\n function getChartWidth(){\n return svg.attr(\"width\") ? svg.attr(\"width\") : svg.attr(\"viewBox\").split(' ')[2]\n }\n\n/** @function getChartHeight\n * @description This function is exposed as a method on the API returned from the links function.\n * Return the full height of the chart svg.\n */\n function getChartHeight(){\n return svg.attr(\"height\") ? svg.attr(\"height\") : svg.attr(\"viewBox\").split(' ')[3]\n }\n\n /**\n * @typedef {Object} api\n * @property {module:links~getChartWidth} getChartWidth - Gets and returns the current width of the chart.\n * @property {module:links~getChartHeight} getChartHeight - Gets and returns the current height of the chart. \n * @property {module:links~setChartOpts} setChartOpts - Sets text options for the chart. \n */\n return {\n getChartHeight: getChartHeight,\n getChartWidth: getChartWidth,\n setChartOpts: setChartOpts\n }\n}","/** @module phen1 */\n\nimport * as d3 from 'd3'\nimport { makeText, positionMainElements, saveChartImage } from '../general'\nimport { makePhen } from './makephen'\nimport { highlightItem } from './highlightitem'\nimport { preProcessMetrics } from './metricsplus'\nimport { makeLegend } from './legend'\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 SVG.\n * @param {string} opts.elid - The id for the dom object created.\n * @param {number} opts.width - The width of each sub-chart area in pixels.\n * @param {number} opts.height - The height of the each sub-chart area in pixels.\n * @param {Object} opts.margin - An object indicating the margins to add around each sub-chart area.\n * @param {number} opts.margin.left - Left margin in pixels. (Default - 35.)\n * @param {number} opts.margin.right - Right margin in pixels. (Default - 0.)\n * @param {number} opts.margin.top - Top margin in pixels. (Default - 20.)\n * @param {number} opts.margin.bottom - Bottom margin in pixels. (Default - 5.)\n * @param {number} opts.perRow - The number of sub-charts per row.\n * @param {string} opts.ytype - Type of metric to show on the y axis, can be 'count', 'proportion' or 'normalized'.\n * @param {boolean} opts.expand - Indicates whether or not the chart will expand to fill parent element and scale as that element resized.\n * @param {boolean} opts.spread - Indicates whether multiple metrics are to be spread vertically across the chart.\n * @param {string} opts.style - Indicates the type of graphics to be used for the chart. Can be 'lines', 'bars' or 'areas'. (Default - 'lines'.)\n * @param {boolean} opts.stacked - Indicates whether to stack metrics or superimpose them. If true, the metrics are stacked. This\n * is only relevant for charts of style 'bars' or 'areas'. It has no effect on charts with the style 'lines'. (Default - false.)\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart sub-title.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {boolean} opts.showTaxonLabel - Whether or not to show taxon label above each sub-graph.\n * @param {string} opts.taxonLabelFontSize - Font size (pixels) of taxon sub-chart label.\n * @param {boolean} opts.taxonLabelItalics - Whether or not to italicise taxon label.\n * @param {string} opts.axisLabelFontSize - Font size (pixels) for axist labels. (Default - 10.)\n * @param {string | number} opts.monthFontSize - Font size for month labels. Can be specified in any permitted SVG units. (Default - 12.)\n * @param {string } opts.font - Font to use for chart. (Default - sans-serif.)\n * @param {boolean} opts.showLegend - Whether or not to show the legend.\n * @param {string} opts.legendFontSize - Font size (pixels) of legend item text.\n * @param {string | number} opts.lineWidth - Sets the stroke-width of all lines on the chart. Can use any permitted SVG stroke-width units. (Default - 1.)* @param {string} opts.axisLeft - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis.\n * @param {string} opts.axisBottom - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis.\n * @param {string} opts.axisRight - If set to 'on' line is drawn otherwise not.\n * @param {string} opts.axisTop - If set to 'on' line is drawn otherwise not.\n * @param {string} opts.axisLeftLabel - Value for labelling left axis. (Default - ''.)\n * @param {Array.} opts.bands - An array of up to 12 colours (any standard colour notation), used to display bands for each month\n * as a background on the chart. (Default is an empty array.)\n * @param {Array.} opts.lines - An array of up to 12 colours (any standard colour notation), used to display vertical lines to\n * delineat each month as a background on the chart. (Default is an empty array.)\n * @param {number} opts.monthLineWidth - The width of lines used to delineate months.\n * @param {number} opts.headPad - A left hand offset, in pixels, for title, subtitle, legend and footer. (Default 0.)\n * @param {number} opts.duration - The duration of each transition phase in milliseconds.\n * @param {string} opts.interactivity - Specifies how item highlighting occurs. Can be 'mousemove', 'mouseclick' or 'none'.\n * @param {Array.} opts.taxa - An array of taxa (names), indicating which taxa create charts for. \n * If empty, graphs for all taxa are created.\n * @param {Array.} opts.metrics - An array of objects, each describing a numeric property in the input\n * data for which a line should be generated on the chart.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • prop - the name of the numeric property in the data (count properties - 'c1' or 'c2' in the example below).\n *
  • label - a label for this metric.\n *
  • colour - optional colour to give the line for this metric. Any accepted way of specifying web colours can be used. Use the special term 'fading' to successively fading shades of grey.\n *
  • fill - optional colour to colour the graph area for this metric. Any accepted way of specifying web colours can be used.\n *
\n * Note that if a metric has no data for a given taxon, then the graphics representing it will be\n * marked with the CSS class 'phen-path-no-data'. You can use this to style as you see fit.\n * @param {Array.} opts.data - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • taxon - name of a taxon.\n *
  • either week - a number between 1 and 53 indicating the week of the year,\n *
  • or month - a number between 1 and 12 indicating the month of the year,\n *
  • c1 - a count for a given time period (can have any name). \n *
  • c2 - a count for a given time period (can have any name).\n * ... - there must be at least one count column, but there can be any number of them.\n *
\n * @returns {module:phen1~api} api - Returns an API for the chart.\n */\n\nexport function phen1({\n // Default options in here\n selector = 'body',\n elid = 'phen1-chart',\n width = 300,\n height = 200,\n margin = {left: 35, right: 0, top: 20, bottom: 5},\n bands= [],\n lines=[],\n monthLineWidth = 1,\n perRow = 2,\n ytype = 'count',\n expand = false,\n spread = false,\n style = 'lines',\n stacked = false,\n title = '',\n subtitle = '',\n footer = '',\n titleFontSize = 24,\n subtitleFontSize = 16,\n footerFontSize = 10,\n legendFontSize = 16,\n axisLabelFontSize = 10,\n monthFontSize = 12,\n lineWidth = 1,\n font = 'sans-serif',\n showLegend = true,\n titleAlign = 'left',\n subtitleAlign = 'left',\n footerAlign = 'left',\n showTaxonLabel = true,\n taxonLabelFontSize = 16,\n taxonLabelItalics = false,\n axisLeft = 'tick',\n axisBottom = 'tick',\n axisRight = '',\n axisTop = '',\n axisLeftLabel = '',\n headPad = 0,\n duration = 1000,\n interactivity = 'mousemove',\n data = [],\n taxa = [],\n metrics = []\n} = {}) {\n\n metrics = preProcessMetrics(metrics)\n\n const mainDiv = d3.select(`${selector}`)\n .append('div')\n .attr('id', elid)\n .classed('brc-chart-phen1-top', true)\n .style('position', 'relative')\n .style('display', 'inline')\n\n const svg = mainDiv.append('svg')\n\n svg.on(\"click\", function() {\n if (interactivity === 'mouseclick') {\n highlightItem(null, false, svgChart)\n }\n })\n\n const svgChart = svg.append('svg').attr('class', 'mainChart').style('overflow', 'visible')\n \n makeChart()\n\n // Texts must come after chart because \n // the chart width is required\n const textWidth = Number(svg.select('.mainChart').attr(\"width\") - headPad)\n makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n positionMainElements(svg, expand, headPad)\n\n svg.selectAll('text').style('font-family', font)\n svg.selectAll('line, path').style('stroke-width', lineWidth)\n\n function makeChart () {\n\n // Give warning and return if invalid option combinations are used\n if (stacked && spread) {\n console.log('You cannot set both the stacked and spread options to true.')\n return\n }\n if ((ytype === 'normalized' || ytype === 'proportion') && stacked) {\n console.log('You cannot used a y axis type of normalized or proportion with a stacked display.')\n return\n }\n\n if (!taxa.length) {\n taxa = data.map(d => d.taxon).filter((v, i, a) => a.indexOf(v) === i)\n }\n\n const subChartPad = 10\n const pTrans = []\n\n const svgsTaxa = taxa.map(t => {\n return makePhen (t, taxa, data, metrics, svgChart, width, height, \n ytype, spread, axisTop, axisBottom, axisLeft, axisRight, monthLineWidth, bands, lines,\n style, stacked, duration, margin, showTaxonLabel, taxonLabelFontSize, taxonLabelItalics,\n axisLabelFontSize, axisLeftLabel, interactivity, pTrans, monthFontSize, font)\n })\n\n const subChartWidth = Number(svgsTaxa[0].attr(\"width\"))\n const subChartHeight = Number(svgsTaxa[0].attr(\"height\"))\n\n let legendHeight = 0\n if (showLegend) {\n const legendWidth = perRow * (subChartWidth + subChartPad) - headPad\n legendHeight = makeLegend(legendWidth, metrics, svgChart, legendFontSize, headPad, interactivity, style) + subChartPad\n }\n\n svgsTaxa.forEach((svgTaxon, i) => {\n \n const col = i%perRow\n const row = Math.floor(i/perRow)\n\n svgTaxon.attr(\"x\", col * (subChartWidth + subChartPad))\n svgTaxon.attr(\"y\", row * (subChartHeight + subChartPad) + legendHeight)\n })\n\n svgChart.attr(\"width\", perRow * (subChartWidth + subChartPad))\n svgChart.attr(\"height\", legendHeight + Math.ceil(svgsTaxa.length/perRow) * (subChartHeight + subChartPad))\n\n return Promise.allSettled(pTrans)\n }\n\n/** @function setChartOpts\n * @param {Object} opts - text options.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {string} opts.ytype - Type of metric to show on the y axis, can be 'count', 'proportion' or 'normalized'.\n * @param {boolean} opts.spread - Indicates whether multiple metrics are to be spread vertically across the chart.\n * @param {Array.} opts.metrics - An array of objects, each describing a numeric property in the input data (see main interface for details).\n * @param {Array.} opts.data - Specifies an array of data objects (see main interface for details).\n * @returns {Promise} promise resolves when all transitions complete.\n * @description This function is exposed as a method on the API returned from the phen1 function.\n * Set's the value of the chart data, title, subtitle and/or footer. If an element is missing from the \n * options object, it's value is not changed.\n */\n function setChartOpts(opts){\n\n if ('title' in opts) {\n title = opts.title\n }\n if ('subtitle' in opts) {\n subtitle = opts.subtitle\n }\n if ('footer' in opts) {\n footer = opts.footer\n }\n if ('titleFontSize' in opts) {\n titleFontSize = opts.titleFontSize\n }\n if ('subtitleFontSize' in opts) {\n subtitleFontSize = opts.subtitleFontSize\n }\n if ('footerFontSize' in opts) {\n footerFontSize = opts.footerFontSize\n }\n if ('titleAlign' in opts) {\n titleAlign = opts.titleAlign\n }\n if ('subtitleAlign' in opts) {\n subtitleAlign = opts.subtitleAlign\n }\n if ('footerAlign' in opts) {\n footerAlign = opts.footerAlign\n }\n \n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n\n let remakeChart = false\n\n if ('data' in opts) {\n data = opts.data\n remakeChart = true\n }\n\n if ('ytype' in opts) {\n ytype = opts.ytype\n remakeChart = true\n }\n\n if ('metrics' in opts) {\n metrics = preProcessMetrics(opts.metrics)\n remakeChart = true\n }\n\n if ('spread' in opts) {\n spread = opts.spread\n remakeChart = true\n }\n\n let pRet\n if (remakeChart) {\n pRet = makeChart()\n positionMainElements(svg, expand)\n } else {\n pRet = Promise.resolve()\n }\n return pRet\n }\n\n/** @function setTaxon\n * @param {string} opts.taxon - The taxon to display.\n * @returns {Promise} promise resolves when all transitions complete.\n * @description This function is exposed as a method on the API returned from the phen1 function.\n * For single species charts, this allows you to change the taxon displayed.\n */\n function setTaxon(taxon){\n let pRet\n if (taxa.length !== 1) {\n console.log(\"You can only use the setTaxon method when your chart displays a single taxon.\")\n pRet = Promise.resolve()\n } else {\n taxa = [taxon]\n pRet = makeChart()\n }\n return pRet\n }\n\n/** @function getChartWidth\n * @description This function is exposed as a method on the API returned from the phen1 function.\n * Return the full width of the chart svg.\n */\n function getChartWidth(){\n return svg.attr(\"width\") ? svg.attr(\"width\") : svg.attr(\"viewBox\").split(' ')[2]\n }\n\n/** @function getChartHeight\n * @description This function is exposed as a method on the API returned from the phen1 function.\n * Return the full height of the chart svg.\n */\n function getChartHeight(){\n return svg.attr(\"height\") ? svg.attr(\"height\") : svg.attr(\"viewBox\").split(' ')[3]\n }\n\n/** @function saveImage\n * @param {boolean} asSvg - If true, file is generated as SVG, otherwise PNG.\n * @param {string} filename - Name of the file (without extension) to generate and download.\n * If 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 promise's 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 phen1 function.\n * Download the chart as an image file.\n */\n function saveImage(asSvg, filename){\n return saveChartImage(svg, expand, asSvg, filename) \n }\n\n /**\n * @typedef {Object} api\n * @property {module:phen1~getChartWidth} getChartWidth - Gets and returns the current width of the chart.\n * @property {module:phen1~getChartHeight} getChartHeight - Gets and returns the current height of the chart. \n * @property {module:phen1~setChartOpts} setChartOpts - Sets text options for the chart. \n * @property {module:phen1~setChartOpts} setTaxon - Changes the displayed taxon for single taxon charts. \n * @property {module:phen1~saveImage} saveImage - Generates and downloads and image file for the SVG. \n */\n return {\n getChartHeight: getChartHeight,\n getChartWidth: getChartWidth,\n setChartOpts: setChartOpts,\n setTaxon: setTaxon,\n saveImage: saveImage\n }\n\n}","/** @module phen2 */\n\nimport * as d3 from 'd3'\nimport { safeId, makeText, positionMainElements, saveChartImage, xAxisMonthNoText, xAxisMonthText, cloneData, transPromise } from './general'\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.elid - The id for the dom object created.\n * @param {number} opts.width - The width of each sub-chart area in pixels.\n * @param {number} opts.height - The height of the each sub-chart area in pixels.\n * @param {number} opts.split - Set to true to split bands over seperate lines - defalt is false.\n * @param {number} opts.perRow - The number of sub-charts per row.\n * @param {boolean} opts.expand - Indicates whether or not the chart will expand to fill parent element and scale as that element resized.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string | number} opts.monthFontSize - Font size for month labels. Can be specified in any permitted SVG units. (Default - 12.)\n * @param {string } opts.font - Font to use for chart. (Default - sans-serif.)\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {boolean} opts.showTaxonLabel - Whether or not to show taxon label above each sub-graph.\n * @param {string} opts.taxonLabelFontSize - Font size (pixels) of taxon sub-chart label.\n * @param {boolean} opts.taxonLabelItalics - Whether or not to italicise taxon label.\n * @param {boolean} opts.displayLegend - Indicates whether or not to display a legend. (Default - true.)\n * @param {string} opts.legendFontSize - Font size (pixels) of legend item text.\n * @param {string | number} opts.lineWidth - Sets the stroke-width of all lines on the chart. Can use any permitted SVG stroke-width units. (Default - 1.)\n * @param {string} opts.axisBottom - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis.\n * @param {string} opts.axisLeft - If set to 'on' line is drawn otherwise not.\n * @param {string} opts.axisRight - If set to 'on' line is drawn otherwise not.\n * @param {string} opts.axisTop- If set to 'on' line is drawn otherwise not.\n * @param {number} opts.headPad - A left hand offset, in pixels, for title, subtitle, legend and footer. (Default 0.)\n * @param {number} opts.chartPad - A left hand offset, in pixels, for the chart. (Default 0.)\n * @param {number} opts.duration - The duration of each transition phase in milliseconds.\n * @param {string} opts.interactivity - Specifies how item highlighting occurs. Can be 'mousemove', 'mouseclick' or 'none'.\n * @param {string} opts.backColour - Background colour of the chart. Any accepted way of specifying web colours can be used. (Default - white.)\n * @param {Array.} opts.taxa - An array of taxa (names), indicating which taxa create charts for. \n * If empty, graphs for all taxa are created.\n * @param {Array.} opts.metrics - An array of objects, each describing a property in the input\n * data for which a band should be generated on the chart.\n * Each of the objects in the metrics array must be sepecified with the properties shown below.\n *
    \n *
  • prop - the name of the property in the data (properties - 'p1' or 'p2' in the example below).\n *
  • label - a label for this property.\n *
  • colour - colour to give the band for this property. Any accepted way of specifying web colours can be used.\n *
  • opacity - Optional opacity to give the band for this property. A value between 0 and 1 - default is 1.\n *
  • svg - Optional string defining an SVG path of an icon to use in place of a colour swatch in the legend.\n *
  • svgScale - Optional number defining a scaling factor to apply to SVG icon (relative to others) - default is 1.\n *
  • legendOrder - Optional number used to sort the legend items. Low to high = left to right. If supplied, it\n * should be supplied for all metrics items otherwise results undefined. If not defined, default is to reverse the order.\n * Numbering should start at one and increase in increments of 1. For split bands it is also used to position the bands\n * from top to bottom\n *
\n * The order in which the metrics are specified determines the order in which properties are drawn on the chart. Each is\n * drawn over the previous so for overlapping properties (split = false), the one you want to draw on top should\n * come last. \n * @param {Array.} opts.data - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. \n * There should only be one object per taxon. (The order is not important.)\n *
    \n *
  • taxon - name of a taxon.\n *
  • p1 - an array of date band objects (see below), indicating start and end weeks for the property (can have any name).\n *
  • p2 - an array of date band objects (see below), indicating start and end weeks for the property (can have any name).\n * ... - there must be at leas one property column, but there can be any number of them.\n *
\n * The objects in each data band array have the following structure:\n *
    \n *
  • start - a number between 1 and 365 indicating the day of the year the band starts.\n *
  • end - a number between 1 and 365 indicating the day of the year the band ends.\n*
\n * @returns {module:phen2~api} api - Returns an API for the chart.\n */\n\nexport function phen2({\n // Default options in here\n selector = 'body',\n elid = 'phen2-chart',\n width = 300,\n height = 30,\n split = false,\n perRow = 2,\n expand = false,\n title = '',\n subtitle = '',\n footer = '',\n font = 'sans-serif',\n titleFontSize = 24,\n subtitleFontSize = 16,\n footerFontSize = 10,\n legendFontSize = 16,\n displayLegend = true,\n monthFontSize = 12,\n titleAlign = 'left',\n subtitleAlign = 'left',\n footerAlign = 'left',\n showTaxonLabel = true,\n taxonLabelFontSize = 16,\n taxonLabelItalics = false,\n axisBottom = 'tick',\n axisTop = 'on',\n axisLeft = 'on',\n axisRight = 'on',\n lineWidth = 1,\n headPad = 0,\n chartPad = 0,\n duration = 1000,\n interactivity = 'mousemove',\n //backColour = 'white',\n data = [],\n taxa = [],\n metrics = []\n} = {}) {\n\n let metricsPlus\n let pTrans\n\n const mainDiv = d3.select(`${selector}`)\n .append('div')\n .classed('brc-chart-phen2-top', true)\n .attr('id', elid)\n .style('position', 'relative')\n .style('display', 'inline')\n\n const svg = mainDiv.append('svg')\n svg.on(\"click\", function() {\n if (interactivity === 'mouseclick') {\n highlightItem(null, false)\n }\n })\n\n const svgChart = svg.append('svg').attr('class', 'mainChart')\n \n makeChart()\n // Texts must come after chart because \n // the chart width is required\n const textWidth = Number(svg.select('.mainChart').attr(\"width\") - headPad)\n makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n positionMainElements(svg, expand, headPad)\n\n svg.selectAll('line, path').style('stroke-width', lineWidth)\n svg.selectAll('text').style('font-family', font)\n\n function makeChart () {\n\n pTrans = []\n\n metricsPlus = metrics.map((m,i) => {\n return {\n id: safeId(m.label),\n prop: m.prop,\n label: m.label,\n colour: m.colour,\n opacity: m.opacity ? m.opacity : 1,\n svg: m.svg,\n // By default legend order is reversed\n legendOrder: m.legendOrder ? m.legendOrder : metrics.length - i,\n svgScale: m.svgScale ? m.svgScale : 1\n }\n })\n\n if (!taxa.length) {\n taxa = data.map(d => d.taxon).filter((v, i, a) => a.indexOf(v) === i)\n }\n\n const subChartPad = 10\n const svgsTaxa = taxa.map(t => makePhen(t))\n\n const subChartWidth = Number(svgsTaxa[0].attr(\"width\"))\n const subChartHeight = Number(svgsTaxa[0].attr(\"height\"))\n\n let legendHeight = 0\n if (displayLegend) {\n legendHeight = makeLegend(perRow * (subChartWidth + subChartPad) - headPad) + subChartPad\n }\n \n svgsTaxa.forEach((svgTaxon, i) => {\n \n const col = i%perRow\n const row = Math.floor(i/perRow)\n\n svgTaxon.attr(\"x\", col * (subChartWidth + subChartPad))\n svgTaxon.attr(\"y\", row * (subChartHeight + subChartPad) + legendHeight)\n })\n\n svgChart.attr(\"width\", perRow * (subChartWidth + subChartPad))\n svgChart.attr(\"height\", legendHeight + Math.ceil(svgsTaxa.length/perRow) * (subChartHeight + subChartPad))\n\n return Promise.allSettled(pTrans)\n }\n\n function makePhen (taxon) {\n // Get data for named taxon\n const dataFiltered = data.find(d => d.taxon === taxon)\n const rectData = []\n if (dataFiltered) {\n metricsPlus.forEach((m, im) => {\n dataFiltered[m.prop].forEach((d,i) => {\n rectData.push({\n id: `${m.id}-${i}`,\n iMetric: m.legendOrder ? m.legendOrder - 1 : im,\n class: m.id,\n colour: m.colour,\n opacity: m.opacity,\n start: d.start,\n end: d.end\n })\n })\n })\n }\n\n // Value scale\n const xScale = d3.scaleLinear().domain([1, 365]).range([0, width])\n const yScale = d3.scaleLinear().domain([0, 100]).range([height, 0])\n\n // X (bottom) axis\n let xAxis1, xAxis2\n if (axisBottom === 'on' || axisBottom === 'tick') {\n //xAxis = xAxisMonth(width, axisBottom === 'tick', monthFontSize, font)\n xAxis1 = xAxisMonthNoText(width, [1,12])\n xAxis2 = xAxisMonthText(width, axisBottom === 'tick', monthFontSize, font, [1,12])\n }\n\n // Top axis\n let tAxis\n if (axisTop === 'on') {\n tAxis = d3.axisTop()\n .scale(xScale)\n .tickValues([])\n .tickSizeOuter(0)\n }\n\n // Right axis\n let rAxis\n if (axisRight === 'on') {\n rAxis = d3.axisRight()\n .scale(yScale)\n .tickValues([])\n .tickSizeOuter(0)\n }\n\n // Y (left) axis\n let yAxis\n if (axisLeft === 'on') {\n yAxis = d3.axisLeft()\n .scale(yScale)\n .tickValues([])\n .tickSizeOuter(0)\n }\n\n // Create or get the relevant chart svg\n let init, svgPhen2, gPhen2\n if (taxa.length === 1 && svgChart.selectAll('.brc-chart-phen2').size() === 1) {\n svgPhen2 = svgChart.select('.brc-chart-phen2')\n gPhen2 = svgPhen2.select('.brc-chart-phen2-g')\n init = false\n } else if (svgChart.select(`#${safeId(taxon)}`).size()) {\n svgPhen2 = svgChart.select(`#${safeId(taxon)}`)\n gPhen2 = svgPhen2.select('.brc-chart-phen2-g')\n init = false\n } else {\n svgPhen2 = svgChart.append('svg')\n .classed('brc-chart-phen2', true)\n .attr('id', safeId(taxon))\n .style('overflow', 'visible')\n gPhen2 = svgPhen2.append('g')\n .classed('brc-chart-phen2-g', true)\n init = true\n }\n \n // Create/update the band rectangles with D3\n const mrects = gPhen2.selectAll(\"rect\")\n .data(rectData, d => d.id)\n\n const erects = mrects.enter()\n .append(\"rect\")\n .attr(\"class\", d => `phen-rect-${d.class} phen-rect`)\n .attr(\"width\", 0)\n .attr(\"height\", 0)\n .attr(\"x\", d => xScale(d.start+(d.end-d.start)/2))\n\n addEventHandlers(erects, 'class')\n\n transPromise(mrects.merge(erects)\n .transition()\n .duration(duration)\n .attr(\"width\", d => xScale(d.end) - xScale(d.start))\n .attr(\"height\", split ? height/metricsPlus.length : height)\n .attr(\"x\", d => xScale(d.start))\n .attr(\"y\", d => split ? d.iMetric * height/metricsPlus.length : 0)\n .attr(\"opacity\", d => d.opacity)\n .attr(\"fill\", d => d.colour), pTrans)\n \n transPromise(mrects.exit()\n .transition()\n .duration(duration)\n .attr(\"width\", 0)\n .attr(\"height\", 0)\n .remove(), pTrans)\n\n if (init) {\n // Constants for positioning\n const axisPadX = chartPad\n const axisPadY = axisBottom === 'tick' ? 15 : 0\n let labelPadY \n\n // Taxon title\n if (showTaxonLabel) {\n const taxonLabel = svgPhen2\n .append('text')\n .classed('brc-chart-phen2-label', true)\n .text(taxon)\n //.style('font-family', font)\n .style('font-size', taxonLabelFontSize)\n .style('font-style', taxonLabelItalics ? 'italic' : '')\n\n const labelHeight = taxonLabel.node().getBBox().height\n taxonLabel.attr(\"transform\", `translate(${axisPadX}, ${labelHeight})`)\n labelPadY = labelHeight * 1.5\n } else {\n labelPadY = 0\n }\n \n // Size SVG\n svgPhen2\n .attr('width', width + axisPadX + 1)\n .attr('height', height + axisPadY + labelPadY + 1)\n\n // Position chart\n gPhen2.attr(\"transform\", `translate(${axisPadX},${labelPadY})`)\n \n // Create axes and position within SVG\n if (xAxis1 && xAxis2) {\n // const gXaxis = svgPhen2.append(\"g\")\n // .attr(\"class\", \"x axis\")\n // .style('font-size', monthFontSize)\n // .call(xAxis)\n\n const gXaxis1 = svgPhen2.append(\"g\")\n .attr(\"class\", \"x axis\")\n .style('font-size', monthFontSize)\n .call(xAxis1)\n\n const gXaxis2 = svgPhen2.append(\"g\")\n .attr(\"class\", \"x axis\")\n .style('font-size', monthFontSize)\n .call(xAxis2)\n\n // gXaxis.selectAll(\".tick text\")\n // .style(\"text-anchor\", \"start\")\n // .attr(\"x\", 6)\n // .attr(\"y\", 6)\n\n gXaxis2.selectAll(\".tick text\")\n .style(\"text-anchor\", \"middle\")\n\n gXaxis1.attr(\"transform\", `translate(${axisPadX},${height + labelPadY})`)\n gXaxis2.attr(\"transform\", `translate(${axisPadX},${height + labelPadY})`)\n\n //gXaxis.attr(\"transform\", `translate(${axisPadX},${height + labelPadY})`)\n }\n\n if (yAxis) {\n const gYaxis = svgPhen2.append(\"g\")\n //.attr(\"class\", \"y-axis\")\n .call(yAxis)\n gYaxis.attr(\"transform\", `translate(${axisPadX},${labelPadY})`)\n }\n if (tAxis) {\n const gTaxis = svgPhen2.append(\"g\")\n .call(tAxis)\n gTaxis.attr(\"transform\", `translate(${axisPadX},${labelPadY})`)\n }\n if (rAxis) {\n const gRaxis = svgPhen2.append(\"g\")\n .call(rAxis)\n gRaxis.attr(\"transform\", `translate(${axisPadX + width},${labelPadY})`)\n }\n\n } else if (taxa.length === 1) {\n // Update taxon label\n if (showTaxonLabel) {\n svgPhen2.select('.brc-chart-phen2-label').text(taxon)\n }\n }\n return svgPhen2\n }\n\n function makeLegend (legendWidth) {\n \n const swatchSize = 20\n const swatchFact = 1.3\n\n // Loop through all the legend elements and work out their\n // positions based on swatch size, item lable text size and\n // legend width.\n let rows = 0\n let lineWidth = -swatchSize\n\n //const metricsSorted = cloneData(metricsPlus).reverse()\n const metricsSorted = cloneData(metricsPlus)\n .filter(m => m.label)\n .sort((a,b) => a.legendOrder > b.legendOrder ? 1 : -1)\n \n // Get the bbox of any SVG icons in metrics\n metricsSorted.filter(m => m.svg).forEach(m => {\n const path = svgChart.append('path').attr('d', m.svg).style('visibility', 'hidden')\n m.svgbbox = path.node().getBBox()\n path.remove()\n })\n\n metricsSorted.forEach(m => {\n const tmpText = svgChart.append('text') //.style('display', 'none')\n .text(m.label)\n //.style('font-family', font)\n .style('font-size', legendFontSize)\n\n const widthText = tmpText.node().getBBox().width\n tmpText.remove()\n\n if (lineWidth + swatchSize + swatchSize * swatchFact + widthText > legendWidth) {\n ++rows\n lineWidth = -swatchSize\n }\n m.x = lineWidth + swatchSize + headPad\n m.y = rows * swatchSize * swatchFact\n\n lineWidth = lineWidth + swatchSize + swatchSize * swatchFact + widthText\n })\n\n // Note that the stuff below uses the D3 Join general udpate pattern\n // https://observablehq.com/@d3/selection-join\n\n // Swatch\n const ls = svgChart.selectAll('.brc-legend-item-rect')\n .data(metricsSorted, m => m.id)\n .join(enter => {\n const rect = enter.append(\"rect\")\n .attr(\"class\", m => `brc-legend-item brc-legend-item-rect brc-legend-item-${m.id}`)\n .attr('width', swatchSize)\n .attr('height', swatchSize/2)\n .attr('display', m => m.svg ? 'none' : '')\n return rect\n })\n .attr('x', m => m.x)\n .attr('y', m => m.y + swatchSize/3)\n .attr(\"opacity\", d => d.opacity)\n .attr('fill', m => m.colour)\n\n // SVG icon\n const li = svgChart.selectAll('.brc-legend-item-icon')\n .data(metricsSorted, m => m.id)\n .join(enter => enter\n .append(\"path\")\n .attr(\"class\", m=> `brc-legend-item brc-legend-item-icon brc-legend-item-${m.id}`)\n .attr(\"d\", m => m.svg)\n )\n // The transform has to come outside the enter selection so that it is executed whenever\n // the code is called. Important because the bbox stuff only works if gui is visible and\n // the first time this code is called, it may not be visible.\n // The svg is also scaled by a factor passed in the metrics (svgScale) which\n // defaults to 1.\n .attr('transform', m => {\n if (m.svg && m.svgbbox && m.svgbbox.width) {\n const iScale = swatchSize / m.svgbbox.width * m.svgScale\n const xAdj = m.svgbbox.x * iScale\n const yAdj = m.svgbbox.y * iScale - (swatchSize - m.svgbbox.height * iScale)/2\n return `translate(${m.x - xAdj} ${m.y - yAdj}) scale(${iScale} ${iScale})`\n } else {\n return ''\n }\n })\n .attr('fill', m => m.colour)\n .attr('opacity', m => m.opacity)\n\n // Text\n const lt = svgChart.selectAll('.brc-legend-item-text')\n .data(metricsSorted, m => safeId(m.label))\n .join(enter => {\n const text = enter.append(\"text\")\n .attr(\"class\", m=> `brc-legend-item brc-legend-item-text brc-legend-item-${m.id}`)\n .text(m => m.label)\n //.style('font-family', font)\n .style('font-size', legendFontSize)\n return text\n })\n .attr('x', m => m.x + swatchSize * swatchFact * m.svgScale)\n .attr('y', m => m.y + legendFontSize * 1)\n\n addEventHandlers(ls, 'label')\n addEventHandlers(lt, 'label')\n addEventHandlers(li, 'label')\n\n return swatchSize * swatchFact * (rows + 1)\n }\n\n function highlightItem(cls, highlight) {\n\n svgChart.selectAll('.phen-rect')\n .classed('lowlight', highlight)\n\n svgChart.selectAll(`.phen-rect-${cls}`)\n .classed('lowlight', false)\n \n svgChart.selectAll(`.phen-rect`)\n .classed('highlight', false)\n\n if (cls) {\n svgChart.selectAll(`.phen-rect-${cls}`)\n .classed('highlight', highlight)\n }\n \n svgChart.selectAll('.brc-legend-item')\n .classed('lowlight', highlight)\n\n if (cls) {\n svgChart.selectAll(`.brc-legend-item-${cls}`)\n .classed('lowlight', false)\n }\n\n if (cls) {\n svgChart.selectAll(`.brc-legend-item-${cls}`)\n .classed('highlight', highlight)\n } else {\n svgChart.selectAll(`.brc-legend-item`)\n .classed('highlight', false)\n }\n }\n\n function addEventHandlers(sel, prop) {\n sel\n .on(\"mouseover\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(safeId(d[prop]), true)\n }\n })\n .on(\"mouseout\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(safeId(d[prop]), false)\n }\n })\n .on(\"click\", function(d) {\n if (interactivity === 'mouseclick') {\n highlightItem(safeId(d[prop]), true)\n d3.event.stopPropagation()\n }\n })\n }\n\n/** @function setChartOpts\n * @param {Object} opts - text options.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {Array.} opts.metrics - An array of objects, each describing a numeric property in the input data (see main interface for details).\n * @param {Array.} opts.data - Specifies an array of data objects (see main interface for details).\n * @returns {Promise} promise resolves when all transitions complete.\n * @description This function is exposed as a method on the API returned from the phen2 function.\n * Set's the value of the chart data, title, subtitle and/or footer. If an element is missing from the \n * options object, it's value is not changed.\n */\n function setChartOpts(opts){\n\n if ('title' in opts) {\n title = opts.title\n }\n if ('subtitle' in opts) {\n subtitle = opts.subtitle\n }\n if ('footer' in opts) {\n footer = opts.footer\n }\n if ('titleFontSize' in opts) {\n titleFontSize = opts.titleFontSize\n }\n if ('subtitleFontSize' in opts) {\n subtitleFontSize = opts.subtitleFontSize\n }\n if ('footerFontSize' in opts) {\n footerFontSize = opts.footerFontSize\n }\n if ('titleAlign' in opts) {\n titleAlign = opts.titleAlign\n }\n if ('subtitleAlign' in opts) {\n subtitleAlign = opts.subtitleAlign\n }\n if ('footerAlign' in opts) {\n footerAlign = opts.footerAlign\n }\n\n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n\n let remakeChart = false\n\n if ('data' in opts) {\n data = opts.data\n remakeChart = true\n }\n\n if ('metrics' in opts) {\n metrics = opts.metrics\n remakeChart = true\n }\n\n let pRet\n if (remakeChart) {\n pRet = makeChart()\n positionMainElements(svg, expand)\n } else {\n pRet = Promise.resolve()\n }\n return pRet\n }\n\n/** @function setTaxon\n * @param {string} opts.taxon - The taxon to display.\n * @returns {Promise} promise resolves when all transitions complete.\n * @description This function is exposed as a method on the API returned from the phen2 function.\n * For single species charts, this allows you to change the taxon displayed.\n */\n function setTaxon(taxon){\n let pRet\n if (taxa.length !== 1) {\n console.log(\"You can only use the setTaxon method when your chart displays a single taxon.\")\n pRet = Promise.resolve()\n } else {\n taxa = [taxon]\n pRet = makeChart()\n }\n return pRet\n }\n\n\n/** @function getChartWidth\n * @description This function is exposed as a method on the API returned from the phen2 function.\n * Return the full width of the chart svg.\n */\n function getChartWidth(){\n return svg.attr(\"width\") ? svg.attr(\"width\") : svg.attr(\"viewBox\").split(' ')[2]\n }\n\n/** @function getChartHeight\n * @description This function is exposed as a method on the API returned from the phen2 function.\n * Return the full height of the chart svg.\n */\n function getChartHeight(){\n return svg.attr(\"height\") ? svg.attr(\"height\") : svg.attr(\"viewBox\").split(' ')[3]\n }\n\n/** @function saveImage\n * @param {boolean} asSvg - If true, file is generated as SVG, otherwise PNG.\n * @param {string} filename - Name of the file (without extension) to generate and download.\n * If 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 promise's 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 phen2 function.\n * Download the chart as an image file.\n */\n function saveImage(asSvg, filename){\n return saveChartImage(svg, expand, asSvg, filename, font) \n }\n\n /**\n * @typedef {Object} api\n * @property {module:phen2~getChartWidth} getChartWidth - Gets and returns the current width of the chart.\n * @property {module:phen2~getChartHeight} getChartHeight - Gets and returns the current height of the chart. \n * @property {module:phen2~setChartOpts} setChartOpts - Sets text options for the chart. \n * @property {module:phen2~setChartOpts} setTaxon - Changes the displayed taxon for single taxon charts. \n * @property {module:phen2~saveImage} saveImage - Generates and downloads and image file for the SVG. \n */\n return {\n getChartHeight: getChartHeight,\n getChartWidth: getChartWidth,\n setChartOpts: setChartOpts,\n setTaxon: setTaxon,\n saveImage: saveImage\n }\n\n}","/** @module pie */\n\nimport * as d3 from 'd3'\nimport * as gen from '../general'\nimport { makePie } from './makepie'\nimport { makeLegend } from './legend'\nimport { highlightItem} from './highlightitem'\n\n//https://www.d3-graph-gallery.com/graph/pie_annotation.html\n//https://github.com/d3/d3-shape/blob/v2.0.0/README.md#pie\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.elid - The id for the dom object created.\n * @param {number} opts.strokeWidth - The desired width of the line delineating chart segments in pixels.\n * @param {number} opts.radius - The desired radius of the chart in pixels.\n * @param {number} opts.innerRadius - The desired inner radius of the chart in pixels. Default of zero gives a pie chart. Specify a value for donut chart.\n * If your data specify more than one dataset (for concentric donuts), this value is also the out-radius of the second set.\n * @param {number} opts.innerRadius2 - The desired inner radius of the second dataset in pixels, for a donut chart with two concentric donuts.\n * Default of zero gives a pie char. Specify a value for donut chart.\n * @param {number} opts.imageWidth - The width of images in pixels. Images will be resized to this width.\n * @param {string} opts.sort - Sort function. Set to 'asc' for ascending, 'desc' for descending or '' for no sort.\n * @param {string} opts.label - How to label sections. Set to 'value' for raw number, 'percent' for percentage or\n * 'pervalue' for percentage and count together.\n * @param {string} opts.labelFontSize - Specifies the size of label and legend text.\n * @param {string} opts.labelColour - Specifies the colour of label text.\n * @param {boolean} opts.expand - Indicates whether or not the chart will expand to fill parent element and scale as that element resized.\n * @param {string} opts.legendTitle - Specifies text, if required, for a legend title.\n * @param {string} opts.legendTitle2 - Specifies text, if required, for a legend title for second dataset (inner concentric donut).\n * @param {string} opts.legendTitleFontSize - Font size (pixels) of legend title(s).\n * @param {string} opts.legendSwatchSize - Specifies the size of legend swatches.\n * @param {string} opts.legendSwatchGap - Specifies the size of gap between legend swatches.\n * @param {number} opts.legendWidth - The width of the legend in pixels.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {string} opts.interactivity - Specifies how item highlighting occurs. Can be 'mousemove', 'mouseclick' or 'none'.\n * @param {number} opts.duration - The duration of each transition phase in milliseconds.\n * @param {Array.} opts.data - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • set - a number to indicate to which 'dataset' this item belongs. Used when concentric donuts are requred.\n *
  • name - the name of the data item uniquely identifies it and is shown in the legend.\n *
  • number - a numeric value associated with the item.\n *
  • colour - an optional 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. If not specified, a colour will be assigned.\n *
  • image - this optional property allows you to specify the url of an image file\n * which can be displayed when a user selects the associated item.\n *
\n * @param {function} opts.callback - A callback function executed when a pie segment is highlighted. Gets passed\n * the name property of the highlighted data.\n * @returns {module:pie~api} api - Returns an API for the chart.\n */\n\nexport function pie({\n // Default options in here\n selector = 'body',\n elid = 'piechart',\n strokeWidth = 2,\n radius = 180,\n innerRadius = 0,\n innerRadius2 = 0,\n sort = '',\n label = 'percent',\n labelFontSize = 14,\n labelColour = 'white',\n expand = false,\n legendTitle = '',\n legendTitle2 = '',\n legendTitleFontSize = 16,\n legendSwatchSize = 30,\n legendSwatchGap = 10,\n legendWidth = 200,\n title = '',\n subtitle = '',\n footer = '',\n titleFontSize = 24,\n subtitleFontSize = 16,\n footerFontSize = 14,\n titleAlign = 'left',\n subtitleAlign = 'left',\n footerAlign = 'left',\n imageWidth = 150,\n duration = 1000,\n interactivity = 'mousemove',\n data = [],\n callback = function(){return}\n} = {}) {\n\n let dataPrev\n //let block = false\n\n colourData(data)\n\n const mainDiv = d3.select(`${selector}`)\n .append('div')\n .attr('id', elid)\n .attr('class', 'brc-chart-pie')\n .style('position', 'relative')\n .style('display', 'inline')\n\n const chartDiv = mainDiv\n .append('div')\n\n const svg = chartDiv.append('svg').attr('overflow', 'visible')\n const svgChart = svg.append('svg').attr('class', 'mainChart')\n\n svg.on(\"click\", function() {\n if (interactivity === 'mouseclick') {\n highlightItem(svg, null, false, dataPrev, imageWidth, callback)\n }\n })\n\n makeChart(data)\n const textWidth = Number(svgChart.attr(\"width\"))\n // Texts must come after chart and legend because the \n // width of those is required to do wrap text\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n gen.positionMainElements(svg, expand)\n\n function makeChart(data) {\n\n dataPrev = makePie (data, dataPrev, sort, strokeWidth, radius, innerRadius, innerRadius2, svg, svgChart, imageWidth, interactivity, duration, label, labelColour, labelFontSize, callback)\n \n makeLegend (data, svg, svgChart, legendWidth, labelFontSize, legendSwatchSize, legendSwatchGap, legendTitle, legendTitle2, legendTitleFontSize, duration, interactivity, dataPrev, imageWidth, callback)\n const svgPie = svgChart.select('.brc-chart-pie')\n const svgLegend = svgChart.select('.brc-chart-legend')\n svgPie.attr(\"x\", Number(svgLegend.attr(\"width\")) + legendSwatchGap)\n svgChart.attr(\"width\", Number(svgLegend.attr(\"width\")) + legendSwatchGap + Number(svgPie.attr(\"width\")))\n svgChart.attr(\"height\", Math.max(Number(svgLegend.attr(\"height\")), Number(svgPie.attr(\"height\"))))\n }\n\n function colourData(data) {\n data.forEach((d,i) => {\n if (!d.colour) {\n if (i < 10) {\n d.colour = d3.schemeCategory10[i]\n }\n else if (i < 18) {\n d.colour = d3.schemeDark2[i - 10]\n }\n else if (i < 26) {\n d.colour = d3.schemeAccent[i - 18]\n }\n else {\n d.colour = d3.interpolateSpectral(Math.random())\n }\n }\n })\n }\n\n/** @function setChartOpts\n * @param {Object} opts - text options.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {number} opts.radius - The desired radius of the chart in pixels.\n * @param {number} opts.innerRadius - The desired inner radius of the chart in pixels. Default of zero gives a pie chart. Specify a value for donut chart.\n * If your data specify more than one dataset (for concentric donuts), this value is also the out-radius of the second set.\n * @param {number} opts.innerRadius2 - The desired inner radius of the second dataset in pixels, for a donut chart with two concentric donuts.\n * Default of zero gives a pie char. Specify a value for donut chart.\n * @param {string} opts.legendTitle - Specifies text, if requiredi, for a legend title.\n * @param {string} opts.legendTitle2 - Specifies text, if required, for a legend title for second dataset (inner concentric donut).\n * @param {Array.} opts.data - Specifies an array of data objects.\n * @description This function is exposed as a method on the API returned from the pie function.\n * Set's the value of the chart data, title, subtitle and/or footer. If an element is missing from the \n * options object, it's value is not changed.\n */\n function setChartOpts(opts){\n\n //if (!block) {\n\n highlightItem(svg, null, false, dataPrev, imageWidth, callback)\n\n if ('title' in opts) {\n title = opts.title\n }\n if ('subtitle' in opts) {\n subtitle = opts.subtitle\n }\n if ('footer' in opts) {\n footer = opts.footer\n }\n if ('titleFontSize' in opts) {\n titleFontSize = opts.titleFontSize\n }\n if ('subtitleFontSize' in opts) {\n subtitleFontSize = opts.subtitleFontSize\n }\n if ('footerFontSize' in opts) {\n footerFontSize = opts.footerFontSize\n }\n if ('titleAlign' in opts) {\n titleAlign = opts.titleAlign\n }\n if ('subtitleAlign' in opts) {\n subtitleAlign = opts.subtitleAlign\n }\n if ('footerAlign' in opts) {\n footerAlign = opts.footerAlign\n }\n if ('radius' in opts) {\n radius = opts.radius\n }\n if ('innerRadius' in opts) {\n innerRadius = opts.innerRadius\n }\n if ('innerRadius2' in opts) {\n innerRadius2 = opts.innerRadius2\n }\n if ('legendTitle' in opts) {\n legendTitle = opts.legendTitle\n }\n if ('legendTitle2' in opts) {\n legendTitle2 = opts.legendTitle2\n }\n\n const textWidth = Number(svgChart.attr(\"width\"))\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n\n if ('data' in opts) {\n colourData(opts.data)\n makeChart(opts.data)\n }\n\n //positionElements()\n gen.positionMainElements(svg, expand)\n // } else {\n // console.log('Transition in progress')\n // }\n }\n\n/** @function getChartWidth\n * @description This function is exposed as a method on the API returned from the pie function.\n * Return the full width of the chart svg.\n */\n function getChartWidth(){\n return svg.attr(\"width\") ? svg.attr(\"width\") : svg.attr(\"viewBox\").split(' ')[2]\n }\n\n/** @function getChartHeight\n * @description This function is exposed as a method on the API returned from the pie function.\n * Return the full height of the chart svg.\n */\n function getChartHeight(){\n return svg.attr(\"height\") ? svg.attr(\"height\") : svg.attr(\"viewBox\").split(' ')[3]\n }\n\n/** @function saveImage\n * @param {boolean} asSvg - If true, file is generated as SVG, otherwise PNG.\n * @param {string} filename - Name of the file (without extension) to generate and download.\n * If 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 promise's 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 pie function.\n * Download the chart as an image file.\n */\n function saveImage(asSvg, filename){\n return gen.saveChartImage(svg, expand, asSvg, filename) \n }\n\n /**\n * @typedef {Object} api\n * @property {module:pie~getChartWidth} getChartWidth - Gets and returns the current width of the chart.\n * @property {module:pie~getChartHeight} getChartHeight - Gets and returns the current height of the chart. \n * @property {module:pie~setChartOpts} setChartOpts - Sets text options for the chart. \n * @property {module:pie~saveImage} saveImage - Generates and downloads and image file for the SVG. \n */\n return {\n getChartHeight: getChartHeight,\n getChartWidth: getChartWidth,\n setChartOpts: setChartOpts,\n saveImage: saveImage\n }\n\n}","/** @module temporal */\n\nimport * as d3 from 'd3'\nimport * as gen from '../general'\nimport { makeTemporal } from './makeTemporal'\nimport { makeLegend } from './legend'\nimport { highlightItem } from './highlightitem'\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. (Default - 'body'.)\n * @param {string} opts.elid - The id for the dom object created. (Default - 'temporal-chart'.)\n * @param {number} opts.width - The width of each sub-chart area in pixels. (Default - 300.)\n * @param {number} opts.height - The height of the each sub-chart area in pixels. (Default - 200.)\n * @param {Object} opts.margin - An object indicating the margins to add around each sub-chart area.\n * @param {number} opts.margin.left - Left margin in pixels. (Default - 40.)\n * @param {number} opts.margin.right - Right margin in pixels. (Default - 40.)\n * @param {number} opts.margin.top - Top margin in pixels. (Default - 20.)\n * @param {number} opts.margin.bottom - Bottom margin in pixels. (Default - 20.)\n * @param {number} opts.perRow - The number of sub-charts per row. (Default - 2.)\n * @param {boolean} opts.expand - Indicates whether or not the chart will expand to fill parent element and scale as that element resized. (Default - false.)\n * @param {string} opts.title - Title for the chart. (Default - ''.)\n * @param {string} opts.subtitle - Subtitle for the chart. (Default - ''.)\n * @param {string} opts.footer - Footer for the chart. (Default - ''.)\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title. (Default - 24.)\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle. (Default - 16.)\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer. (Default - 10.)\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {boolean} opts.showTaxonLabel - Whether or not to show taxon label above each sub-graph. (Default - true.)\n * @param {boolean} opts.showLegend - Whether or not to show an overall chart legend. (Default - true.)\n * @param {string} opts.taxonLabelFontSize - Font size (pixels) of taxon sub-chart label. (Default - 10.)\n * @param {boolean} opts.taxonLabelItalics - Whether or not to italicise taxon label.(Default - true.)\n * @param {string} opts.legendFontSize - Font size (pixels) of legend item text. (Default - 16.)\n * @param {string} opts.axisLeftLabel - Value for labelling left axis. (Default - ''.)\n * @param {string} opts.axisRightLabel - Value for labelling right axis. (Default - ''.)\n * @param {string} opts.axisLabelFontSize - Font size (pixels) for axist labels. (Default - 10.)\n * @param {string} opts.axisLeft - If set to 'on' line is drawn without ticks. \n * If set to 'tick' line and ticks drawn. Any other value results in no axis. (Default - 'tick'.)\n * @param {string} opts.axisRight - If set to 'on' line is drawn without ticks. \n * If set to 'tick' line and ticks drawn. Any other value results in no axis. (Default - ''.)\n * @param {string} opts.axisTop - If set to 'on' line is drawn otherwise not. (Default - ''.)\n * @param {string} opts.axisBottom - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis. (Default - 'tick'.)\n * @param {number} opts.headPad - A left hand offset, in pixels, for title, subtitle, legend and footer. (Default 0.)\n * @param {number} opts.duration - The duration of each transition phase in milliseconds. (Default - 1000.)\n * @param {string} opts.chartStyle - The type of the graphic 'bar' for a barchart and 'line' for a line graph. (Default - 'bar'.)\n * @param {string} opts.interactivity - Specifies how item highlighting occurs. Can be 'mousemove', 'mouseclick' or 'none'. (Default - 'none'.)\n * @param {Array.} opts.metrics - An array of objects, each describing a numeric property in the input\n * data for which graphics should be generated on the chart.\n * Each of the objects in the data array can be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • prop - the name of the numeric property in the data (metric properties - 'c1' or 'c2' in the example below).\n *
  • id - a unique identifier for the property. This is only necessary if metrics can be interactively added or removed on a chart.\n * Under these circumstances, transitions and highlighting can get mixed up if each metric does not have a consistent unique id.\n *
  • taxon - an optional property that can be used to limit the metric display to a particular taxon. This\n * is meant to be used in conjunction with the opts.taxa value of [null] - see above.\n *
  • periodMin a value for period, before which points should not be displayed.\n *
  • periodMax a value for period, after which points should not be displayed.\n *
  • label - a label for this metric. (Optional - the default label will be the property name.)\n *
  • colour - optional colour to give the graphic for this metric. Any accepted way of \n * specifying web colours can be used. Use the special term 'fading' to successively fading shades of grey.\n * (Optional - default is 'blue'.)\n *
  • opacity - optional opacity to give the graphic for this metric. \n * (Optional - default is 1.)\n *
  • strokewidth - optional width of line for line for this metric if displayed as a line graph. \n * (Optional - default is 1.)\n *
  • fill - optional colour to give the area fill on area charts for this metric. Any accepted way of \n * specifying web colours can be used. Use the special term 'fading' to successively fading shades of grey.\n *
  • fillOpacity - optional opacity to give the area fill on area charts for this metric. \n * (Optional - default is 0.5.)\n *
  • bandUpper - optional name of a numeric property in the data which indicates the upper value\n * of a confidence band. Can only be used where chartStyle is 'line'. \n *
  • bandLower - optional name of a numeric property in the data which indicates the lower value\n * of a confidence band. Can only be used where chartStyle is 'line'. \n *
  • bandFill - optional colour to use for a confidence band. Any accepted way of \n * specifying web colours can be used. \n * (Optional - default is 'silver'.)\n *
  • bandStroke - optional colour to use for the uppder and lower boundaries of a confidence band. Any accepted way of \n * specifying web colours can be used. \n * (Optional - default is 'grey'.)\n *
  • bandOpacity - optional opacity to give the confidence band for this metric. \n * (Optional - default is 0.5.)\n *
  • bandStrokeOpacity - optional opacity to give the boundaries of the confidence band for this metric. \n * (Optional - default is 1.)\n *
  • bandStrokewidth - optional width of line for bounary lines of the confidence band this metric if displayed as a line graph. \n * (Optional - default is 1.)\n *
  • points - a boolean value which indicates whether or not a point is to be displayed (over the line or bar).\n *
  • errorBarUpper - optional name of a numeric property in the data which indicates the upper value\n * of an error bar. Used in conjunction with the errorBarLower property. \n*
  • errorBarLower - optional name of a numeric property in the data which indicates the lower value\n * of an error bar. Used in conjunction with the errorBarUpper property. \n *
\n * @param {Array.} opts.data - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • taxon - name of a taxon.\n *
  • period - a number indicating a week, nonth or a year.\n *
  • c1 - a metric for a given period (can have any name). \n *
  • c2 - a metric for a given period (can have any name).\n * ... - there must be at least one metric column, but there can be any number of them.\n *
\n * @param {Array.} opts.dataPoints - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • taxon - name of a taxon. This is optional. If not specified, then data are shown regardless of selected taxon.\n *
  • period - a number indicating a week, month or a year.\n *
  • y - y value for a given period. \n *
  • upper - a value for upper confidence band.\n *
  • lower - a value for lower confidence band.\n *
\n * @param {Array.} opts.dataTrendLines - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • id - if the trend line is to be associated with a particular metric, then set this value to match the\n * id property of the metric. Then the line(s) will be included in highlighting/lowlighting for the metric.\n *
  • taxon - name of a taxon. This is optional. If not specified, then data are shown regardless of selected taxon.\n *
  • gradient - a gradient for the line (either specify gradient & intercept or p1, p2, v1 and v2).\n *
  • intercept - the y axis intercept value (at x = 0) for the line (either specify gradient & intercept or p1, p2, v1 and v2). \n *
  • p1 - the lower period for the line (either specify gradient & intercept or p1, p2, v1 and v2). \n *
  • p2 - the upper period for the line (either specify gradient & intercept or p1, p2, v1 and v2). \n *
  • v1 - the lower value for the line (either specify gradient & intercept or p1, p2, v1 and v2). \n *
  • v2 - the upper value for the line (either specify gradient & intercept or p1, p2, v1 and v2). \n *
  • colour - the colour of the line the line. Any accepted way of specifying web colours can be used. (Default - red.)\n *
  • width - the width the line the line in pixels. (Default - 1.)\n *
  • opacity - the opacity of the line. (Default - 1.)\n *
\n * @param {Array.} opts.verticals - Specifies an array of data objects for showing vertical lines and bands on a chart.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • taxon - name of a taxon. This is optional. If not specified, then data are shown regardless of selected taxon.\n *
  • colour - the colour of the line or band. Any accepted way of specifying web colours can be used. (Default - red.)\n *
  • start - a value to indicate the position on the x axis where the line will be drawn (or band start). For periodType of 'year'\n * this value is specified in units of years. For periodType of 'month' or 'week', this value is specified in *days*. (See below for values\n * than map to the first day for each month.) \n *
  • width - the width of the band to be drawn. If absent or zero, then a line is drawn rather than a band. Specified in the\n * same units as the 'start' value. (Default - 0.). \n *
\n * The numbers used for the first of the month for each month Jan to Dec are: 1, 32, 61, 92, 122, 153, 183, 214, 245, 275, 306 and 336.\n * @param {Array.} opts.taxa - An array of taxa (names), indicating which taxa create charts for. \n * If empty, graphs for all taxa are created. If set to an array with a single null value - [null] - then\n * each metric must have a property called 'taxon' which specifies the taxon to be displayed for that metric.\n * In this way, multiple taxa can be displayed on the same graph. (Default - [].)\n * @param {string} opts.periodType - Indicates the type of period data to be specified. Can be 'year', 'month' or 'week'. (Default - 'year'.)\n * @param {number} opts.minPeriod - Indicates the earliest period to use on the x axis. If left unset, the earliest period in the dataset is used. (Default - null.)\n * @param {number} opts.maxPeriod - Indicates the latest period to use on the x axis. If left unset, the latest period in the dataset is used. (Default - null.)\n * @param {number} opts.minPeriodTrans - If set, this indicates the lowest possible period. It is only useful if transitioning between datasets with different\n * temporal ranges - its purpose is to facilitate smooth transitions of lines and bands in these cases. (Default - null.)\n * @param {number} opts.maxPeriodTrans - If set, this indicates the highest possible period. It is only useful if transitioning between datasets with different\n * temporal ranges - its purpose is to facilitate smooth transitions of lines and bands in these cases. (Default - null.)\n * @param {number} opts.minY - Indicates the lowest value to use on the y axis. If left unset, the lowest value in the dataset is used. (Default - null.)\n * @param {number} opts.maxY - Indicates the highest value to use on the y axis. If left unset, the highest value in the dataset is used. (Default - null.)\n * @param {number} opts.minMaxY - Indicates a minumum value for the maximum value. Set to null for no minimum value. (Default is 5.)\n * @param {number} opts.xPadPercent - Padding to add either side of min and max period value - expressed as percentage of temporal range. Can only be used on line charts. (Default - 0.)\n * @param {number} opts.yPadPercent - Padding to add either side of min and max y value - expressed as percentage of y range. Can only be used on line charts. (Default - 0.)\n * @param {string|number} opts.missingValues - A value which indicates how gaps in temporal data are treated. Can either be the string value 'break' which leaves gaps in\n * line charts, 'bridge' which joins the points either side of a missing value or a numeric value which is used to replace the missing value. (Default - 'break'.)\n * @param {Array.} opts.monthScaleRange - A two value numeric array indicating which months to include on annual scales (for periodType 'month' or 'week'). (Default - [1,12].)\n * causes trend lines to break where no value, 'bridge' which causes gaps to be bridged with straight line or a numeric value. (Default - 0.)\n * @param {boolean} opts.lineInterpolator - Set to the name of a d3.line.curve interpolator to curve lines. (Default - 'curveLinear'.)\n * @param {string} opts.metricExpression - Indicates how the metric is expressed can be '' to leave as is, or 'proportion' to express as a proportion of\n * the total of the metric or 'normalized' to normalize the values. (Default - ''.)\n * @param {string} opts.composition - Indicates how to display multiple metrics. If set to empty string then the metrics\n * values are overlaid on each other, setting to 'stack' stacks the graphics and setting to 'spread' spreads them\n * vertically across the chart. (Default - ''.)\n * @param {boolean} opts.overrideHighlight - if set to true, the default styles for highlighting and lowlighting are not applied and you\n * can provide your own CSS to do it. Target .temporal-graphic.lowlight and .temporal-graphic.highlight. (Default - false.)\n * @param {number} opts.spreadOverlap - a number between 0 and 1 that indicates how much overlap is permitted on graphics for different\n * metrics on a chart of composition type 'spread'. (Default - 0.8.)\n * @returns {module:temporal~api} api - Returns an API for the chart.\n */\n\nexport function temporal({\n // Default options in here\n selector = 'body',\n elid = 'temporal-chart',\n width = 300,\n height = 200,\n margin = {left: 30, right: 30, top: 15, bottom: 20},\n perRow = 2,\n expand = false,\n title = '',\n subtitle = '',\n footer = '',\n titleFontSize = 24,\n subtitleFontSize = 16,\n footerFontSize = 10,\n legendFontSize = 16,\n showLegend = false,\n axisLeftLabel = '',\n axisRightLabel = '',\n axisLabelFontSize = 10,\n titleAlign = 'left',\n subtitleAlign = 'left',\n footerAlign = 'left',\n showTaxonLabel = true,\n taxonLabelFontSize = 10,\n taxonLabelItalics = false,\n axisLeft = 'tick',\n //yAxisOpts = {numFormat: 'd', minMax: 5, fixedMin: 0, padding: 0},\n axisBottom = 'tick',\n axisRight = '',\n axisTop = '',\n chartStyle = 'bar', \n headPad = 0,\n duration = 1000,\n interactivity = 'none',\n data = [],\n dataPoints = [],\n dataTrendLines = [],\n taxa = [],\n metrics = [],\n minPeriod = null,\n maxPeriod = null,\n minPeriodTrans = null,\n maxPeriodTrans = null,\n minY = null,\n maxY = null,\n minMaxY = 5,\n xPadPercent = 0,\n yPadPercent = 0,\n missingValues = 'break',\n periodType = 'year',\n monthScaleRange = [1,12],\n lineInterpolator = 'curveLinear',\n verticals = [],\n metricExpression = '',\n composition = '',\n overrideHighlight = false,\n spreadOverlap = 0.8,\n} = {}) {\n\n // xPadPercent and yPadPercent can not be used with charts of bar type.\n if (chartStyle === 'bar') {\n xPadPercent = 0\n yPadPercent = 0\n }\n\n let metricsPlus\n\n const mainDiv = d3.select(`${selector}`)\n .append('div')\n .attr('id', elid)\n .style('position', 'relative')\n .style('display', 'inline')\n\n const svg = mainDiv.append('svg')\n svg.on(\"click\", function() {\n if (interactivity === 'mouseclick') {\n highlightItem(null, false, svgChart)\n }\n })\n\n const svgChart = svg.append('svg').attr('class', 'mainChart brc-chart-temporal')\n svgChart.classed('use-highlighting', !overrideHighlight)\n\n preProcessMetrics()\n makeChart()\n // Texts must come after chartbecause \n // the chart width is required\n const textWidth = Number(svg.select('.mainChart').attr(\"width\") - headPad)\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n gen.positionMainElements(svg, expand, headPad)\n\n function makeChart () {\n\n // Set min and max period from data if not set\n if (!minPeriod || minPeriod === Infinity) {\n minPeriod = Math.min(...data.map(d => d.period))\n }\n if (!maxPeriod || maxPeriod === -Infinity) {\n maxPeriod = Math.max(...data.map(d => d.period))\n }\n\n // If taxa for graphs not set, set to all in dataset\n if (!taxa.length) {\n taxa = data.map(d => d.taxon).filter((v, i, a) => a.indexOf(v) === i)\n }\n\n const subChartPad = 10\n const pTrans = []\n\n const svgsTaxa = taxa.map(taxon => makeTemporal (\n svgChart,\n taxon,\n taxa,\n data,\n dataPoints,\n dataTrendLines,\n periodType,\n monthScaleRange,\n minPeriod,\n maxPeriod,\n minPeriodTrans,\n maxPeriodTrans,\n minY,\n maxY,\n minMaxY,\n xPadPercent,\n yPadPercent,\n metricsPlus,\n width,\n height,\n axisTop,\n axisBottom,\n chartStyle,\n axisLeft,\n //yAxisOpts,\n axisRight,\n duration,\n interactivity,\n margin,\n showTaxonLabel,\n taxonLabelFontSize,\n taxonLabelItalics,\n axisLabelFontSize,\n axisLeftLabel,\n axisRightLabel,\n missingValues,\n lineInterpolator,\n verticals,\n metricExpression,\n composition,\n spreadOverlap,\n pTrans\n ))\n\n const subChartWidth = Number(svgsTaxa[0].attr(\"width\"))\n const subChartHeight = Number(svgsTaxa[0].attr(\"height\"))\n\n const legendHeight = showLegend ? makeLegend(\n svgChart,\n metricsPlus,\n perRow * (subChartWidth + subChartPad) - headPad,\n legendFontSize,\n headPad,\n chartStyle,\n interactivity\n ) + subChartPad : 0\n\n svgsTaxa.forEach((svgTaxon, i) => {\n \n const col = i%perRow\n const row = Math.floor(i/perRow)\n\n svgTaxon.attr(\"x\", col * (subChartWidth + subChartPad))\n svgTaxon.attr(\"y\", row * (subChartHeight + subChartPad) + legendHeight)\n })\n\n svgChart.attr(\"width\", perRow * (subChartWidth + subChartPad))\n svgChart.attr(\"height\", legendHeight + Math.ceil(svgsTaxa.length/perRow) * (subChartHeight + subChartPad))\n\n return Promise.allSettled(pTrans)\n }\n\n function preProcessMetrics () {\n // Look for 'fading' colour in taxa and colour appropriately \n // in fading shades of grey.\n \n let iFading = 0\n metricsPlus = metrics.map((m,i) => {\n let iFade, strokeWidth\n if (m.colour === 'fading') {\n iFade = ++iFading\n strokeWidth = 1\n } else {\n strokeWidth = m.strokeWidth ? m.strokeWidth : 1\n }\n return {\n index: i,\n id: m.id, // An optional metrics property - useful if metrics can change\n prop: m.prop,\n label: m.label ? m.label : m.prop,\n opacity: m.opacity !== 'undefined' ? m.opacity : 1,\n fillOpacity: m.fillOpacity !== 'undefined' ? m.fillOpacity : 0.5,\n colour: m.colour ? m.colour : 'blue',\n fill: m.fill,\n fading: iFade,\n strokeWidth: strokeWidth,\n bandUpper: m.bandUpper,\n bandLower: m.bandLower,\n bandFill: m.bandFill,\n bandOpacity: m.bandOpacity,\n bandStroke: m.bandStroke,\n bandStrokeWidth: m.bandStrokeWidth,\n bandStrokeOpacity: m.bandStrokeOpacity,\n points: m.points,\n errorBarUpper: m.errorBarUpper,\n errorBarLower: m.errorBarLower,\n taxon: m.taxon ? m.taxon : null,\n periodMin: m.periodMin,\n periodMax: m.periodMax\n }\n })\n\n const grey = d3.scaleLinear()\n .range(['#808080', '#E0E0E0'])\n .domain([1, iFading])\n\n metricsPlus.forEach(m => {\n if (m.fading) {\n m.colour = grey(m.fading)\n m.fill = grey(m.fading)\n }\n })\n }\n\n/** @function setChartOpts\n * @param {Object} opts - text options.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {number} opts.minPeriod Indicates the earliest period to use on the y axis.\n * @param {number} opts.maxPeriod Indicates the latest period to use on the y axis.\n //* @param {string} opts.yAxisOpts - Specifies options for scaling and displaying left axis.\n * @param {string} opts.metricExpression - Indicates how the metric is expressed can be '' to leave as is, or 'proportion' to express as a proportion of\n * the total of the metric or 'normalized' to normalize the values. (Default - ''.)\n * @param {string} opts.composition - Indicates how to display multiple metrics.\n * @param {string} opts.chartStyle - The type of the graphic 'bar' for a barchart and 'line' for a line graph.\n * @param {number} opts.spreadOverlap - a number between 0 and 1 that indicates how much overlap is permitted on graphics for different\n * metrics on a chart of composition type 'spread'.\n * @param {string} opts.periodType - Indicates the type of period data to be specified. Can be 'year', 'month' or 'week'.\n * @param {boolean} opts.lineInterpolator - Set to the name of a d3.line.curve interpolator to curve lines (see main interface for details).\n * @param {string|number} opts.missingValues - A value which indicates how gaps in temporal data are treated (see main interface for details).\n * @param {Array.} opts.metrics - Specifies an array of metrics objects (see main interface for details).\n * @param {Array.} opts.data - Specifies an array of data objects (see main interface for details).\n * @param {Array.} opts.dataPoints - Specifies an array of data objects (see main interface for details).\n * @param {Array.} opts.verticals - Specifies an array of data objects (see main interface for details).\n * @param {Array.} opts.trendLines - Specifies an array of data objects (see main interface for details).\n \n * @returns {Promise} promise that resolves when all transitions complete.\n * @description This function is exposed as a method on the API returned from the temporal function.\n * Set's the value of the chart data, title, subtitle and/or footer. If an element is missing from the \n * options object, it's value is not changed.\n */\n function setChartOpts(opts){\n\n let remakeChart = false\n\n if ('title' in opts) {\n title = opts.title\n }\n if ('subtitle' in opts) {\n subtitle = opts.subtitle\n }\n if ('footer' in opts) {\n footer = opts.footer\n }\n if ('titleFontSize' in opts) {\n titleFontSize = opts.titleFontSize\n }\n if ('subtitleFontSize' in opts) {\n subtitleFontSize = opts.subtitleFontSize\n }\n if ('footerFontSize' in opts) {\n footerFontSize = opts.footerFontSize\n }\n if ('titleAlign' in opts) {\n titleAlign = opts.titleAlign\n }\n if ('subtitleAlign' in opts) {\n subtitleAlign = opts.subtitleAlign\n }\n if ('footerAlign' in opts) {\n footerAlign = opts.footerAlign\n }\n if ('periodType' in opts) {\n periodType = opts.periodType\n remakeChart = true\n }\n if ('minPeriod' in opts) {\n minPeriod = opts.minPeriod\n remakeChart = true\n }\n if ('maxPeriod' in opts) {\n maxPeriod = opts.maxPeriod\n remakeChart = true\n }\n if ('monthScaleRange' in opts) {\n monthScaleRange = opts.monthScaleRange\n remakeChart = true\n }\n if ('minY' in opts) {\n minY = opts.minY\n remakeChart = true\n }\n if ('maxY' in opts) {\n maxY = opts.maxY\n remakeChart = true\n }\n if ('metrics' in opts) {\n metrics = opts.metrics\n remakeChart = true\n }\n if ('data' in opts) {\n data = opts.data\n remakeChart = true\n }\n if ('composition' in opts) {\n composition = opts.composition\n remakeChart = true\n }\n if ('spreadOverlap' in opts) {\n spreadOverlap = opts.spreadOverlap\n remakeChart = true\n }\n if ('dataPoints' in opts) {\n dataPoints = opts.dataPoints\n remakeChart = true\n }\n if ('verticals' in opts) {\n verticals = opts.verticals\n remakeChart = true\n }\n if ('dataTrendLines' in opts) {\n dataTrendLines = opts.dataTrendLines\n remakeChart = true\n }\n if ('metricExpression' in opts) {\n metricExpression = opts.metricExpression\n remakeChart = true\n }\n if ('lineInterpolator' in opts) {\n lineInterpolator = opts.lineInterpolator\n remakeChart = true\n }\n if ('missingValues' in opts) {\n missingValues = opts.missingValues\n remakeChart = true\n }\n if ('chartStyle' in opts) {\n chartStyle = opts.chartStyle\n remakeChart = true\n }\n \n if ('taxa' in opts) {\n taxa = opts.taxa\n highlightItem(null, false, svgChart)\n remakeChart = true\n }\n\n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n\n let pRet\n if (remakeChart === true) {\n preProcessMetrics()\n pRet = makeChart()\n gen.positionMainElements(svg, expand)\n } else {\n pRet = Promise.resolve()\n }\n return pRet\n }\n\n/** @function setTaxon\n * @param {string} opts.taxon - The taxon to display.\n * @returns {Promise} promise that resolves when all transitions complete.\n * @description This function is exposed as a method on the API returned from the temporal function.\n * For single species charts, this allows you to change the taxon displayed.\n */\n function setTaxon(taxon){\n let pRet\n if (taxa.length !== 1) {\n console.log(\"You can only use the setTaxon method when your chart displays a single taxon.\")\n pRet = Promise.resolve()\n } else {\n taxa = [taxon]\n highlightItem(null, false, svgChart)\n pRet = makeChart()\n }\n return pRet\n }\n\n/** @function getChartWidth\n * @description This function is exposed as a method on the API returned from the temporal function.\n * Return the full width of the chart svg.\n */\n function getChartWidth(){\n return svg.attr(\"width\") ? svg.attr(\"width\") : svg.attr(\"viewBox\").split(' ')[2]\n }\n\n/** @function getChartHeight\n * @description This function is exposed as a method on the API returned from the temporal function.\n * Return the full height of the chart svg.\n */\n function getChartHeight(){\n return svg.attr(\"height\") ? svg.attr(\"height\") : svg.attr(\"viewBox\").split(' ')[3]\n }\n\n/** @function saveImage\n * @param {boolean} asSvg - If true, file is generated as SVG, otherwise PNG.\n * @param {string} filename - Name of the file (without extension) to generate and download.\n * If 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 promise's 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 temporal function.\n * Download the chart as an image file.\n */\n function saveImage(asSvg, filename){\n return gen.saveChartImage(svg, expand, asSvg, filename) \n }\n\n\n /**\n * @typedef {Object} api\n * @property {module:temporal~getChartWidth} getChartWidth - Gets and returns the current width of the chart.\n * @property {module:temporal~getChartHeight} getChartHeight - Gets and returns the current height of the chart. \n * @property {module:temporal~setChartOpts} setChartOpts - Sets various options for the chart. \n * @property {module:temporal~setChartOpts} setTaxon - Changes the displayed taxon for single taxon charts. \n * @property {module:temporal~saveImage} saveImage - Generates and downloads and image file for the SVG. \n */\n return {\n getChartHeight: getChartHeight,\n getChartWidth: getChartWidth,\n setChartOpts: setChartOpts,\n setTaxon: setTaxon,\n saveImage: saveImage\n }\n\n}","/** @module trend */\n\nimport * as d3 from 'd3'\nimport * as gen from './general'\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. (Default - 'body'.)\n * @param {string} opts.elid - The id for the dom object created. (Default - 'trend-chart'.)\n * @param {number} opts.width - The width of each sub-chart area in pixels. (Default - 300.)\n * @param {number} opts.height - The height of the each sub-chart area in pixels. (Default - 200.)\n * @param {Object} opts.margin - An object indicating the margins to add around each sub-chart area.\n * @param {number} opts.margin.left - Left margin in pixels. (Default - 40.)\n * @param {number} opts.margin.right - Right margin in pixels. (Default - 40.)\n * @param {number} opts.margin.top - Top margin in pixels. (Default - 20.)\n * @param {number} opts.margin.bottom - Bottom margin in pixels. (Default - 20.)\n * @param {number} opts.perRow - The number of sub-charts per row. (Default - 2.)\n * @param {boolean} opts.expand - Indicates whether or not the chart will expand to fill parent element and scale as that element resized. (Default - false.)\n * @param {string} opts.title - Title for the chart. (Default - ''.)\n * @param {string} opts.subtitle - Subtitle for the chart. (Default - ''.)\n * @param {string} opts.footer - Footer for the chart. (Default - ''.)\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title. (Default - 24.)\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle. (Default - 16.)\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer. (Default - 10.)\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {boolean} opts.showTaxonLabel - Whether or not to show taxon label above each sub-graph. (Default - true.)\n * @param {boolean} opts.showLegend - Whether or not to show an overall chart legend. (Default - true.)\n * @param {string} opts.taxonLabelFontSize - Font size (pixels) of taxon sub-chart label. (Default - 10.)\n * @param {boolean} opts.taxonLabelItalics - Whether or not to italicise taxon label.(Default - true.)\n * @param {string} opts.legendFontSize - Font size (pixels) of legend item text. (Default - 16.)\n * @param {string} opts.axisLeftLabel - Value for labelling left axis. (Default - ''.)\n * @param {string} opts.axisRightLabel - Value for labelling right axis. (Default - ''.)\n * @param {string} opts.axisLabelFontSize - Font size (pixels) for axist labels. (Default - 10.)\n * @param {string} opts.axisLeft - If set to 'on' line is drawn without ticks. \n * If set to 'counts' line and ticks drawn for counts scale. If set to 'proportions' line and ticks drawn for proportion scale (0-1). \n * If set to 'percentages' line and ticks drawn for percentage scale (1-100). Any other value results in no axis. (Default - 'percentages'.)\n * @param {string} opts.axisRight - If set to 'on' line is drawn without ticks. \n * If set to 'counts' line and ticks drawn for counts scale. If set to 'proportions' line and ticks drawn for proportion scale (0-1). \n * If set to 'percentages' line and ticks drawn for percentage scale (1-100). Any other value results in no axis. (Default - 'counts'.)\n * @param {string} opts.axisTop - If set to 'on' line is drawn otherwise not. (Default - ''.)\n * @param {string} opts.axisBottom - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis. (Default - 'tick'.)\n * @param {number} opts.duration - The duration of each transition phase in milliseconds. (Default - 1000.)\n * @param {string} opts.interactivity - Specifies how item highlighting occurs. Can be 'mousemove', 'mouseclick' or 'none'. (Default - 'none'.)\n * @param {Array.} opts.data - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • taxon - name of a taxon.\n *
  • year - a four digit number indicating a year.\n *
  • count - a count for the given year. \n *
\n * @param {Array.} opts.taxa - An array of taxa (names), indicating which taxa create charts for. \n * If empty, graphs for all taxa are created. (Default - [].)\n * @param {Array.} opts.group - An array of taxa (names), indicating which taxa comprise the whole group for which proportion stats are calculated. \n * If empty, all taxa are part of the group from which proportion data is calculated. (Default - [].)\n * @param {number} opts.minYear- Indicates the earliest year to use on the y axis. If left unset, the earliest year in the dataset is used. (Default - null.)\n * @param {number} opts.maxYear- Indicates the latest year to use on the y axis. If left unset, the latest year in the dataset is used. (Default - null.)\n * @param {string} opts.showCounts- Indicates whether or not to plot the actual number of records for each taxon and, if so, the style of chart to use.\n * Can be 'line' for a line graph or 'bar' for a bar chart. Any other value means that the metric will not be plotted. (Default - 'bar'.)\n * @param {string} opts.showProps- Indicates whether or not to plot the proportion of all records in the group accounted for by each taxon and, if so, the style of chart to use.\n * Can be 'line' for a line graph or 'bar' for a bar chart. Any other value means that the metric will not be plotted. (Default - 'line'.)\n * @param {Object} opts.styleCounts - An object specifying the style to use for the count graphic.\n * @param {string} opts.styleCounts.colour - Colour of bars or line (as determined by showCounts property). (Default - 'CornflowerBlue'.)\n * @param {number} opts.styleCounts.strokeWidth - If the showCounts property is set to 'line' then this property indicates the line width. (Default - not set.)\n * @param {number} opts.styleCounts.opacity - The opacity of the lines/bars in the chart. A number between 0 and 1. (Default - 1.)\n * @param {string} opts.styleCounts.legend - Text to use for the counts metric in the legend. (Default - ''.)\n * @param {Object} opts.styleProps - An object specifying the style to use for the proportions/percentage graphic.\n * @param {string} opts.styleProps.colour - Colour of bars or line (as determined by showProps property). (Default - 'black'.)\n * @param {number} opts.styleProps.strokeWidth - If the showProps property is set to 'line' then this property indicates the line width. (Default - 2.)\n * @param {number} opts.styleProps.opacity - The opacity of the lines/bars in the chart. A number between 0 and 1. (Default - 1.)\n * @param {string} opts.styleProps.legend - Text to use for the proportion/percentage metric in the legend. (Default - ''.)\n * @returns {module:trend~api} api - Returns an API for the chart.\n */\n\nexport function trend({\n // Default options in here\n selector = 'body',\n elid = 'trend-chart',\n width = 300,\n height = 200,\n margin = {left: 30, right: 30, top: 15, bottom: 15},\n perRow = 2,\n expand = false,\n title = '',\n subtitle = '',\n footer = '',\n titleFontSize = 24,\n subtitleFontSize = 16,\n footerFontSize = 10,\n legendFontSize = 16,\n showLegend = false,\n axisLeftLabel = '',\n axisRightLabel = '',\n axisLabelFontSize = 10,\n titleAlign = 'left',\n subtitleAlign = 'left',\n footerAlign = 'left',\n showTaxonLabel = true,\n taxonLabelFontSize = 10,\n taxonLabelItalics = false,\n axisLeft = 'counts',\n axisBottom = 'tick',\n axisRight = 'percentages',\n axisTop = '',\n showCounts = 'bar', \n showProps = 'line', \n styleCounts = {colour: 'CornflowerBlue', opacity: 1},\n styleProps = {colour: 'black', opacity: 1, strokeWidth: 2},\n duration = 1000,\n interactivity = 'none',\n data = [],\n taxa = [],\n group = [],\n minYear = null,\n maxYear = null,\n} = {}) {\n\n // Store list of currently displayed taxa charts in case of taxa list\n // being updated.\n let currentTaxa = []\n\n // If store explicitly set min and max year so that changes in setChartOpts\n // can be dealt with properly. These can also be reset in setChartOpts.\n let minYearExplicit = minYear\n let maxYearExplicit = maxYear\n\n // Ensure style prop objects have the required properties.\n styleCounts.colour = styleCounts.colour ? styleCounts.colour : 'CornflowerBlue'\n styleCounts.opacity = styleCounts.opacity ? styleCounts.opacity : 1\n styleCounts.strokeWidth = styleCounts.strokeWidth ? styleCounts.strokeWidth : 2\n styleProps.colour = styleProps.colour ? styleProps.colour : 'black'\n styleProps.opacity = styleProps.opacity ? styleProps.opacity : 1\n styleProps.strokeWidth = styleProps.strokeWidth ? styleProps.strokeWidth : 2\n\n const mainDiv = d3.select(`${selector}`)\n .append('div')\n .attr('id', elid)\n .style('position', 'relative')\n .style('display', 'inline')\n\n const svg = mainDiv.append('svg')\n svg.on(\"click\", function() {\n if (interactivity === 'mouseclick') {\n highlightItem(null, false)\n }\n })\n const svgChart = svg.append('svg').attr('class', 'mainChart brc-chart-trend')\n makeChart()\n makeTexts()\n\n function makeTexts() {\n // Texts must come after chartbecause \n // the chart width is required\n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n gen.positionMainElements(svg, expand)\n }\n\n function makeChart () {\n\n // Set min and max year from data if not set\n if (!minYearExplicit) {\n minYear = Math.min(...data.map(d => d.year))\n } else {\n minYear = minYearExplicit\n }\n if (!maxYearExplicit) {\n maxYear = Math.max(...data.map(d => d.year))\n } else {\n maxYear = maxYearExplicit\n }\n\n // If taxa for graphs not set, set to all in dataset\n if (!taxa.length) {\n taxa = data.map(d => d.taxon).filter((v, i, a) => a.indexOf(v) === i)\n }\n\n // If group for proportion/percentage data not set, set to all in dataset\n if (!group.length) {\n group = data.map(d => d.taxon).filter((v, i, a) => a.indexOf(v) === i)\n }\n\n // Generate object with yearly totals\n const yearTotals = {}\n data\n .filter(d => group.indexOf(d.taxon) > -1 && d.year >= minYear && d.year <= maxYear)\n .forEach(d => {\n if (yearTotals[d.year]) {\n yearTotals[d.year] = yearTotals[d.year] + d.count\n } else {\n yearTotals[d.year] = d.count\n }\n })\n\n const subChartPad = 10\n\n // Delete any existing charts which are not included in the new taxa\n // list - unless there's only one in each\n if (currentTaxa.length === 1 && currentTaxa[0] === '') {\n // This is a dummy taxon to get empty graph displayed.\n // Can't select by id as this is empty string. Select\n // by class.\n svgChart.select('.brc-chart-trend').remove()\n } else if (!(taxa.length === 1 && currentTaxa.length === 1)) {\n currentTaxa.forEach(t => {\n if (taxa.indexOf(t) === -1) {\n svgChart.select( `#${gen.safeId(t)}`).remove()\n }\n })\n }\n // Make charts and update array of current taxa\n const svgsTaxa = taxa.map(t => makeTrend(t, yearTotals))\n currentTaxa = taxa\n\n let subChartWidth, subChartHeight\n if (svgsTaxa.length) {\n subChartWidth = Number(svgsTaxa[0].attr(\"width\"))\n subChartHeight = Number(svgsTaxa[0].attr(\"height\"))\n } else {\n // No taxa specified\n subChartWidth = Number(width)\n subChartHeight = Number(height)\n }\n\n const legendHeight = showLegend ? makeLegend(perRow * (subChartWidth + subChartPad)) + subChartPad : 0\n\n svgsTaxa.forEach((svgTaxon, i) => {\n \n const col = i%perRow\n const row = Math.floor(i/perRow)\n\n svgTaxon.attr(\"x\", col * (subChartWidth + subChartPad))\n svgTaxon.attr(\"y\", row * (subChartHeight + subChartPad) + legendHeight)\n })\n\n svgChart.attr(\"width\", perRow * (subChartWidth + subChartPad))\n svgChart.attr(\"height\", legendHeight + Math.ceil(svgsTaxa.length/perRow) * (subChartHeight + subChartPad))\n }\n\n function makeTrend (taxon, yearTotals) {\n\n // Pre-process data.\n // Filter to named taxon and to min and max year and sort in year order\n // Add max value to each.\n\n const dataFiltered = data\n .filter(d => d.taxon === taxon && d.year >= minYear && d.year <= maxYear)\n .sort((a, b) => (a.year > b.year) ? 1 : -1)\n\n // Set the maximum values for the y axis\n let yMaxProp = Math.max(...dataFiltered.map(d => d.count / yearTotals[d.year]))\n //yMaxProp = yMaxProp < 0.005 ? 0.005 : yMaxProp // Prevents tiny values\n yMaxProp = yMaxProp < 0.001 ? 0.001 : yMaxProp // Prevents tiny values\n let yMaxCount = Math.max(...dataFiltered.map(d => d.count))\n yMaxCount = yMaxCount < 5 ? 5 : yMaxCount // Prevents tiny values\n\n // Value scales\n let years = []\n for (let i = minYear; i <= maxYear; i++) {\n years.push(i)\n }\n const xScaleBar = d3.scaleBand().domain(years).range([0, width]).paddingInner(0.1)\n const xScaleLine = d3.scaleLinear().domain([minYear, maxYear]).range([0, width])\n const yScaleCount = d3.scaleLinear().domain([0, yMaxCount]).range([height, 0])\n const yScaleProps = d3.scaleLinear().domain([0, yMaxProp]).range([height, 0])\n\n // Top axis\n let tAxis\n if (axisTop === 'on') {\n tAxis = d3.axisTop()\n .scale(xScaleLine) // Actual scale doesn't matter, but needs one\n .tickValues([])\n .tickSizeOuter(0)\n }\n\n // Bottom axis\n let bAxis\n if (axisBottom === 'on' || axisBottom === 'tick') {\n bAxis = gen.xAxisYear(width, axisBottom === 'tick', minYear, maxYear, (showCounts === 'bar' || showProps === 'bar'))\n }\n\n const makeXaxis = (leftRight, axisOpt) => {\n let axis, format\n const d3axis = leftRight === 'left' ? d3.axisLeft() : d3.axisRight()\n switch(axisOpt) {\n case 'on':\n axis = d3axis.scale(yScaleCount).tickValues([]).tickSizeOuter(0)\n break\n case 'counts':\n axis = d3axis.scale(yScaleCount).ticks(5).tickFormat(d3.format(\"d\"))\n break\n case 'proportions':\n axis = d3axis.scale(yScaleProps).ticks(5)\n break\n case 'percentages':\n //format = yMaxProp < 0.01 ? d3.format(\".2%\") : d3.format(\".0%\")\n if (yMaxProp < 0.01) {\n format = d3.format(\".2%\")\n } else if (yMaxProp < 0.05) {\n format = d3.format(\".1%\")\n } else {\n format = d3.format(\".0%\")\n }\n axis = d3axis.scale(yScaleProps).ticks(5).tickFormat(format)\n break\n }\n return axis\n }\n const lAxis = makeXaxis('left', axisLeft)\n const rAxis = makeXaxis('right', axisRight)\n\n // Create or get the relevant chart svg\n let init, svgTrend, gTrend, gTrendRect, gTrendPath\n if (taxa.length === 1 && svgChart.selectAll('.brc-chart-trend').size() === 1) {\n svgTrend = svgChart.select('.brc-chart-trend')\n gTrend = svgTrend.select('.brc-chart-trend-g')\n gTrendPath = svgTrend.select('.brc-chart-trend-g-path')\n gTrendRect = svgTrend.select('.brc-chart-trend-g-rect')\n init = false\n } else if (svgChart.select(`#${gen.safeId(taxon)}`).size()) {\n svgTrend = svgChart.select(`#${gen.safeId(taxon)}`)\n gTrend = svgTrend.select('.brc-chart-trend-g')\n gTrendPath = svgTrend.select('.brc-chart-trend-g-path')\n gTrendRect = svgTrend.select('.brc-chart-trend-g-rect')\n init = false\n } else {\n svgTrend = svgChart.append('svg')\n .classed('brc-chart-trend', true)\n .attr('id', gen.safeId(taxon))\n .style('overflow', 'visible')\n gTrend = svgTrend.append('g')\n .classed('brc-chart-trend-g', true)\n // Add these in correct order so that lines are\n // always shown above bars\n gTrendRect = gTrend.append('g').classed('brc-chart-trend-g-rect', true)\n gTrendPath = gTrend.append('g').classed('brc-chart-trend-g-path', true)\n init = true\n }\n\n // Line path generators\n const lineCounts = d3.line()\n .curve(d3.curveMonotoneX)\n .x(d => xScaleLine(d.year))\n .y(d => yScaleCount(d.n))\n\n const lineProps = d3.line()\n .curve(d3.curveMonotoneX)\n .x(d => xScaleLine(d.year))\n .y(d => yScaleProps(d.n))\n\n const chartLines = []\n const dataDict = dataFiltered.reduce((a,d) => {\n a[d.year]=d.count\n return a\n }, {})\n if (showCounts === 'line') {\n chartLines.push({\n lineGen: lineCounts,\n colour: styleCounts.colour,\n opacity: styleCounts.opacity,\n strokeWidth: styleCounts.strokeWidth,\n type: 'counts',\n points: years.map(y => {\n return {\n year: y,\n n: dataDict[y] ? dataDict[y] : 0,\n }\n })\n })\n }\n if (showProps === 'line') {\n chartLines.push({\n lineGen: lineProps,\n colour: styleProps.colour,\n opacity: styleProps.opacity,\n strokeWidth: styleProps.strokeWidth,\n type: 'props',\n points: years.map(y => {\n return {\n year: y,\n n: dataDict[y] ? dataDict[y]/yearTotals[y] : 0,\n }\n })\n })\n }\n let chartBars = []\n if (showCounts === 'bar') {\n const bars = dataFiltered.map(d => {\n return {\n yScale: yScaleCount,\n colour: styleCounts.colour,\n opacity: styleCounts.opacity,\n type: 'counts',\n year: d.year,\n n: yScaleCount(d.count),\n }\n })\n chartBars = [...chartBars, ...bars]\n }\n if (showProps === 'bar') {\n const bars = dataFiltered.map(d => {\n return {\n yScale: yScaleProps,\n colour: styleProps.colour,\n opacity: styleProps.opacity,\n type: 'props',\n year: d.year,\n n: yScaleProps(d.count / yearTotals[d.year]),\n }\n })\n chartBars = [...chartBars, ...bars]\n }\n\n const t = svgTrend.transition()\n .duration(duration)\n\n gTrendRect.selectAll(\"rect\")\n .data(chartBars, d => `props-${d.year}`)\n .join(\n enter => enter.append(\"rect\")\n .attr(\"class\", d => `trend-type-${d.type}`)\n .attr('width', xScaleBar.bandwidth())\n .attr('height', 0)\n .attr('fill', d => d.colour)\n .attr('opacity', d => d.opacity)\n .attr('y', height)\n .attr('x', d => xScaleBar(d.year)),\n update => update,\n exit => exit\n .call(exit => exit.transition(t)\n .attr('height', 0)\n .attr('y', height)\n .remove())\n ).transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr('y', d => d.n)\n .attr('x', d => xScaleBar(d.year))\n .attr('width', xScaleBar.bandwidth())\n .attr('height', d => height - d.n)\n .attr(\"fill\", d => d.colour)\n \n gTrendPath.selectAll(\"path\")\n .data(chartLines, d => d.type)\n .join(\n enter => enter.append(\"path\")\n .attr(\"class\", d => `trend-type-${d.type}`)\n .attr(\"opacity\", d => d.opacity)\n .attr(\"fill\", \"none\")\n .attr(\"stroke\", d => d.colour)\n .attr(\"stroke-width\", d => d.strokeWidth)\n .attr(\"d\", d => {\n return d.lineGen(d.points.map(p => {\n return {\n n: 0,\n year: p.year\n }\n }))}),\n update => update,\n exit => exit\n .call(exit => exit.transition(t)\n .attr(\"d\", d => {\n return d.lineGen(d.points.map(p => {\n return {\n n: 0,\n year: p.year\n }\n }))\n })\n .remove())\n ).transition(t)\n // The selection returned by the join function is the merged\n // enter and update selections\n .attr(\"d\", d => d.lineGen(d.points))\n\n addEventHandlers(gTrend.selectAll(\"path\"), 'type')\n addEventHandlers(gTrend.selectAll(\"rect\"), 'type')\n \n if (init) {\n\n // Constants for positioning\n const axisLeftPadX = margin.left ? margin.left : 0\n const axisRightPadX = margin.right ? margin.right : 0\n const axisBottomPadY = margin.bottom ? margin.bottom : 0\n const axisTopPadY = margin.top ? margin.top : 0\n\n // Taxon title\n if (showTaxonLabel) {\n const taxonLabel = svgTrend\n .append('text')\n .classed('brc-chart-trend-label', true)\n .text(taxon)\n .style('font-size', taxonLabelFontSize)\n .style('font-style', taxonLabelItalics ? 'italic' : '')\n\n const labelHeight = taxonLabel.node().getBBox().height\n taxonLabel.attr(\"transform\", `translate(${axisLeftPadX}, ${labelHeight})`)\n }\n \n // Size SVG\n svgTrend\n .attr('width', width + axisLeftPadX + axisRightPadX)\n .attr('height', height + axisBottomPadY + axisTopPadY)\n\n // Position chart\n gTrend.attr(\"transform\", `translate(${axisLeftPadX},${axisTopPadY})`)\n \n // Create axes and position within SVG\n const leftYaxisTrans = `translate(${axisLeftPadX},${axisTopPadY})`\n const leftYaxisLabelTrans = `translate(${axisLabelFontSize},${axisTopPadY + height/2}) rotate(270)`\n const rightYaxisTrans = `translate(${axisLeftPadX + width}, ${axisTopPadY})`\n const rightYaxisLabelTrans = `translate(${axisLeftPadX + width + axisRightPadX - axisLabelFontSize}, ${axisTopPadY + height/2}) rotate(90)`\n const topXaxisTrans = `translate(${axisLeftPadX},${axisTopPadY})`\n const bottomXaxisTrans = `translate(${axisLeftPadX},${axisTopPadY + height})`\n\n // Create axes and position within SVG\n if (lAxis) {\n const gLaxis = svgTrend.append(\"g\")\n .attr(\"class\", \"l-axis\")\n .classed('trend-type-counts', axisLeft === 'counts')\n .classed('trend-type-props', axisLeft !== 'counts')\n gLaxis.attr(\"transform\", leftYaxisTrans)\n }\n if (bAxis) {\n const gBaxis = svgTrend.append(\"g\")\n .attr(\"class\", \"x axis b-axis\")\n .call(bAxis)\n gBaxis.attr(\"transform\", bottomXaxisTrans)\n }\n if (tAxis) {\n const gTaxis = svgTrend.append(\"g\")\n .call(tAxis)\n gTaxis.attr(\"transform\", topXaxisTrans)\n }\n if (rAxis) {\n const gRaxis = svgTrend.append(\"g\")\n //.call(rAxis)\n .attr(\"class\", \"r-axis\")\n .classed('trend-type-counts', axisRight === 'counts')\n .classed('trend-type-props', axisRight !== 'counts')\n gRaxis.attr(\"transform\", rightYaxisTrans)\n }\n\n const tYaxisLeftLabel = svgTrend.append(\"text\")\n .classed('trend-type-counts', axisLeft === 'counts')\n .classed('trend-type-props', axisLeft !== 'counts')\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisLeftLabel) \n tYaxisLeftLabel.attr(\"transform\", leftYaxisLabelTrans)\n\n const tYaxisRightLabel = svgTrend.append(\"text\")\n .classed('trend-type-counts', axisRight === 'counts')\n .classed('trend-type-props', axisRight !== 'counts')\n .style(\"text-anchor\", \"middle\")\n .style('font-size', axisLabelFontSize)\n .text(axisRightLabel) \n tYaxisRightLabel.attr(\"transform\", rightYaxisLabelTrans)\n\n } else if (taxa.length === 1) {\n // Update taxon label\n if (showTaxonLabel) {\n svgTrend.select('.brc-chart-trend-label').text(taxon)\n }\n }\n\n if (svgTrend.selectAll(\".b-axis\").size()){\n svgTrend.select(\".b-axis\")\n .transition()\n .duration(duration)\n .call(bAxis)\n }\n\n if (svgTrend.selectAll(\".l-axis\").size()){\n svgTrend.select(\".l-axis\")\n .transition()\n .duration(duration)\n .call(lAxis)\n }\n\n if (svgTrend.selectAll(\".r-axis\").size()){\n svgTrend.select(\".r-axis\")\n .transition()\n .duration(duration)\n .call(rAxis)\n }\n \n return svgTrend\n }\n\n function makeLegend (legendWidth) {\n \n const swatchSize = 20\n const swatchFact = 1.3\n\n const items = []\n if (showCounts === 'line' || showCounts === 'bar') {\n items.push({\n colour: styleCounts.colour,\n opacity: styleCounts.opacity,\n graphic: showCounts,\n text: styleCounts.legend,\n type: 'counts'\n })\n }\n if (showProps === 'line' || showProps === 'bar') {\n items.push({\n colour: styleProps.colour,\n opacity: styleProps.opacity,\n graphic: showProps,\n text: styleProps.legend,\n type: 'props'\n })\n }\n\n // Loop through all the legend elements and work out their\n // positions based on swatch size, item label text size and\n // legend width.\n let rows = 0\n let lineWidth = -swatchSize\n items.forEach(i => {\n const tmpText = svgChart.append('text')\n .text(i.text)\n .style('font-size', legendFontSize)\n\n const widthText = tmpText.node().getBBox().width\n tmpText.remove()\n\n if (lineWidth + swatchSize + swatchSize * swatchFact + widthText > legendWidth) {\n ++rows\n lineWidth = -swatchSize\n }\n i.x = lineWidth + swatchSize\n i.y = rows * swatchSize * swatchFact\n\n lineWidth = lineWidth + swatchSize + swatchSize * swatchFact + widthText\n })\n\n // Legend does not need to be recreated if it already exists\n if (!svgChart.selectAll('.brc-legend-item').size()) {\n \n const ls = svgChart.selectAll('.brc-legend-item-rect')\n .data(items, i => gen.safeId(i.label))\n .join(enter => {\n const rect = enter.append(\"rect\")\n //.attr(\"class\", i=> `brc-legend-item brc-legend-item-rect brc-legend-item-${gen.safeId(i.label)}`)\n .attr('class', i => `brc-legend-item trend-type-${i.type}`)\n .attr('width', swatchSize)\n .attr('height', i => i.graphic === 'bar' ? swatchSize/2 : 2)\n return rect\n })\n .attr('x', i => i.x)\n .attr('y', i => i.graphic === 'bar' ? i.y + legendFontSize - swatchSize/2 : i.y + legendFontSize - 2)\n .attr('fill', i => i.colour)\n .attr('opacity', i => i.opacity)\n\n const lt = svgChart.selectAll('.brc-legend-item-text')\n .data(items, i => gen.safeId(i.label))\n .join(enter => {\n const text = enter.append(\"text\")\n //.attr(\"class\", i=> `brc-legend-item brc-legend-item-text brc-legend-item-${gen.safeId(i.label)}`)\n .attr('class', i => `brc-legend-item trend-type-${i.type}`)\n .text(i => i.text)\n .style('font-size', legendFontSize)\n return text\n })\n .attr('x', i => i.x + swatchSize * swatchFact)\n .attr('y', i => i.y + legendFontSize * 1)\n\n addEventHandlers(ls, 'type')\n addEventHandlers(lt, 'type')\n }\n return swatchSize * swatchFact * (rows + 1)\n }\n\n function highlightItem(id, highlight) {\n\n svgChart.selectAll('.trend-type-counts,.trend-type-props')\n .classed('lowlight', false)\n\n if (highlight) {\n svgChart.selectAll('.trend-type-counts,.trend-type-props')\n .classed('lowlight', true)\n svgChart.selectAll(`.trend-type-${id}`)\n .classed('lowlight', false)\n }\n }\n\n function addEventHandlers(sel, prop) {\n sel\n .on(\"mouseover\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d[prop], true)\n }\n })\n .on(\"mouseout\", function(d) {\n if (interactivity === 'mousemove') {\n highlightItem(d[prop], false)\n }\n })\n .on(\"click\", function(d) {\n if (interactivity === 'mouseclick') {\n highlightItem(d[prop], true)\n d3.event.stopPropagation()\n }\n })\n }\n\n/** @function setChartOpts\n * @param {Object} opts - text options.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {string} opts.taxa - A list of taxa to create charts for.\n * @param {string} opts.group - A list of taxa to used to calculate group totals for percentage of group records.\n * @param {Array.} opts.data - Specifies an array of data objects (see main interface for details).\n * @description This function is exposed as a method on the API returned from the trend function.\n * Set's the value of the chart data, title, subtitle and/or footer. If an element is missing from the \n * options object, it's value is not changed.\n */\n function setChartOpts(opts){\n\n if ('title' in opts) {\n title = opts.title\n }\n if ('subtitle' in opts) {\n subtitle = opts.subtitle\n }\n if ('footer' in opts) {\n footer = opts.footer\n }\n if ('titleFontSize' in opts) {\n titleFontSize = opts.titleFontSize\n }\n if ('subtitleFontSize' in opts) {\n subtitleFontSize = opts.subtitleFontSize\n }\n if ('footerFontSize' in opts) {\n footerFontSize = opts.footerFontSize\n }\n if ('titleAlign' in opts) {\n titleAlign = opts.titleAlign\n }\n if ('subtitleAlign' in opts) {\n subtitleAlign = opts.subtitleAlign\n }\n if ('footerAlign' in opts) {\n footerAlign = opts.footerAlign\n }\n if ('footerAlign' in opts) {\n footerAlign = opts.footerAlign\n }\n \n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n\n let remakeChart = false\n let remakeTexts = false\n\n if ('minYear' in opts) {\n minYearExplicit = opts.minYear\n remakeChart = true\n }\n if ('maxYear' in opts) {\n maxYearExplicit = opts.maxYear\n remakeChart = true\n }\n if ('data' in opts) {\n data = opts.data\n remakeChart = true\n }\n if ('taxa' in opts) {\n taxa = opts.taxa\n remakeChart = true\n remakeTexts = true\n }\n if ('group' in opts) {\n group = opts.group\n remakeChart = true\n }\n\n if (remakeChart) {\n highlightItem(null, false)\n makeChart()\n }\n if (remakeTexts) makeTexts()\n gen.positionMainElements(svg, expand)\n }\n\n/** @function setTaxon\n * @param {string} opts.taxon - The taxon to display.\n * @description This function is exposed as a method on the API returned from the trend function.\n * For single species charts, this allows you to change the taxon displayed.\n */\n function setTaxon(taxon){\n if (taxa.length !== 1) {\n console.log(\"You can only use the setTaxon method when your chart displays a single taxon.\")\n } else {\n taxa = [taxon]\n highlightItem(null, false)\n makeChart()\n }\n }\n\n/** @function getChartWidth\n * @description This function is exposed as a method on the API returned from the trend function.\n * Return the full width of the chart svg.\n */\n function getChartWidth(){\n return svg.attr(\"width\") ? svg.attr(\"width\") : svg.attr(\"viewBox\").split(' ')[2]\n }\n\n/** @function getChartHeight\n * @description This function is exposed as a method on the API returned from the trend function.\n * Return the full height of the chart svg.\n */\n function getChartHeight(){\n return svg.attr(\"height\") ? svg.attr(\"height\") : svg.attr(\"viewBox\").split(' ')[3]\n }\n\n/** @function saveImage\n * @param {boolean} asSvg - If true, file is generated as SVG, otherwise PNG.\n * @param {string} filename - Name of the file (without extension) to generate and download.\n * If 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 promise's 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 trend function.\n * Download the chart as an image file.\n */\n function saveImage(asSvg, filename){\n return gen.saveChartImage(svg, expand, asSvg, filename) \n }\n\n\n /**\n * @typedef {Object} api\n * @property {module:trend~getChartWidth} getChartWidth - Gets and returns the current width of the chart.\n * @property {module:trend~getChartHeight} getChartHeight - Gets and returns the current height of the chart. \n * @property {module:trend~setChartOpts} setChartOpts - Sets text options for the chart. \n * @property {module:trend~setTaxon} setTaxon - Changes the displayed taxon for single taxon charts. \n * @property {module:trend~saveImage} saveImage - Generates and downloads and image file for the SVG. \n */\n return {\n getChartHeight: getChartHeight,\n getChartWidth: getChartWidth,\n setChartOpts: setChartOpts,\n setTaxon: setTaxon,\n saveImage: saveImage\n }\n\n}","/** @module yearly */\n\nimport * as d3 from 'd3'\nimport * as gen from '../general'\nimport { makeYearly } from './makeYearly'\nimport { makeLegend } from './legend'\nimport { highlightItem } from './highlightitem'\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. (Default - 'body'.)\n * @param {string} opts.elid - The id for the dom object created. (Default - 'yearly-chart'.)\n * @param {number} opts.width - The width of each sub-chart area in pixels. (Default - 300.)\n * @param {number} opts.height - The height of the each sub-chart area in pixels. (Default - 200.)\n * @param {Object} opts.margin - An object indicating the margins to add around each sub-chart area.\n * @param {number} opts.margin.left - Left margin in pixels. (Default - 40.)\n * @param {number} opts.margin.right - Right margin in pixels. (Default - 40.)\n * @param {number} opts.margin.top - Top margin in pixels. (Default - 20.)\n * @param {number} opts.margin.bottom - Bottom margin in pixels. (Default - 20.)\n * @param {number} opts.perRow - The number of sub-charts per row. (Default - 2.)\n * @param {boolean} opts.expand - Indicates whether or not the chart will expand to fill parent element and scale as that element resized. (Default - false.)\n * @param {string} opts.title - Title for the chart. (Default - ''.)\n * @param {string} opts.subtitle - Subtitle for the chart. (Default - ''.)\n * @param {string} opts.footer - Footer for the chart. (Default - ''.)\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title. (Default - 24.)\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle. (Default - 16.)\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer. (Default - 10.)\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'. (Default - 'left'.)\n * @param {boolean} opts.showTaxonLabel - Whether or not to show taxon label above each sub-graph. (Default - true.)\n * @param {boolean} opts.showLegend - Whether or not to show an overall chart legend. (Default - true.)\n * @param {string} opts.taxonLabelFontSize - Font size (pixels) of taxon sub-chart label. (Default - 10.)\n * @param {boolean} opts.taxonLabelItalics - Whether or not to italicise taxon label.(Default - true.)\n * @param {string} opts.legendFontSize - Font size (pixels) of legend item text. (Default - 16.)\n * @param {string} opts.axisLeftLabel - Value for labelling left axis. (Default - ''.)\n * @param {string} opts.axisRightLabel - Value for labelling right axis. (Default - ''.)\n * @param {string} opts.axisLabelFontSize - Font size (pixels) for axist labels. (Default - 10.)\n * @param {string} opts.axisLeft - If set to 'on' line is drawn without ticks. \n * If set to 'tick' line and ticks drawn. Any other value results in no axis. (Default - 'count'.)\n * @param {string} opts.axisRight - If set to 'on' line is drawn without ticks. \n * If set to 'tick' line and ticks drawn. Any other value results in no axis. (Default - ''.)\n * @param {string} opts.axisTop - If set to 'on' line is drawn otherwise not. (Default - ''.)\n * @param {string} opts.axisBottom - If set to 'on' line is drawn without ticks. If set to 'tick' line and ticks drawn. Any other value results in no axis. (Default - 'tick'.)\n * @param {string} opts.yAxisOpts - Specifies options for scaling and displaying left axis.\n * @param {string} opts.yAxisOpts.numFormat - Indicates format for displaying numeric values (uses d3 format values - https://github.com/d3/d3-format). (Default is 'd'.)\n * @param {number} opts.yAxisOpts.minMax - Indicates a minumum value for the maximum value. Set to null for no minimum value. (Default is 5.)\n * @param {number} opts.yAxisOpts.fixedMin - Sets a fixed minimum. Set to null for no fixed minimum. (Default is 0.)\n * @param {number} opts.yAxisOpts.padding - Sets padding to add to the y axis limits as a proportion of data range. (Default is 0.)\n * @param {number} opts.headPad - A left hand offset, in pixels, for title, subtitle, legend and footer. (Default 0.)\n * @param {number} opts.duration - The duration of each transition phase in milliseconds. (Default - 1000.)\n * @param {string} opts.showCounts - The type of the graphic 'bar' for a barchart and 'line' for a line graph. (Default - 'bar'.)\n * @param {string} opts.interactivity - Specifies how item highlighting occurs. Can be 'mousemove', 'mouseclick' or 'none'. (Default - 'none'.)\n * @param {Array.} opts.metrics - An array of objects, each describing a numeric property in the input\n * data for which graphics should be generated on the chart.\n * Each of the objects in the data array can be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • prop - the name of the numeric property in the data (metric properties - 'c1' or 'c2' in the example below).\n *
  • label - a label for this metric. (Optional - the default label will be the property name.)\n *
  • colour - optional colour to give the graphic for this metric. Any accepted way of \n * specifying web colours can be used. Use the special term 'fading' to successively fading shades of grey.\n * (Optional - default is 'blue'.)\n *
  • opacity - optional opacity to give the graphic for this metric. \n * (Optional - default is 0.5.)\n *
  • linewidth - optional width of line for line for this metric if displayed as a line graph. \n * (Optional - default is 1.)\n *
  • bandUpper - optional name of a numeric property in the data which indicates the upper value\n * of a confidence band. Can only be used where showCounts is 'line'. \n *
  • bandLower - optional name of a numeric property in the data which indicates the lower value\n * of a confidence band. Can only be used where showCounts is 'line'. \n *
  • bandFill - optional colour to use for a confidence band. Any accepted way of \n * specifying web colours can be used. \n * (Optional - default is 'silver'.)\n *
  • bandStroke - optional colour to use for the uppder and lower boundaries of a confidence band. Any accepted way of \n * specifying web colours can be used. \n * (Optional - default is 'grey'.)\n *
  • bandOpacity - optional opacity to give the confidence band for this metric. \n * (Optional - default is 0.5.)\n *
  • bandStrokeOpacity - optional opacity to give the boundaries of the confidence band for this metric. \n * (Optional - default is 1.)\n *
  • bandStrokewidth - optional width of line for bounary lines of the confidence band this metric if displayed as a line graph. \n * (Optional - default is 1.)\n *
  • points - optional name of a numeric property in the data which indicates where a point is to be displayed.\n *
  • errorBarUpper - optional name of a numeric property in the data which indicates the upper value\n * of an error bar. Used in conjunction with the errorBarLower property. \n*
  • errorBarLower - optional name of a numeric property in the data which indicates the lower value\n * of an error bar. Used in conjunction with the errorBarUpper property. \n *
\n * @param {Array.} opts.data - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • taxon - name of a taxon.\n *
  • year - a four digit number indicating a year.\n *
  • c1 - a metric for a given year (can have any name). \n *
  • c2 - a metric for a given year (can have any name).\n * ... - there must be at least one metric column, but there can be any number of them.\n *
\n * @param {Array.} opts.dataPoints - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • taxon - name of a taxon.\n *
  • year - a four digit number indicating a year.\n *
  • y - y value for a given year. \n *
  • upper - a value for upper confidence band.\n *
  • lower - a value for lower confidence band.\n *
\n * @param {Array.} opts.dataTrendLines - Specifies an array of data objects.\n * Each of the objects in the data array must be sepecified with the properties shown below. (The order is not important.)\n *
    \n *
  • taxon - name of a taxon.\n *
  • gradient - a gradient for the line.\n *
  • inercept - the y axis intercept value (at x = 0) for the line. \n *
  • colour - the colour of the line the line. Any accepted way of specifying web colours can be used. (Default - red.)\n *
  • width - the width the line the line in pixels. (Default - 1.)\n *
  • opacity - the opacity of the line. (Default - 1.)\n *
\n * @param {Array.} opts.taxa - An array of taxa (names), indicating which taxa create charts for. \n * If empty, graphs for all taxa are created. (Default - [].)\n\n * @param {number} opts.minYear Indicates the earliest year to use on the x axis. If left unset, the earliest year in the dataset is used. (Default - null.)\n * @param {number} opts.maxYear Indicates the latest year to use on the x axis. If left unset, the latest year in the dataset is used. (Default - null.)\n * @param {number} opts.minYearTrans If set, this indicates the lowest possible year. It is only useful if transitioning between datasets with different\n * year ranges - its purpose is to facilitate smooth transitions of lines and bands in these cases. (Default - null.)\n * @param {number} opts.maxYearTrans If set, this indicates the highest possible year. It is only useful if transitioning between datasets with different\n * year ranges - its purpose is to facilitate smooth transitions of lines and bands in these cases. (Default - null.)\n * @param {number} opts.minCount Indicates the lowest value to use on the y axis. If left unset, the lowest value in the dataset is used. (Default - null.)\n * @param {number} opts.maxCount Indicates the highest value to use on the y axis. If left unset, the highest value in the dataset is used. (Default - null.)\n * @param {number} opts.xPadPercent Padding to add either side of min and max year value - expressed as percentage of year range. Can only be used on line charts. (Default - 0.)\n * @param {number} opts.yPadPercent Padding to add either side of min and max y value - expressed as percentage of y range. Can only be used on line charts. (Default - 0.)\n * @param {string|number} opts.missingValues A value which indicates how gaps in yearly data are treated. Can either be the string value 'break' which\n * causes trend lines to break where no value, 'bridge' which causes gaps to be bridged with straight line or a numeric value. (Default - 0.)\n * @returns {module:yearly~api} api - Returns an API for the chart.\n */\n\nexport function yearly({\n // Default options in here\n selector = 'body',\n elid = 'yearly-chart',\n width = 300,\n height = 200,\n margin = {left: 30, right: 30, top: 15, bottom: 20},\n perRow = 2,\n expand = false,\n title = '',\n subtitle = '',\n footer = '',\n titleFontSize = 24,\n subtitleFontSize = 16,\n footerFontSize = 10,\n legendFontSize = 16,\n showLegend = false,\n axisLeftLabel = '',\n axisRightLabel = '',\n axisLabelFontSize = 10,\n titleAlign = 'left',\n subtitleAlign = 'left',\n footerAlign = 'left',\n showTaxonLabel = true,\n taxonLabelFontSize = 10,\n taxonLabelItalics = false,\n axisLeft = 'tick',\n yAxisOpts = {numFormat: 'd', minMax: 5, fixedMin: 0, padding: 0},\n axisBottom = 'tick',\n axisRight = '',\n axisTop = '',\n showCounts = 'bar', \n headPad = 0,\n duration = 1000,\n interactivity = 'none',\n data = [],\n dataPoints = [],\n dataTrendLines = [],\n taxa = [],\n metrics = [],\n minYear = null,\n maxYear = null,\n minYearTrans = null,\n maxYearTrans = null,\n minCount = null,\n maxCount = null,\n xPadPercent = 0,\n yPadPercent = 0,\n missingValues = 0\n} = {}) {\n\n // xPadPercent and yPadPercent can not be used with charts of bar type.\n if (showCounts === 'bar') {\n xPadPercent = 0\n yPadPercent = 0\n }\n\n let metricsPlus\n\n const mainDiv = d3.select(`${selector}`)\n .append('div')\n .attr('id', elid)\n .style('position', 'relative')\n .style('display', 'inline')\n\n const svg = mainDiv.append('svg')\n svg.on(\"click\", function() {\n if (interactivity === 'mouseclick') {\n highlightItem(null, false, svgChart)\n }\n })\n\n const svgChart = svg.append('svg').attr('class', 'mainChart brc-chart-yearly')\n \n preProcessMetrics()\n makeChart()\n // Texts must come after chartbecause \n // the chart width is required\n const textWidth = Number(svg.select('.mainChart').attr(\"width\") - headPad)\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n gen.positionMainElements(svg, expand, headPad)\n\n function makeChart () {\n\n // Set min and max year from data if not set\n if (!minYear) {\n minYear = Math.min(...data.map(d => d.year))\n }\n if (!maxYear) {\n maxYear = Math.max(...data.map(d => d.year))\n }\n\n // If taxa for graphs not set, set to all in dataset\n if (!taxa.length) {\n taxa = data.map(d => d.taxon).filter((v, i, a) => a.indexOf(v) === i)\n }\n\n const subChartPad = 10\n const pTrans = []\n\n const svgsTaxa = taxa.map(t => makeYearly(\n svgChart,\n t,\n taxa,\n data,\n dataPoints,\n dataTrendLines,\n minYear,\n maxYear,\n minYearTrans,\n maxYearTrans,\n minCount,\n maxCount,\n xPadPercent,\n yPadPercent,\n metricsPlus,\n width,\n height,\n axisTop,\n axisBottom,\n showCounts,\n axisLeft,\n yAxisOpts,\n axisRight,\n duration,\n interactivity,\n margin,\n showTaxonLabel,\n taxonLabelFontSize,\n taxonLabelItalics,\n axisLabelFontSize,\n axisLeftLabel,\n axisRightLabel,\n missingValues,\n pTrans\n ))\n\n const subChartWidth = Number(svgsTaxa[0].attr(\"width\"))\n const subChartHeight = Number(svgsTaxa[0].attr(\"height\"))\n\n const legendHeight = showLegend ? makeLegend(\n svgChart,\n metricsPlus,\n perRow * (subChartWidth + subChartPad) - headPad,\n legendFontSize,\n headPad,\n showCounts,\n interactivity\n ) + subChartPad : 0\n\n svgsTaxa.forEach((svgTaxon, i) => {\n \n const col = i%perRow\n const row = Math.floor(i/perRow)\n\n svgTaxon.attr(\"x\", col * (subChartWidth + subChartPad))\n svgTaxon.attr(\"y\", row * (subChartHeight + subChartPad) + legendHeight)\n })\n\n svgChart.attr(\"width\", perRow * (subChartWidth + subChartPad))\n svgChart.attr(\"height\", legendHeight + Math.ceil(svgsTaxa.length/perRow) * (subChartHeight + subChartPad))\n\n return Promise.allSettled(pTrans)\n }\n\n function preProcessMetrics () {\n // Look for 'fading' colour in taxa and colour appropriately \n // in fading shades of grey.\n \n let iFading = 0\n metricsPlus = metrics.map(m => {\n let iFade, strokeWidth\n if (m.colour === 'fading') {\n iFade = ++iFading\n strokeWidth = 1\n } else {\n strokeWidth = m.linewidth ? m.linewidth : 2\n }\n return {\n prop: m.prop,\n label: m.label ? m.label : m.prop,\n opacity: m.opacity !== 'undefined' ? m.opacity : 0.5,\n colour: m.colour ? m.colour : 'blue',\n fading: iFade,\n strokeWidth: strokeWidth,\n bandUpper: m.bandUpper,\n bandLower: m.bandLower,\n bandFill: m.bandFill,\n bandOpacity: m.bandOpacity,\n bandStroke: m.bandStroke,\n bandStrokeWidth: m.bandStrokeWidth,\n bandStrokeOpacity: m.bandStrokeOpacity,\n points: m.points,\n errorBarUpper: m.errorBarUpper,\n errorBarLower: m.errorBarLower\n }\n }).reverse()\n\n const grey = d3.scaleLinear()\n .range(['#808080', '#E0E0E0'])\n .domain([1, iFading])\n\n metricsPlus.forEach(m => {\n if (m.fading) {\n m.colour = grey(m.fading)\n }\n })\n }\n\n/** @function setChartOpts\n * @param {Object} opts - text options.\n * @param {string} opts.title - Title for the chart.\n * @param {string} opts.subtitle - Subtitle for the chart.\n * @param {string} opts.footer - Footer for the chart.\n * @param {string} opts.titleFontSize - Font size (pixels) of chart title.\n * @param {string} opts.subtitleFontSize - Font size (pixels) of chart subtitle.\n * @param {string} opts.footerFontSize - Font size (pixels) of chart footer.\n * @param {string} opts.titleAlign - Alignment of chart title: either 'left', 'right' or 'centre'.\n * @param {string} opts.subtitleAlign - Alignment of chart subtitle: either 'left', 'right' or 'centre'.\n * @param {string} opts.footerAlign - Alignment of chart footer: either 'left', 'right' or 'centre'.\n * @param {number} opts.minYear Indicates the earliest year to use on the y axis.\n * @param {number} opts.maxYear Indicates the latest year to use on the y axis.\n * @param {Array.} opts.metrics - Specifies an array of metrics objects (see main interface for details).\n * @param {Array.} opts.data - Specifies an array of data objects (see main interface for details).\n * @param {Array.} opts.dataPoints - Specifies an array of data objects (see main interface for details).\n * @returns {Promise} promise that resolves when all transitions complete.\n * @description This function is exposed as a method on the API returned from the yearly function.\n * Set's the value of the chart data, title, subtitle and/or footer. If an element is missing from the \n * options object, it's value is not changed.\n */\n function setChartOpts(opts){\n\n if ('title' in opts) {\n title = opts.title\n }\n if ('subtitle' in opts) {\n subtitle = opts.subtitle\n }\n if ('footer' in opts) {\n footer = opts.footer\n }\n if ('titleFontSize' in opts) {\n titleFontSize = opts.titleFontSize\n }\n if ('subtitleFontSize' in opts) {\n subtitleFontSize = opts.subtitleFontSize\n }\n if ('footerFontSize' in opts) {\n footerFontSize = opts.footerFontSize\n }\n if ('titleAlign' in opts) {\n titleAlign = opts.titleAlign\n }\n if ('subtitleAlign' in opts) {\n subtitleAlign = opts.subtitleAlign\n }\n if ('footerAlign' in opts) {\n footerAlign = opts.footerAlign\n }\n if ('minYear' in opts) {\n minYear = opts.minYear\n }\n if ('maxYear' in opts) {\n maxYear = opts.maxYear\n }\n if ('minCount' in opts) {\n minCount = opts.minCount\n }\n if ('maxCount' in opts) {\n maxCount = opts.maxCount\n }\n if ('metrics' in opts) {\n metrics = opts.metrics\n }\n if ('data' in opts) {\n data = opts.data\n }\n if ('dataPoints' in opts) {\n dataPoints = opts.dataPoints\n }\n if ('dataTrendLines' in opts) {\n dataTrendLines = opts.dataTrendLines\n }\n\n if ('taxa' in opts) {\n taxa = opts.taxa\n highlightItem(null, false, svgChart)\n }\n\n const textWidth = Number(svg.select('.mainChart').attr(\"width\"))\n gen.makeText (title, 'titleText', titleFontSize, titleAlign, textWidth, svg)\n gen.makeText (subtitle, 'subtitleText', subtitleFontSize, subtitleAlign, textWidth, svg)\n gen.makeText (footer, 'footerText', footerFontSize, footerAlign, textWidth, svg)\n\n let pRet\n if ('taxa' in opts || 'data' in opts || 'minYear' in opts || 'maxYear' in opts || 'metrics' in opts || 'minCount' in opts || 'maxCount' in opts) {\n preProcessMetrics()\n pRet = makeChart()\n gen.positionMainElements(svg, expand)\n } else {\n pRet = Promise.resolve()\n }\n return pRet\n }\n\n/** @function setTaxon\n * @param {string} opts.taxon - The taxon to display.\n * @returns {Promise} promise that resolves when all transitions complete.\n * @description This function is exposed as a method on the API returned from the yearly function.\n * For single species charts, this allows you to change the taxon displayed.\n */\n function setTaxon(taxon){\n let pRet\n if (taxa.length !== 1) {\n console.log(\"You can only use the setTaxon method when your chart displays a single taxon.\")\n pRet = Promise.resolve()\n } else {\n taxa = [taxon]\n highlightItem(null, false, svgChart)\n pRet = makeChart()\n }\n return pRet\n }\n\n/** @function getChartWidth\n * @description This function is exposed as a method on the API returned from the yearly function.\n * Return the full width of the chart svg.\n */\n function getChartWidth(){\n return svg.attr(\"width\") ? svg.attr(\"width\") : svg.attr(\"viewBox\").split(' ')[2]\n }\n\n/** @function getChartHeight\n * @description This function is exposed as a method on the API returned from the yearly function.\n * Return the full height of the chart svg.\n */\n function getChartHeight(){\n return svg.attr(\"height\") ? svg.attr(\"height\") : svg.attr(\"viewBox\").split(' ')[3]\n }\n\n/** @function saveImage\n * @param {boolean} asSvg - If true, file is generated as SVG, otherwise PNG.\n * @param {string} filename - Name of the file (without extension) to generate and download.\n * If 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 promise's 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 yearly function.\n * Download the chart as an image file.\n */\n function saveImage(asSvg, filename){\n return gen.saveChartImage(svg, expand, asSvg, filename) \n }\n\n\n /**\n * @typedef {Object} api\n * @property {module:yearly~getChartWidth} getChartWidth - Gets and returns the current width of the chart.\n * @property {module:yearly~getChartHeight} getChartHeight - Gets and returns the current height of the chart. \n * @property {module:yearly~setChartOpts} setChartOpts - Sets various options for the chart. \n * @property {module:yearly~setChartOpts} setTaxon - Changes the displayed taxon for single taxon charts. \n * @property {module:yearly~saveImage} saveImage - Generates and downloads and image file for the SVG. \n */\n return {\n getChartHeight: getChartHeight,\n getChartWidth: getChartWidth,\n setChartOpts: setChartOpts,\n setTaxon: setTaxon,\n saveImage: saveImage\n }\n\n}"],"names":["safeId","text","replace","cloneData","data","map","d","month2day","ysDomain","filterYsDomain","monthScaleRange","minMonth","maxMonth","filter","m","i","filterMonth2day","noAdjust","fMonth2day","getDayRange","filteredMonth2day","length","xAxisMonth","width","ticks","fontSize","font","ysRange","xScaleTime","d3","domain","range","xAxis","scale","svg","append","getMaxTextWidth","aText","Math","max","tmpText","style","textWidth","node","getBBox","remove","maxFullMonth","maxMedMonth","substr","maxMinMonth","tickSize","tickFormat","month","tickValues","tickSizeOuter","xAxisMonthNoText","filteredYsDomain","dayRange","xAxisMonthText","unshift","monthMid2day","push","monthNumber","xAxisYear","min","bars","xScale","years","year","toString","makeText","classText","textAlign","svgText","select","size","attr","lines","maxWidth","textSplit","split","line","workingText","trim","txt","wrapText","uText","selectAll","eText","enter","merge","exit","height","widths","nodes","n","positionMainElements","expand","headPad","svgTitle","svgSubtitle","svgChart","svgFooter","Number","saveChartImage","asSvg","filename","Promise","resolve","blob1","serialize","download","reject","domSvg","promise","y","image","Image","onerror","onload","rect","getBoundingClientRect","canvas","document","createElement","context","getContext","drawImage","toBlob","src","URL","createObjectURL","rasterize","then","blob2","dataUrl","file","link","href","body","appendChild","dispatchEvent","MouseEvent","bubbles","cancelable","view","window","removeChild","downloadLink","xmlns","cloneSvg","cloneNode","fontOut","setAttributeNS","string","XMLSerializer","serializeToString","Blob","type","transPromise","transition","pArray","p","end","temporalScale","chartStyle","periodType","minPeriod","maxPeriod","xPadding","scaleD3","scaleFn","bandwidthFn","periods","m2d","v","periodToDay","periodToWidth","paddingInner","bandwidth","addG","id","g","addEventHandlers","sel","isArc","interactivity","dataPrev","imageWidth","callback","on","highlightItem","name","stopPropagation","show","gen","imgSelected","classed","find","imageHeight","loadImage","img","this","makePie","dataPrevIn","sort","strokeWidth","radius","innerRadius","innerRadius2","duration","label","labelColour","labelFontSize","dataDeleted","dataInserted","dataRetained","fnSort","init","dataNew","prevNames","newNames","includes","a","b","dataDeleted2","nd","number","dataComb","arcsPrev","getArcs","arcsComb","data1","set","data2","arcs1","value","sortValues","arcs2","forEach","arcComb","prevArc","arcPrev","deleted","inserted","gPie","arcGenerator","outerRadius","arcGeneratorLables","arcGeneratorLables2","arcTween","arc","_this","trans","radiusx","innerRadiusx","iPrev","_current","iCurr","midRadius","t","uPie","ePie","colour","each","mPie","transDuration","attrTween","arcsNew","total1","reduce","c","total2","uPieLabels","ePieLabels","total","isNaN","l","round","centroid","uPieLabelsHighlight","ePieLabelsHighlight","makeLegend","legendWidth","legendSwatchSize","legendSwatchGap","legendTitle","legendTitle2","legendTitleFontSize","svgLegend","legendTitleHeight","textHeight","legendTitleGap","legendTitleHeight2","legendTitleGap2","uLegendSwatch","durationUpdate","durationExit","eLegendSwatch","delay","uLegendText","legendTextHeight","eLegendText","legendTitles","uLegendTitle","dataSet1Length","legendHeight","dummyText","prop","highlight","makePhen","taxon","taxa","metricsin","ytype","spread","axisTop","axisBottom","axisLeft","axisRight","monthLineWidth","bands","stacked","margin","showTaxonLabel","taxonLabelFontSize","taxonLabelItalics","axisLabelFontSize","axisLeftLabel","pTrans","monthFontSize","period","yMax","metrics","_toConsumableArray","reverse","dataFiltered","metricData","stackOffsets","Array","fill","maxProportion","points","pointsPlus","match","p1","closure","hasData","maxMetricHeight","topProp","spreadHeight","valMax0","valMax1","h1Prop","h2Prop","yScale","tAxis","xAxis1","xAxis2","rAxis","yAxis","sScale","svgPhen1","gPhen1","lineCurved","curve","x","lineNotCurved","agroups","egroups","mgroups","xgroups","flatPath","poly","flat","substring","getPath","lPath","lineFn","so1","so2","p2","join","update","call","barY","getBarY","getBarHeight","axisLeftPadX","left","axisRightPadX","right","axisBottomPadY","bottom","axisTopPadY","top","taxonLabel","labelHeight","leftYaxisTrans","rightYaxisTrans","topXaxisTrans","leftYaxisLabelTrans","gXaxis1","gXaxis2","preProcessMetrics","iFading","metricsPlus","iFade","fading","grey","legendFontSize","metricsReversed","rows","lineWidth","widthText","swatchSize","ls","lt","maxY","means","dMax","upper","mMax","mean","sd","minY","dMin","lower","mMin","makeChart","yMin","adjust","yearMin","yearMax","ylines","selector","elid","bAxis","lAxis","svgWidth","svgHeight","svgTrend","updateChart","gChart1","gChart2","yMinBuff","yMaxBuff","dataWork","yearMinBuff","yearMaxBuff","yearMinData","minYear","yearMaxData","maxYear","floor","linePath","vData","d3Line","vStroke","vStrokeWidth","uData","cStroke","cStrokeWidth","lData","pData","cFill","tMeans","bar","gChart","sdStroke","sdStrokeWidth","mRad","mFill","mStroke","mStrokeWidth","d3MeanSd","path","tYlines","stroke","d3Yline","makeUpdateChart","lClass","aData","yStart","gradient","intercept","yEnd","vOpacity","barStart","xMin","xMax","xlines","axisBottomLabel","styles","scaleHeight","svgDensity","xMinBuff","xMaxBuff","ds","slope","minX","maxX","custScale","bandwidths","dataMin","dataMax","densities","kernel","X","k","incr","abs","V","maxDensity","yScales","linePaths","s","getStyle","d3Density","allSettled","lineClass","strokeDasharray","labelPosition","padding","barHeightOnZero","xScaleBottom","labels","ye","d3Bars","makeYearly","dataPoints","dataTrendLines","minYearTrans","maxYearTrans","minCount","maxCount","xPadPercent","yPadPercent","showCounts","yAxisOpts","axisRightLabel","missingValues","dataPointsFiltered","dataTrendLinesFiltered","opacity","y1","y2","maxMetricCounts","bandUpper","maxCountA","yMaxCount","minMetricCounts","bandLower","minCountA","yMinCount","minMax","fixedMin","yPadding","xScaleBar","xScaleLine","svgYearly","gYearly","makeXaxis","leftRight","axisOpt","axis","d3axis","numFormat","lineCounts","chartLines","chartBars","chartBands","chartPoints","chartErrorBars","dataDict","isFinite","adjustForTrans","part","pathEnter","ddUpper","ddLower","upperLine","pointsLowerSet","pointsUpperSet","pointsLower","pointsUpper","pointsBand","pointsLowerEnter","pointsUpperEnter","bandFill","bandStroke","fillOpacity","undefined","bandOpacity","strokeOpacity","bandStrokeOpacity","bandStrokeWidth","bandPath","bandPathEnter","bandBorders","bandBordersEnter","errorBarUpper","errorBarLower","errorBars","chartTrendLineSup","x1","x2","minx","maxx","chartPointsSup","chartPointsSupErrorBars","iLine","rightYaxisLabelTrans","bottomXaxisTrans","pntsIn","pntsSplit","retSet","pnts","ret","makeTemporal","minPeriodTrans","maxPeriodTrans","minMaxY","lineInterpolator","verticals","metricExpression","composition","spreadOverlap","JSON","parse","stringify","denominator","dataFilteredMetric","errorBarUppers","bandUppers","maxValue","displacement","v1","v2","verticalsFiltered","inRange","periodMin","periodMax","missing","cumulativeTotals","extensionValues","maxMetricYs","maxYA","maxYscale","minMetricYs","minYA","minYscale","bAxis1","fn","fnAxis","overlap","maxmax","suLastMetric","suPenultimateMetric","suLast","suHeight","spreadOffset","iMetric","d3fn","spreadScale","svgTemporal","gTemporal","gVerticals","gBars","gLines","gPointsAndErrors","gSupTrendLines","gSupPointsAndErrors","dataFilteredAll","yminY","barHeight","displace","index","generateBars","gLinesAreas","gLinesBands","gLinesBandLines","gLinesLines","lineValues","iPart","d3LineGen","chartLineFills","pntsBase","generateLines","gErrors","gPoints","bErrorBars","bPoints","u","generatePointsAndErrors","generateSupTrendLines","generateSupPointsAndErrors","chartVerticalLines","start","chartVerticalBands","generateSupVerticals","legendItems","SEC_TO_RAD","HALF_PI","PI","D2R","R2D","FORTPI","TWO_PI","SPI","exports","ft","to_meter","ignoredChar","obj","key","testkey","keys","Object","lkey","toLowerCase","defData","paramName","paramVal","paramOutname","self","paramObj","params","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","indexOf","approx","whitespace","latin","keyword","endThings","digets","Parser","Error","level","place","root","stack","currentObject","state","mapit","isArray","thing","out","newObj","item","sExpr","shift","convert","prototype","readCharicter","char","test","neutral","quoted","afterquote","word","afterItem","pop","newObjects","output","d2r","input","wkt","lisp","projName","local","_typeof","PROJECTION","AXIS","axisOrder","ii","UNIT","DATUM","SPHEROID","geogcs","GEOGCS","toMeter","slice","sphere","ellps","TOWGS84","outName","inName","rename","cleanWKT","defs","that","arguments","def","charAt","parseProj","apply","EPSG","ESRI","IAU2000","console","log","WGS84","GOOGLE","globals","codeWords","codes","code","testObj","testDef","some","testWKT","auth","checkMercator","maybeProjStr","ext","checkProjStr","projStr","testProj","destination","source","property","eccent","sinphi","cosphi","con","sqrt","sign","phi","com","pow","tan","ts","dphi","eccnth","atan","sin","identity","pt","projs","es","e","cos","msfnz","forward","lon","lat","adjust_lon","tsfnz","inverse","exp","phi2z","names","projStore","add","len","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","String","fromCharCode","Uint8Array","buffer","mapNodes","r","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","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","iter","Y","Z","atan2","genau","checkParams","dest","point","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","ll","lim","applySubgridShift","pin","ct","val","tb","nadInterpolate","dif","inx","indx","frct","f00","cvs","f10","f11","f01","m11","m10","m00","m01","crs","denorm","xin","yin","zin","array","checkCoord","num","TypeError","transform","enforceAxis","toPoint","checkSanity","checkNotWGS","adjust_axis","datum_transform","transformer","from","to","coords","transformedArray","concat","splice","checkProj","oProj","proj4","fromProj","toProj","coord","single","A","I","O","mgrs","bbox","UTMtoLL","decode","toUpperCase","accuracy","utm","seasting","easting","snorthing","northing","zoneNumber","zoneLetter","setParm","get100kSetForZone","setColumn","setRow","column","row","parm","colOrigin","charCodeAt","rowOrigin","colInt","rowInt","rollover","encode","N","T","C","M","LongOriginRad","ZoneNumber","Lat","Long","LatRad","degToRad","LongRad","eccSquared","UTMEasting","UTMNorthing","getLetterDesignator","LLtoUTM","deg","radToDeg","rad","N1","T1","C1","R1","D","LongOrigin","mu","phi1Rad","e1","result","topRight","LetterDesignator","mgrsString","testChar","hunK","sb","east100k","curCol","eastingValue","rewindMarker","getEastingFromChar","north100k","curRow","northingValue","getNorthingFromChar","getMinNorthing","remainder","accuracyBonus","sepEastingString","sepNorthingString","sep","sepEasting","sepNorthing","Point","warn","fromMGRS","mgrsStr","toMGRS","C08","en","sphi","cphi","arg","pj_mlfn","pj_enfn","ml0","delta_lon","sin_phi","cos_phi","al","als","cs","tq","ml","acos","pj_inv_mlfn","tan_phi","f","temp","h","asin","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","W","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","el","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","bind","pn1","rp","pfact","omega","cg","sg","cw","sw","yt","ba","bm","bq","defaultDatum","Proj","common","nadgrid","DataView","nFields","detectLittleEndian","header","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","nzmg","mill","sinu","moll","eqdc","vandg","aeqd","ortho","qsc","robin","geocent","tpers","includedProjections","km100s","acc","km100","GridRef","invalidGridRef","gr","gb","epsg","ir","ci","wg","qOffsets","se","nw","ne","tOffsets","w","getCentroid","toProjection","suffix","grType","r100km","RegExp","rHectad","rQuandrant","rTetrad","rMonad","r6fig","r8fig","r10fig","prefix","precision","projection","checkGr","constants","pkg","subtitle","footer","titleFontSize","subtitleFontSize","footerFontSize","titleAlign","subtitleAlign","footerAlign","axisTaxaLabel","axisCountLabel","swapYaxes","mainDiv","iFadeTaxa","iFadeCounts","iFadingTaxa","iFadingCounts","colourCounts","colourTaxa","labelTaxa","labelCounts","styleTaxa","styleCounts","fadingTaxa","fadingCounts","greyTaxa","greyCounts","showTaxa","lineData","pointsTaxa","pointsCount","accumTaxa","accumCount","week","weekStats","Set","accum","yScaleCount","yScaleTaxa","yAxisLeft","yAxisRight","lineTaxa","lineCount","svgAccum","gAccum","yScaleRight","yScaleLeft","mlines","eLines","axisLabelClass","gXaxis","setChartOpts","opts","remakeChart","getChartWidth","getChartHeight","saveImage","perRow","showLegend","legendSpacing","axisTickFontSize","yAxisLabelToTop","legendBaseline","legendXoffset","legendYoffset","ranges","pSvgsTaxa","makeAltLat","all","svgsTaxa","subChartWidth","subChartHeight","svgTaxon","col","ceil","svgAltLat","gAltLat","metric","tickVals","backSquareWidth","backSquareHeight","backData","pLegend","mainTrans","distance","altitude","getRadius","bottomXaxisLabelTrans","spacing","items","legend","radiusTrans","maxRadius","xOffset","yOffset","textTrans","swatchTrans","highlightItemToggle","lowlighted","dataFromTetrads","tetrads","altlatTetrads","location","hostname","altlat","altlatSorted","tetrad","tetradsSorted","groups","time","tmi","tm","gDistance","gAltitude","altMean","group","timeEnd","pgroupss","totalTetrads","bd","setTaxon","overflow","zoom","interactivityLink","backgroundColour","taxa1colour","taxa2colour","taxonInfoFn","linkInfoFn","popupDiv","srcElement","tagName","unhighlightAllLinks","gLinks","gNodes","scaleExtent","simulation","nodesPrev","taxa1","taxon1","taxa2","taxon2","Map","assign","links","target","force","strength","restart","selectLink","linkHit","linkHitRemove","eventType","html","pageX","pageY","getColour","fx","fy","hLinks","drag","iAuto","autoColour","random","subject","pRet","displayLegend","chartPad","legendOrder","svgScale","rectData","im","svgPhen2","gPhen2","mrects","erects","labelPadY","axisPadX","axisPadY","metricsSorted","svgbbox","li","iScale","xAdj","yAdj","cls","colourData","chartDiv","svgPie","overrideHighlight","showProps","styleProps","currentTaxa","minYearExplicit","maxYearExplicit","makeTexts","yearTotals","makeTrend","yMaxProp","yScaleProps","gTrend","gTrendRect","gTrendPath","format","lineProps","lineGen","graphic","remakeTexts","linewidth"],"mappings":"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IAAI6qB,IAC3Brf,EAAM+c,KAAKpkB,YAAYnE,IAAI8qB,IAC3Btf,EAAM+c,KAAKpkB,YAAYnE,IAAI+qB,IAC3Bvf,EAAM+c,KAAKpkB,YAAYnE,IAAIgrB,IAC3Bxf,EAAM+c,KAAKpkB,YAAYnE,IAAIirB,IAC3Bzf,EAAM+c,KAAKpkB,YAAYnE,IAAIkrB,IAC3B1f,EAAM+c,KAAKpkB,YAAYnE,IAAImrB,IDpC7BC,CAAoB5f,IETpB,IAwgBI6f,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,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,OACN,IACA,QACG,MAEV,SACa,OACN,IACA,QACG,OAuBQvyC,QAAO,SAASwyC,EAAKC,UACrCD,EAAIC,EAAMC,SAAW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"}