[echarts]基础地图

发布于:2025-08-02 ⋅ 阅读:(12) ⋅ 点赞:(0)

实现基础地图,可以拖拽。

import React, { useEffect, useRef } from 'react';
import * as echarts from 'echarts';

import geoJson from './china.json';   //从网上down一下china.json

const Map = ({ mapDetails = [] }) => {  //mapDetails中有具体要点亮的地区信息,地名要跟china.json中对上
    const chartRef = useRef(null);

    useEffect(() => {
        if (chartRef.current) {
            echarts.registerMap('china', geoJson);
            const chartMap = echarts.init(chartRef.current);

            const option = {
                //这里如果注释的话就不会展示tooltip
                // tooltip: {
                //     trigger: 'item',
                //     alwaysShowContent: true,
                //     show: true,
                // },
                roam: true,
                geo: {
                    map: 'china',
                    zoom: 1.8,
                    center: [115.97, 29.71],  //地图的中心坐标
                    scaleLimit: {
                        min: 1,
                        max: 3
                    },
                    itemStyle: {
                        borderColor: "rgba(147, 235, 248, 1)",
                        areaColor: {
                            type: "radial",
                            x: 0.5,
                            y: 0.5,
                            r: 0.9,
                            colorStops: [
                                {
                                    offset: 0,
                                    color: "rgba(17, 217, 245, 0.3)",
                                },
                                {
                                    offset: 1,
                                    color: "rgba(10, 209, 231, 0.02)",
                                },
                            ],
                            globalCoord: false,
                        },
                        borderWidth: 1,
                    },
                    emphasis: {  //鼠标到一个地区上面的样式展示
                        label: {
                            show: true,
                            color: "#ffffff",
                        },
                        itemStyle: {
                            areaColor: "#026aa9",
                            borderColor: "#fff",
                            borderWidth: 2,
                        },
                    },
                    regions: mapDetails.map(item => {
                        return {
                            name: item.province,
                            itemStyle: {
                                areaColor: '#2FBCEB',
                            },
                        }
                    }),
                    //本来想做一个鼠标到地区上面之后展示tooltip的样式,领导说要一直展示,但是tooltip每次只能展示一个,所以改用了label
                    tooltip: {  
                        show: false,
                        trigger: 'item',
                        alwaysShowContent: true,
                        formatter: function (params) {
                            const currentCity = mapDetails.find(item => item.province == params.name)
                            if (!!currentCity) {
                                return `${currentCity.province}: 在线${currentCity.online}台, 离线${currentCity.offline}`;
                            }
                        },
                        backgroundColor: '#13ADF2',
                        textStyle: {
                            color: '#fff',
                            fontSize: '0.8rem',
                        }
                    },
                    label: {
                        show: true,
                        color: '#fff',
                        fontSize: '0.8rem',
                        formatter: function (params) {
                            const currentCity = mapDetails.find(item => item.province == params.name)
                            if (!!currentCity) {
                                return `${currentCity.province}:在线${currentCity.online}台,离线${currentCity.offline}`;
                            } else {
                                return ''
                            }
                        },
                        offset: [110,0],
                        textStyle: {
                            color: '#fff',
                            fontSize: '0.8rem',
                        }
                    }
                }
            };

            chartMap.setOption(option);

            const handleResize = () => {
                chartMap.resize();
            };
            window.addEventListener('resize', handleResize);

            return () => {
                window.removeEventListener('resize', handleResize);
                chartMap.dispose();
            };
        }
    }, [mapDetails]);
    return (
        <>
            <div className={styles['card-content']}>
                <div style={{ width: '100%', height: '100%' }} ref={chartRef}></div>
            </div>
        </>
    )

}

export default Map;