import echarts from 'echarts/lib/echarts' import { itemPoint } from '../../constants' import { getMapJSON, getFormated } from '../../utils' function getTooltip (dataType, digit, dataStore, metrics, color, labelMap) { return { formatter (item) { let tpl = [] if (!item.name) return '' tpl.push(`${item.name}
`) metrics.forEach((label, index) => { let title = labelMap[label] != null ? labelMap[label] : label tpl.push(`${itemPoint(color[index])} ${title} : `) if (dataStore[item.name]) { tpl.push(getFormated(dataStore[item.name][label], dataType[label], digit)) } else { tpl.push('-') } tpl.push('
') }) return tpl.join(' ') } } } function getSeries (args) { const { position, selectData, dimension, metrics, rows, label, itemStyle, selectedMode, roam, center, aspectScale, boundingCoords, zoom, labelMap, scaleLimit, mapGrid } = args const result = [] const mapBase = { type: 'map', mapType: position } metrics.forEach(itemName => { const itemResult = Object.assign({ name: labelMap[itemName] != null ? labelMap[itemName] : itemName, data: [], selectedMode, roam, center, aspectScale, boundingCoords, zoom, scaleLimit }, mapBase) if (mapGrid) { Object.keys(mapGrid).forEach(key => { itemResult[key] = mapGrid[key] }) } setGeoLabel(itemStyle, itemResult, 'itemStyle') setGeoLabel(label, itemResult, 'label') rows.forEach(row => { itemResult.data.push({ name: row[dimension], value: row[itemName], selected: selectData }) }) result.push(itemResult) }) return result } function setGeoLabel (value, target, label) { if (typeof value === 'object') { target[label] = value } else if (value) { target[label] = { normal: { show: true }, emphasis: { show: true } } } } function getLegendMap (args) { const { metrics, legendName, labelMap } = args if (!legendName && !labelMap) return { data: metrics } const data = labelMap ? metrics.map(item => (labelMap[item] == null ? item : labelMap[item])) : metrics return { data, formatter (name) { return legendName[name] != null ? legendName[name] : name } } } function registerMap (args, mapOrigin) { const { _once, registerSign, beforeRegisterMap, beforeRegisterMapOnce, registerSignOnce, position, specialAreas } = args if (!_once[registerSign]) { if (beforeRegisterMap) mapOrigin = beforeRegisterMap(mapOrigin) if (beforeRegisterMapOnce && !_once[registerSignOnce]) { _once[registerSignOnce] = true mapOrigin = beforeRegisterMapOnce(mapOrigin) } _once[registerSign] = true echarts.registerMap(position, mapOrigin, specialAreas) } } export const map = (columns, rows, settings, extra) => { const { position = 'china', selectData = false, selectedMode, label = true, dataType = {}, digit = 2, dimension = columns[0], roam, center, aspectScale, boundingCoords, zoom, scaleLimit, legendName = {}, labelMap = {}, mapGrid, itemStyle, positionJsonLink, beforeRegisterMap, beforeRegisterMapOnce, mapURLProfix = 'https://unpkg.com/echarts@3.6.2/map/json/', specialAreas = {} } = settings let mapOrigin = settings.mapOrigin let metrics = columns.slice() if (settings.metrics) { metrics = settings.metrics } else { metrics.splice(columns.indexOf(dimension), 1) } const { tooltipVisible, legendVisible, color, _once } = extra const dataStore = {} rows.forEach(row => { dataStore[row[dimension]] = row }) const tooltip = tooltipVisible && getTooltip(dataType, digit, dataStore, metrics, color, labelMap) const legend = legendVisible && getLegendMap({ metrics, legendName, labelMap }) const seriesParams = { position, selectData, label, itemStyle, dimension, metrics, rows, selectedMode, roam, center, aspectScale, boundingCoords, zoom, labelMap, scaleLimit, mapGrid } const series = getSeries(seriesParams) const registerOptions = { _once, beforeRegisterMap, beforeRegisterMapOnce, registerSign: `MAP_REGISTER_${position}`, registerSignOnce: `ONCE_MAP_REGISTER_${position}`, position, specialAreas } if (mapOrigin) { registerMap(registerOptions, mapOrigin) return { series, tooltip, legend } } else { return getMapJSON({ position, positionJsonLink, beforeRegisterMapOnce, mapURLProfix }).then(json => { registerMap(registerOptions, json) return { series, tooltip, legend } }) } }