UNPKG

highcharts

Version:
233 lines (232 loc) 7.16 kB
/* * * * (c) 2010-2024 Torstein Honsi * * License: www.highcharts.com/license * * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!! * * */ 'use strict'; import Chart from './Chart.js'; import D from '../Defaults.js'; const { getOptions } = D; import SVGRenderer from '../Renderer/SVG/SVGRenderer.js'; import U from '../Utilities.js'; const { isNumber, merge, pick } = U; import '../../Maps/MapSymbols.js'; /* * * * Class * * */ /** * Map-optimized chart. Use {@link Highcharts.Chart|Chart} for common charts. * * @requires modules/map * * @class * @name Highcharts.MapChart * @extends Highcharts.Chart */ class MapChart extends Chart { /* * * * Functions * * */ /** * Initializes the chart. The constructor's arguments are passed on * directly. * * @function Highcharts.MapChart#init * * @param {Highcharts.Options} userOptions * Custom options. * * @param {Function} [callback] * Function to run when the chart has loaded and all external * images are loaded. * * * @emits Highcharts.MapChart#event:init * @emits Highcharts.MapChart#event:afterInit */ init(userOptions, callback) { const defaultCreditsOptions = getOptions().credits; const options = merge({ chart: { panning: { enabled: true, type: 'xy' }, type: 'map' }, credits: { mapText: pick(defaultCreditsOptions.mapText, ' \u00a9 <a href="{geojson.copyrightUrl}">' + '{geojson.copyrightShort}</a>'), mapTextFull: pick(defaultCreditsOptions.mapTextFull, '{geojson.copyright}') }, mapView: {}, // Required to enable Chart.mapView tooltip: { followTouchMove: false } }, userOptions // User's options ); super.init(options, callback); } /** * Highcharts Maps only. Zoom in or out of the map. See also * {@link Point#zoomTo}. See {@link Chart#fromLatLonToPoint} for how to get * the `centerX` and `centerY` parameters for a geographic location. * * Deprecated as of v9.3 in favor of [MapView.zoomBy](https://api.highcharts.com/class-reference/Highcharts.MapView#zoomBy). * * @deprecated * @function Highcharts.Chart#mapZoom * * @param {number} [howMuch] * How much to zoom the map. Values less than 1 zooms in. 0.5 zooms * in to half the current view. 2 zooms to twice the current view. If * omitted, the zoom is reset. * * @param {number} [xProjected] * The projected x position to keep stationary when zooming, if * available space. * * @param {number} [yProjected] * The projected y position to keep stationary when zooming, if * available space. * * @param {number} [chartX] * Keep this chart position stationary if possible. This is used for * example in `mousewheel` events, where the area under the mouse * should be fixed as we zoom in. * * @param {number} [chartY] * Keep this chart position stationary if possible. */ mapZoom(howMuch, xProjected, yProjected, chartX, chartY) { if (this.mapView) { if (isNumber(howMuch)) { // Compliance, mapView.zoomBy uses different values howMuch = Math.log(howMuch) / Math.log(0.5); } this.mapView.zoomBy(howMuch, isNumber(xProjected) && isNumber(yProjected) ? this.mapView.projection.inverse([xProjected, yProjected]) : void 0, isNumber(chartX) && isNumber(chartY) ? [chartX, chartY] : void 0); } } update(options) { // Calculate and set the recommended map view if map option is set if (options.chart && 'map' in options.chart) { this.mapView?.recommendMapView(this, [ options.chart.map, ...(this.options.series || []).map((s) => s.mapData) ], true); } super.update.apply(this, arguments); } } /* * * * Class Namespace * * */ (function (MapChart) { /* * * * Constants * * */ /** * Contains all loaded map data for Highmaps. * * @requires modules/map * * @name Highcharts.maps * @type {Record<string,*>} */ MapChart.maps = {}; /* * * * Functions * * */ /** * The factory function for creating new map charts. Creates a new {@link * Highcharts.MapChart|MapChart} object with different default options than * the basic Chart. * * @requires modules/map * * @function Highcharts.mapChart * * @param {string|Highcharts.HTMLDOMElement} [renderTo] * The DOM element to render to, or its id. * * @param {Highcharts.Options} options * The chart options structure as described in the * [options reference](https://api.highcharts.com/highstock). * * @param {Highcharts.ChartCallbackFunction} [callback] * A function to execute when the chart object is finished * rendering and all external image files (`chart.backgroundImage`, * `chart.plotBackgroundImage` etc) are loaded. Defining a * [chart.events.load](https://api.highcharts.com/highstock/chart.events.load) * handler is equivalent. * * @return {Highcharts.MapChart} * The chart object. */ function mapChart(a, b, c) { return new MapChart(a, b, c); } MapChart.mapChart = mapChart; /** * Utility for reading SVG paths directly. * * @requires modules/map * * @function Highcharts.splitPath * * @param {string|Array<(string|number)>} path * Path to split. * * @return {Highcharts.SVGPathArray} * Splitted SVG path */ function splitPath(path) { let arr; if (typeof path === 'string') { path = path // Move letters apart .replace(/([A-Z])/gi, ' $1 ') // Trim .replace(/^\s*/, '').replace(/\s*$/, ''); // Split on spaces and commas. The semicolon is bogus, designed to // circumvent string replacement in the pre-v7 assembler that built // specific styled mode files. const split = path.split(/[ ,;]+/); arr = split.map((item) => { if (!/[A-Z]/i.test(item)) { return parseFloat(item); } return item; }); } else { arr = path; } return SVGRenderer.prototype.pathToSegments(arr); } MapChart.splitPath = splitPath; })(MapChart || (MapChart = {})); /* * * * Default Export * * */ export default MapChart;