React - echarts 世界地图,中国地图绘制

中国地图

首先需要一个包含中国所有省份名称的 json,这个好多网站都能找到。

我传到资源里了,放百度网盘怕太长时间不登录给我删掉了。

中国地图中文版json

我把地图抽出来单独做成了组件,这样用的时候比较方便.

使用的时候:

js 复制代码
import ChinaMap from './modules/chinaMap';
......

const dataList = [
    {"name":"北京","value":2000},
    {"name":"福建","value":4000},
    {"name":"上海","value":8000},
    {"name":"河北","value":3000},
    {"name":"山东","value":5000},
  ]

......

<ChinaMap data={dataList} min={0} max={10000}/>

代码最上面引入的 China.json 就是之前提到的包含中国所有省份名称的json.

echartsMapClick 这个方法是点击地图模块才触发的事件,我没有这个需求,所以空着了。

js 复制代码
import china from './China.json';
import * as echarts from 'echarts'; //全局引入 ,可按需引入
import { useEffect, useRef } from 'react';
 
const Map = (props) => {
  const chartRef = useRef();
  const {min,max} = props;
 
  const echartsMapClick = () => {
    //点击地图模块逻辑事件
  };
 
  const mapOption = (mapName, data) => {
    const myChart = echarts.init(chartRef.current);
 
    echarts.registerMap(mapName, data);
    const option = {
      tooltip: {
        backgroundColor: 'rgba(21, 24, 45, 0.9)', // 提示框浮层的背景颜色。
        textStyle: {
          // 提示框浮层的文本样式。
          color: '#fff',
          fontSize: 14,
        },
        extraCssText: 'border-color: rgba(21, 24, 45, 0.9);',
        formatter: function (params) {
          //数据格式化
          const val = params.value ? params.value : 0;
          if (params.value) {
            return (
              params.name + '<br />' + params.seriesName + ':' + val
            );
          } else {
            return '暂无数据';
          }
        },
      },
      toolbox: {
        show: true,
        //orient: 'vertical',
        left: 'left',
        top: 'top',
        feature: {
          dataView: { readOnly: false },
          restore: {},
          saveAsImage: {}
        }
      },
      visualMap: {
        min: 0,
        max: max,
        left: 'left',
        top: 'bottom',
        text: [max, min], //取值范围的文字
        inRange: {
          color: [
            '#313695',
            '#4575b4',
            '#74add1',
            '#abd9e9',
            '#e0f3f8',
            '#ffffbf',
            '#fee090',
            '#fdae61',
            '#f46d43',
            '#d73027',
            '#a50026'
          ]
        },
        show: true, //图注
      },
      geo: {
        map: 'china',
        roam: false, //不开启缩放和平移
        zoom: 1.23, //视角缩放比例
        label: {
          normal: {
            show: true,
            fontSize: '10',
            color: 'rgba(0,0,0,0.7)',
          },
        },
        itemStyle: {
          normal: {
            borderColor: 'rgba(0, 0, 0, 0.2)',
          },
          emphasis: {
            areaColor: '#4BD6C7', //鼠标选择区域颜色
            shadowOffsetX: 0,
            shadowOffsetY: 0,
            shadowBlur: 20,
            borderWidth: 0,
            shadowColor: 'rgba(0, 0, 0, 0.5)',
          },
        },
      },
      series: [
        {
          name:'交易量',
          type: 'map',
          geoIndex: 0,
          data: props.data,
        },
      ],
    };
    myChart.setOption(option); //绘图
    //点击画布内还是画布外
    myChart.getZr().on('click', (params) => {
      if (params.target) {
        myChart.on('click', echartsMapClick); //增加点击事件
      }
    });
  };
  const loadingChina = () => {
    mapOption('china', china); //初始化-创建中国地图
  };
 
  useEffect(() => {
    loadingChina();
  }, [props.data]);
 
  return <div style={{ width: '100%', minHeight: '500px' }} ref={chartRef} />;
};
export default Map;

世界地图

世界地图也需要一个包含所有国家名称的json,但是我没找到免费的中文版,所以用的英文版.

世界地图json

使用的时候:

js 复制代码
import WorldMap from './modules/worldMap';
......

const worldDataList = [{"name":"北京","value":2000},{"name":"福建","value":4000}]

......

<WorldMap data={worldDataList} />

组件代码:

js 复制代码
import world from './world.json';
import * as echarts from 'echarts'; //全局引入 ,可按需引入
import { useEffect, useRef } from 'react';
 
const WorldMap = (props) => {
  const chartRef = useRef();
  const topNumber = props.data[0].value;
  const bottomNumber = props.data[props.data.length - 1].value;
 
  const echartsMapClick = (target) => {
    //点击地图模块逻辑事件
    console.log(target)
  };
 
  const mapOption = (mapName, data) => {
    const myChart = echarts.init(chartRef.current);
 
    echarts.registerMap(mapName, data);
    const option = {
      tooltip: {
        backgroundColor: 'rgba(21, 24, 45, 0.9)', // 提示框浮层的背景颜色。
        textStyle: {
          // 提示框浮层的文本样式。
          color: '#fff',
          fontSize: 14,
        },
        extraCssText: 'border-color: rgba(21, 24, 45, 0.9);',
        formatter: function (params) {
          //数据格式化
          const val = params.value ? params.value : 0;
          if (params.value) {
            return (
              params.name + '<br />' + params.seriesName + ':' + val
            );
          } else {
            return '暂无数据';
          }
        },
      },
      visualMap: {
        min: 0,
        max: topNumber,
        left: 'right',
        top: 'bottom',
        text: [topNumber, bottomNumber], //取值范围
        inRange: {
          color: ['#D2DDFF', '#6E92FF'], //取值范围的颜色
        },
        show: true, //图注
      },
      geo: {
        map: 'world',
        roam: false, //不开启缩放和平移
        zoom: 1.23, //视角缩放比例
        itemStyle: {
          normal: {
            borderColor: 'rgba(0, 0, 0, 0.2)',
          },
          emphasis: {
            areaColor: '#4BD6C7', //鼠标选择区域颜色
            shadowOffsetX: 0,
            shadowOffsetY: 0,
            shadowBlur: 20,
            borderWidth: 0,
            shadowColor: 'rgba(0, 0, 0, 0.5)',
          },
        },
      },
      series: [
        {
          name:'交易量',
          type: 'map',
          geoIndex: 0,
          data: props.data,
        },
      ],
    };
    myChart.setOption(option); //绘图
    //点击画布内还是画布外
    myChart.getZr().on('click', (params) => {
      if (params.target) {
        myChart.on('click', echartsMapClick(params)); //增加点击事件
      }
    });
  };
  const loadingWorld = () => {
    mapOption('world', world); //初始化-创建中国地图
  };
 
  useEffect(() => {
    loadingWorld();
  }, [props.data]);
 
  return <div style={{ width: '100%', minHeight: '500px' }} ref={chartRef} />;
};
export default WorldMap;

最终效果


相关推荐
paopaokaka_luck8 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
空中湖8 小时前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
paopaokaka_luck10 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
鶴哥只手遮天12 小时前
jQuery 4.0 源码架构与工程实践-第 10 章 尺寸、几何与显隐
前端·javascript·jquery
米米商聊14 小时前
图标能点,按钮就可用了吗?键盘、名称与收藏状态
前端·javascript
技术小甜甜15 小时前
【Cursor】Skill 被标黄色警告,怎么改成合格的 SKILL.md
开发语言·javascript·ai编程·cursor·1024程序员节·ai agent·skills
qetfw17 小时前
Bash 函数与流程控制:read、if、for、case 验证
linux·前端·javascript·bash
鬼手点金17 小时前
从 API 消息到模型 Token:Chat Template
java·前端·javascript·数据库·人工智能·深度学习·1024程序员节
Mr.Pascal19 小时前
Javascript之什么是作用域?
javascript·1024程序员节
microrain19 小时前
设备报文怎么变,SagooIoT 只约定三个函数名
javascript·物联网·golang·sagooiot