import React from "react"; import * as echarts from "echarts"; import worldJson from "../world.json"; import topIcon from "../../../../assets/bigscreen/map-bar-head.svg"; class WorldMap2D extends React.Component { constructor(props) { super(props); this.chartRef = React.createRef(); this.chartInstance = null; } componentDidMount() { echarts.registerMap("world", worldJson); // 注册地图 this.initChart(); window.addEventListener("resize", this.resizeChart); } componentWillUnmount() { if (this.chartInstance) { this.chartInstance.dispose(); } window.removeEventListener("resize", this.resizeChart); } componentDidUpdate() { this.initChart(); } resizeChart = () => { if (this.chartInstance) { this.chartInstance.resize(); } }; initChart() { if (!this.chartRef.current) return; this.chartInstance = echarts.init(this.chartRef.current); // 顶部图标数据,计算 y 偏移(柱子高度的一半) const topIconData = this.props.data.map((d) => { return { name: d.name, value: [d.value[0], d.value[1], d.value[2]], // 位置 symbolOffset: [0, -d.value[2] / 2 * 30 ], // Y轴偏移(柱子高度一半 + 额外10像素) }; }); const option = { tooltip: { formatter: (params) => { return `${params.name}
${params.value[2]}`; }, textStyle: { fontSize: 20, fontWeight: "bold", }, }, geo: { map: "world", roam: true, // 支持缩放拖拽 zoom: 1.1, itemStyle: { areaColor: "rgba(126, 206, 244, 0.1)", borderColor: "#2EA7E0", borderWidth: 2, }, emphasis: { itemStyle: { areaColor: "rgba(41, 241, 250, 0.6)", // 悬浮时高亮色 borderWidth: 1, borderColor: 'rgba(41, 241, 250, 1)', shadowColor: "rgba(41, 241, 250, 1)", // 阴影颜色 // shadowColor: '#fff', shadowBlur: 2, shadowOffsetX: 10, // X 偏移 shadowOffsetY: -10, }, }, }, series: [ { type: "scatter", coordinateSystem: "geo", symbol: "rect", // 用矩形柱代替点 symbolSize: (val) => { const height = val[2] * 30; return [10, height]; }, itemStyle: { color: { type: "linear", x: 0, y: 0, x2: 0, y2: 1, colorStops: [ { offset: 0, color: "#EC903A" }, { offset: 1, color: "rgba(18,92,178,0)" }, ], }, shadowColor: "#4fd2dd", shadowBlur: 10, borderRadius: [8, 8, 0, 0], }, encode: { tooltip: 2 }, // 提示框显示 value[2] data: this.props.data, // [lng, lat, value] }, { type: "scatter", coordinateSystem: "geo", symbol: `image://${topIcon}`, // 图片 URL symbolSize: [15, 15], // 图片大小 data: topIconData, }, ], }; this.chartInstance.setOption(option); } render() { return (
); } } export default WorldMap2D;