在react项目用echarts绘制中国地图

文章目录

一、引入echarts

安装:npm i echarts --save

二、下载地图json数据

由于echarts内部不再支持地图数据,所以要绘制地图需要自己去下载数据。建议使用阿里云的。

地址:https://datav.aliyun.com/portal/school/atlas/area_selector

默认展示的是全国地图,如果想要某市的json数据,点击对应省份即可。

本文中直接复制了json数据,然后将数据保存为geoJson.js,如下:

三、编写react组件

javascript 复制代码
// components/chinaMap/index.tsx

import { useRef, useEffect } from "react";
import * as echarts from "echarts";
import { geoJson } from "./geoJson";

const ChinaMap = ({
  option,
  width = "100%",
  height = "100%",
}: {
  option: any;
  width?: string;
  height?: string;
}) => {
  const ref = useRef(null);
  let mapInstance: echarts.ECharts | null;

  const renderMap = () => {
    if (ref.current) {
      const renderedMapInstance = echarts.getInstanceByDom(ref.current);
      if (renderedMapInstance) {
        mapInstance = renderedMapInstance;
      } else {
        mapInstance = echarts.init(ref.current);
      }
      mapInstance.setOption(option);
    }
  };

  useEffect(() => {
    echarts.registerMap("china", geoJson as any);
    renderMap();
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  useEffect(() => {
    window.onresize = function () {
      // 调用 echarts实例上 resize 方法
      mapInstance?.resize();
    };
    return () => {
      // 销毁实例,销毁后实例无法再被使用。
      mapInstance && mapInstance.dispose();
    };
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  return <div ref={ref} style={{ width: width, height: height }} />;
};

export default ChinaMap;

四、组件使用

javascript 复制代码
// src/views/home/chart/map.tsx

import React from "react";
import ChinaMap from "@/components/chinaMap/index";

const dataList = [
  {
    value: 218,
    name: "北京",
  },
  {
    value: 122,
    name: "广东",
  },
  {
    value: 119,
    name: "台湾",
  },
  {
    value: 81,
    name: "香港",
  },
  {
    value: 74,
    name: "山东",
  },
  {
    value: 68,
    name: "江苏",
  },
  {
    value: 62,
    name: "浙江",
  },
  {
    value: 49,
    name: "上海",
  },
  {
    value: 48,
    name: "河北",
  },
  {
    value: 43,
    name: "河南",
  },
  {
    value: 41,
    name: "辽宁",
  },
  {
    value: 38,
    name: "NULL",
  },
  {
    value: 36,
    name: "四川",
  },
  {
    value: 33,
    name: "湖北",
  },
  {
    value: 31,
    name: "湖南",
  },
  {
    value: 29,
    name: "安徽",
  },
  {
    value: 28,
    name: "吉林",
  },
  {
    value: 26,
    name: "江西",
  },
  {
    value: 24,
    name: "新疆",
  },
  {
    value: 24,
    name: "重庆",
  },
  {
    value: 23,
    name: "福建",
  },
  {
    value: 19,
    name: "广西",
  },
  {
    value: 18,
    name: "山西",
  },
  {
    value: 16,
    name: "云南",
  },
  {
    value: 16,
    name: "内蒙古",
  },
  {
    value: 16,
    name: "黑龙江",
  },
  {
    value: 12,
    name: "陕西",
  },
  {
    value: 12,
    name: "天津",
  },
  {
    value: 11,
    name: "宁夏",
  },
  {
    value: 10,
    name: "甘肃",
  },
  {
    value: 8,
    name: "贵州",
  },
  {
    value: 4,
    name: "西藏",
  },
  {
    value: 4,
    name: "青海",
  },
  {
    value: 1,
    name: "海南",
  },
];

const Map: React.FC = () => {
  const option: any = {
    title: {
      text: "数据地图",
      // subtext: "数据来源于阿里云平台",
      // sublink: "https://datav.aliyun.com/portal/school/atlas/area_selector",
      left: "right",
      textStyle: {
        color: "#000",
      },
    },
    // 提示框
    tooltip: {
      trigger: "item",
      showDelay: 0,
      transitionDuration: 0.2,
      formatter: (params: any) => {
        const { data = {} } = params;
        const { value = 0 } = data;
        return `${params.name}<br/>数量: ${value}`;
      },
    },
    // 工具导航
    toolbox: {
      show: true,
      left: "left",
      top: "top",
      feature: {
        // dataView: { readOnly: false },
        restore: {},
        saveAsImage: {},
      },
    },
    // 地图数据
    dataset: {
      source: dataList,
    },
    series: {
      type: "map",
      map: "china",
      roam: true, // 地图拖动、缩放
      top: "10%", // 距离顶部距离
      zoom: 1.2, // 当前视角的缩放比例
      scaleLimit: {
        max: 2,
        min: 1, // 设置默认缩放效果
      },
      // 文本标签,地区名, 控制样式,位置等等,可以是数组,多个
      label: {
        show: true, // 默认状态下,显示省市名称
        position: [1, 100], // 相对的百分比
        fontSize: 12,
        offset: [2, 0],
        align: "left",
      },
      itemStyle: {
        areaColor: "#e5f7ff", // 地图图形颜色 #fff
        // borderColor: "#a0d4e7", // 地图边框线色
        // borderWidth: 1, // 地图边框线宽
      },
      // 高亮状态下的多边形和文本样式,鼠标悬浮在地图块上的效果
      emphasis: {
        itemStyle: {
          areaColor: "#ccc",
          borderColor: "#4aacd9",
        },
      },
    },
    // 视觉映射组件
    visualMap: {
      type: "continuous",
      left: "right",
      min: 0,
      max: 218,
      inRange: {
        color: [
          "#e5f7ff",
          "#096dd9",
          // "#fedeb5",
          // "#f96a35",
          // "#c3380e",
          // "#942005",
          // "#5b1305",
        ],
      },
      text: [`最大值:218`, 0],
      textStyle: {
        color: "#000",
      },
      // calculable: true
    },
  };
  return (
    <>
      <ChinaMap option={option} height="80vh" width="100%" />;
    </>
  );
};

export default Map;

展示如下:

本文项目源码:https://download.csdn.net/download/ganyingxie123456/88800965?spm=1001.2014.3001.5503

echarts使用地图主要就是要先下载相关地理数据,其次就是按需求进行常规的option配置,并不难。

相关推荐
binbin_5215 小时前
React 井字棋教程:用一个小游戏理解组件和状态
前端·react.js·前端框架
张元清16 小时前
React useObjectUrl Hook:预览文件与 Blob,不留内存泄漏(2026)
javascript·react.js
真的想不出名儿20 小时前
Md编辑器整合-react
前端·react.js·编辑器
牛仔只喝牛奶1 天前
多端跨端技术选型:小程序 + H5 + App 的两栈拆分落地
react native·react.js
wear工程师2 天前
setState 到底是不是异步的?这题从 React 16 问到 18,标准答案早就变了
react.js·面试
wanghowie2 天前
LangGraph4j 落地(二)— ReAct 多步工具与 trace 扩展
前端·react.js·前端框架
csj502 天前
前端基础之《React(11)—state声明式》
前端·react.js
张元清2 天前
React useLocalStorage Hook:SSR 安全的持久化状态(2026)
javascript·react.js
析数塔2 天前
2026前端框架深度解析:React Compiler、Angular Zoneless、Vue 3.5重写游戏规则
前端·vue.js·react.js
杖雍皓2 天前
没有服务器如何构建现代 Web 应用:平台选型与组合策略
运维·服务器·前端·react.js·github·netlify·vercel