echart之map地图图表使用教程

news2025/4/17 11:21:26

本文以echarts展示成都地图为例子。

echarts map (echarts地图)使用教程

  • 效果展示
  • 准备阶段
    • 获取地图geojson数据
    • 安装echarts
  • 开始绘制
    • 容器准备
    • js代码
  • 补充事项
    • vue3.0 用ref定义echarts报错
      • toRaw、markRaw 扩展
    • 地图隐藏南海诸岛
    • 地图显示提示框
    • 地图实现下钻
    • 地图实现回钻

效果展示

在这里插入图片描述
悬浮点击后高亮
在这里插入图片描述

准备阶段

获取地图geojson数据

获取所需地址的json数据

在这里插入图片描述

注意:目前成都市geojson数据没有新增的几大区(高新区,天府新区,东部新区),若需要可以在博士的资源下载,或者关注一波,私信可免费获得。

安装echarts

npm install echarts

注意:Echarts版本号超过4.9就不能使用地图软件了,所以需要先卸载高版本再安装

// 卸载echarts运行:
npm uninstall echarts

// 安装4.9版本的echarts
npm install echarts@4.9.0 --save

开始绘制

容器准备

//vue3+ts
 <div ref="centerChartmap" ></div>
 
//其他
<div id="centerChartmap" ></div>

js代码

import {ref,onMounted,markRaw,defineEmits} from "vue";
import * as echarts from "echarts";
import arrMap from "./map.json"; //地图json数据

const emit = defineEmits(["clickChild"]); //地图点击后传入父组件点击数据

let chartInstance = ref();// 初始化图表对象

onMounted(() => {
    initChart();  // 图表初始化
});
const initChart = () => {
  // 定义实例 vue3用ref定义echarts要使用markRaw 后文有解释
   chartInstance.value =markRaw(echarts.init(centerChartmap.value, "myTheme")); 
   //或chartInstance.value=echarts.init(document.getElementById('centerChartmap')
   
  echarts.registerMap("china", { geoJSON: arrMap }); 
  //注册可用的地图并添加geojson数据,只在 geo组件或者 map 图表类型中使用。
  let optionMap = {
    geo: {
      map: "china",
      roam: true,
      center: [ 103.909956,30.775001], //定义中心点
      layoutSize: "100%",
      selectedMode: "single",
      regions: [ //隐藏南海诸岛
        {
          name: "南海诸岛",
          itemStyle: {
            // 隐藏地图
            normal: {
              opacity: 0, // 为 0 时不绘制该图形
            },
          },
          label: {
            show: false, // 隐藏文字
          },
        },
      ],
      zoom: 12,
      //点击后颜色样式设置
      select: {
        itemStyle: {
          borderWidth: 2.5,
          areaColor: "rgb(8, 207, 221)",
          shadowColor: "rgba(255, 255, 255, 0.3)",
          shadowBlur: 10,
          shadowOffsetX: 4,
          shadowOffsetY: 4,
        },
      },
      //图形上的文本标签,可用于说明图形的一些数据信息
      label: {
        normal: {
          show: true,
          fontSize: "10",
          color: "#fff",
        },
      },
      //地图区域的多边形 图形样式,有 normal 和 emphasis 两个状态
      itemStyle: {
        //normal 是图形在默认状态下的样式;
        normal: {
          areaColor: "rgb(5,66,200,0.8)",
          borderColor: "#26e3ff", //线
        },
        //emphasis 是图形在高亮状态下的样式,比如在鼠标悬浮或者图例联动高亮时。
        emphasis: {
          areaColor: "#26e3ff",
          shadowOffsetX: 0,
          shadowOffsetY: 0,
          shadowBlur: 20,
          borderWidth: 0,
          shadowColor: "rgba(0, 0, 0, 0.5)",
        },
      },
    },
    colorBy: "series",
    series: [
      {
        name: "信息量",
        type: "map",
        mapType: "china",
        geoIndex: 0,
        data: [], //可设置初始选中值[{ name: '武侯区', selected: true }],
      },
    ],
  };
  chartInstance.value.setOption(optionMap);
  
  chartInstance.value.on("click", function (params) {
    //将点击的区域数据传递给父组件
    emit("clickChild", params.name);
  });

补充事项

vue3.0 用ref定义echarts报错

Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘type‘)
在这里插入图片描述

  • 官方解释

你可以有选择地退出默认的深度响应式/只读转换模式,并将原始的,未被代理的对象嵌入状态图中。它们可以根据情况灵活运用:
有些值不应该是响应式的,例如复杂的第三方类实例或 Vue 组件对象。(第三方实例)
当渲染具有不可变数据源的大列表时,跳过 proxy 转换可以提高性能。

  • 解决方案

在实例化echart时,将其指定为非响应式的

import { markRaw } from 'vue'
chartInstance.value = markRaw(echarts.init(centerChartmap.value, "myTheme"));

toRaw、markRaw 扩展

toRawmarkRaw
将一个由reactive生成的响应式对象转为普通对象。标记一个对象,使其永远不会再成为响应式对象。
用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。有些值不应被设置为响应式的,例如复杂的第三方类库等。当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。

地图隐藏南海诸岛

  • 第一种方案
 let optionMap = {
 ...
   geo: {
     ...
      regions: [
        {
          name: "南海诸岛",
          itemStyle: {
            normal: {
              opacity: 0, // 为 0 时不绘制该图形
            },
          },
          label: {
            show: false, // 隐藏文字
          },
        },
      ],
    ...
    },
    ...
   }
  • 第二种方案
    因为中国地图的名字叫china才会显示南海诸岛,别的名字不会显示,我们取其他名字就行啦。
    在这里插入图片描述

地图显示提示框

在这里插入图片描述

 let optionMap = {
 ...
    // 提示浮窗样式
    tooltip: {
      show: true,
      trigger: "item", //坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用
      axisPointer: {
        // 坐标轴指示器,坐标轴触发有效
        type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
      },
      alwaysShowContent: false,
      backgroundColor: "rgba(36, 215, 209, 1)", //提示框背景色
      borderColor: "rgba(255, 255, 255, 1)",
      triggerOn: "mousemove",
      enterable: true, //鼠标是否可进入提示框浮层中
      textStyle: {
        fontSize: "12",
        overflow: "break",
      },
      formatter: function (params) {
        //提示框显示的内容
        let str = "";
        str = `<div> ` + params.name + `</div>`;
        return str;
      },
    },
    ...
   }

地图实现下钻

下钻简而言之,在地图的点击事件回调中,加载了另一份地图的json并注册地图,然后再setOption中更改了地图名字,可以前端保存json数据,但最好还是后端返回,点击时前端请求比较好。

在这里插入图片描述

在这里插入图片描述

  chartInstance.value.on("click", function (params) {
   ...
     if (params.componentSubType == 'map') {
         goDown(params.name,optionMap)
    }
  });
 const goDown=(name,optionMap)=>{
    if (!echarts.getMap(name)) {
        const newMapJson = echarts.registerMap(name, { geoJSON: import('./map/'+name+'.json')})
         optionMap.geo.map = mapname
         optionMap.series[0].map = mapname
        chartInstance.value.setOption(optionMap);
     }
 }

地图实现回钻

与下钻一个意思,不过回钻是往回走,我们只要把每一次地图的显示存入一个数组,回钻时取最后一个就行了。

//用来存放当前的地图名字
let currentName =ref('')
//用来存放下钻的历史记录
let history =ref([])
...
  chartInstance.value.on("click", function (params) {
   ...
     if (params.componentSubType == 'map') {
         goDown(params.name,optionMap)
    }
  });
 const goDown=(name,optionMap)=>{
    if (!echarts.getMap(name)) {
        const newMapJson = echarts.registerMap(name, { geoJSON: import('./map/'+name+'.json')})
         optionMap.geo.map = mapname
         optionMap.series[0].map = mapname
         history.push(currentName) //点击时存入
         chartInstance.value.setOption(optionMap);
         currentName = name
     }
 }

   const returnUpLevel=(optionMap)=>{
    //先判断history有没有数据,能不能返回
    if(history.length == 0){
        return false
    }
    //取出要返回的那个名字
    const name = history.pop() //pop删除数组最后一个元素并返回该元素。
    const currentJson = echarts.getMap(mapname).geoJson
    //修改地图配置重新绘制地图
    //因为之前地图是已经绘制了的,只是把后面的遮盖了,所以数据是存在的,我们不需要在重新设置数据源了
    optionMap.geo.map = mapname
    optionMap.series[0].map = mapname
    chart.setOption(optionMap)
    //修改当前的层级,名字
    currentName = name
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/756889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue项目的启动

前言&#xff1a; 由于最近开始实习&#xff0c;负责人上来就给我丢一个前端vue项目和后端文件&#xff0c;让我在本机完成部署&#xff0c;由于之前学的基本上都是后端相关知识&#xff0c;很少有了解到前端的东西&#xff0c;因此在这里将自己部署Vue项目时遇到的问题和解决过…

编译libtiff库给IOS平台用

打开libtiff官方网 : libtiff / libtiff GitLab 克隆: git clone --recursive https://gitlab.com/libtiff/libtiff.git 克隆成功并打开libtiff目录,发现有autogen.sh 与CMakeLists.txt所以可生成Configure程序来配置并编译,也可直接使用CMake-GUI来配置编译,选择其中一种 …

远程会诊如何实现?

比如&#xff1a;医生遇到复杂病情需要求助院外专家远程会诊过程中&#xff0c;需要将电脑中的病人资料给院外专家看&#xff0c;同时确保医院电脑和网络系统绝对安全&#xff0c;电脑不允许安装任何外部软件&#xff0c;不能被外人控制和操作&#xff0c;外部设备不能接入医院…

【Java技术专题】「攻破技术盲区」带你攻破你很可能存在的Java技术盲点之技术功底指南(鲜为人知的技术)

带你攻破你很可能存在的Java技术盲点之技术功底指南 基本类型的包装类技术盲点&#xff1a;基本类型的比较技术盲点&#xff1a;字符串内部化&#xff08;string interning&#xff09;字符串内部化的示例 技术盲点&#xff1a;类型缓存机制&#xff08;空间换时间&#xff09;…

微信小程序border-radius不圆滑

border-radius可以设置&#xff1a;百分比或者像素值 1.使用像素值比较圆滑 2.使用百分比不够圆滑

习题1.25

对吗?实践出真知,运行看看。代码如下。 (defn square [x] (* x x))(defn fast-expt[b n](println "call iter" n)(cond (= 1 n) b(= 2 n) (square b)(even? n) (square (fast-expt b (/ n 2))):else (* b (fast-expt b (- n 1)))))(defn expmod [base exp m](mod…

pytest 结合logging输出日志保存至文件

API_log.py import loggingclass loger():def logering(self):# 创建logger对象logger logging.getLogger(test_logger)# 设置日志等级logger.setLevel(logging.DEBUG)# 追加写入文件a &#xff0c;设置utf-8编码防止中文写入乱码test_log logging.FileHandler(test.log, a,…

Java:基于JDBC数据连接池方式同步第三方数据库表信息数据

前言 最近遇到一个需求就是要拉取第三方的数据信息&#xff0c;但是第三方那边又没有对外暴露对接接口&#xff0c;只给出了具体的数据库连接信息和具体表信息基于第三方给出的有效信息&#xff0c;我采取了用 JDBC 传统的方式去进行数据拉取注意&#xff1a;前置条件两端的网…

收费站对讲广播系统方案

收费站对讲广播系统方案 收费站对讲广播系统是一种用于收费站内部通信和广播传输的系统。它能够实现不同收费站点之间的语音通信和广播&#xff0c;以便快速、准确地传达信息和指令。该系统通常由以下几个核心组件组成&#xff1a;1. 主控台&#xff1a;主控台是系统的中心控制…

cocos shader在编辑器正常,浏览器上不显示

问题出在需要将图片的package属性取消勾选。如果用的单色精灵&#xff0c;那么可以将系统的白色图片复制一份再取消勾选。 相关链接&#xff1a; shader在浏览器上不显示 - Creator 2.x - Cocos中文社区

Redis高级篇(一)

分布式缓存 -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a;RDB持久化、AOF持久化 1.1.RDB持久化 什么是RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&am…

第一章 JavaScript --下

第一章 JavaScript --下 2.5.6 DOM操作 由于实际开发时基本上都是使用JavaScript的各种框架来操作&#xff0c;而框架中的操作方式和我们现在看到的原生操作完全不同&#xff0c;所以下面罗列的API仅供参考&#xff0c;不做要求。 2.5.6.1 在整个文档范围内查询元素节点 功…

XUbuntu22.04之vim无法复制内容到系统(一百八十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

2023年7月14日,ArrayList

集合框架图&#xff1a; 集合和数组的区别 AarrayList ArrayList底层实现原理 ArrayList的底层实现是基于数组的动态扩容。 初始容量&#xff1a;当创建一个新的ArrayList对象时&#xff0c;它会分配一个初始容量为10的数组。这个初始容量可以根据需求进行调整。 //表示默认的初…

CS162 9-10

lecture9 thread lecture10 I/O层 调度 1.最小化响应时间 2.最大化吞吐量 3.分配时间公平 FCFS 后面的短请求&#xff0c;要等待前面的长请求。 Round Robin Scheduling Each process gets a small unit of CPU time (time quantum), usually 10-100 milliseconds – …

layui会议OA项目数据表格新增改查

文章目录 前言一、后台代码编写1.1 数据表优化1.2 R工具类1.3 UserDao新增改查1.4 Servlet的编写 二、前台页面的编写2.1 userManege.jsp2.2 userManage.js2.3 新增、修改用户共用jsp2.4add、edit的js 三、演示3.1 查询3.2 新增3.3 修改3.4 删除 前言 在上篇博客我们实现了左侧…

山东农信:一云多芯助力金融活水普惠齐鲁大地

农业金融正走在发展的关键路口。 一方面&#xff0c;我国全面推进乡村振兴、加快建设农业强国&#xff0c;需要形成和健全金融支农服务体系&#xff0c;为三农发展提供多元金融服务&#xff1b;另一方面&#xff0c;在大数据、云计算、人工智能等数字化的驱动下&#xff0c;数…

实战 ➾【Red Hat 搭建部署VSFTPd服务】

实战 ➾【Red Hat 搭建部署VSFTPd服务】 &#x1f53b; 前言&#x1f53b; 一、vsFTPd服务部署&#x1f6a5; 1.1 vsFTPd服务安装&#x1f6a5; 1.2 vsFTPd服务的启动与关闭 &#x1f53b; 二、vsFTPd相关配置&#x1f6a5; 2.1 vsFTPd的相关配置文件&#x1f6a5; 2.2 配置匿名…

【无标题】使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样

问题&#xff1a;使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样&#xff0c;在mac下&#xff0c;一切正常&#xff0c;看起来很舒服&#xff0c;但是当我把页面放在扩展屏幕下&#xff08;27寸&#xff09;&#xff0c;再生成一个pdf&#xff0c;虽然排版一…

深入理解Windows操作系统机制(二)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。 我们每天都在用Windows操作系统&#xff0c;但是其实我们每天直接在打交道的并不是Windows操作系统的内核&#xff0c;而是Windows操作系统…