Vue中使用echarts@4.x中国地图及AMap相关API的使用

一、此 demo 实现的基本功能

  • 中国地图的显示
  • 地图点击下钻的功能
  • 地图相关组件的使用,例 tooltip...

二、实现思路

初始使用下载本地的中国 geo 格式的 json 数据来绘制地图,点击某一区划(例:山东省)时,以点击的区划名称使用 AMap.DistrictSearch(opts) 构造函数查询下一级的区划信息(例:青岛市区划 id 为 370200)和业务数据整合处理;然后以点击的区划 id 用AMapUI中的组件DistrictExplorer相关方法获取下一级的地图 json 数据,继而绘制下一级地图(例:青岛市),再点下同...

三、引入 echarts

因为 echarts 在 5.0 及之后版本因 包体积优化和法规规定 取消了内置 json 地图数据,但仍然可以下载之前版本的依赖包来使用或下载曾经内置的地图数据。


若要引地图 json 数据,建议下载 echarts@4.9.0 ,这是 echarts 取消内置前的最新版本地图 json 数据,之前的版本地图数据比如 3.x,2.x 或多或少在地图边界和岛屿精度部分有所不准,亲测~

1. 通过 npm 方式下载 echarts

$ npm i echarts@4.9.0

2. 引入 echarts

import echarts from 'echarts'

3. 相关 api 说明

1. echarts.registerMap

echarts 方法:在 echarts 5.0 及之后版本取消了registerMap 此方法,所以最新 echarts(v5.2.2)版本引用会报错,所以这里我使用 v4.9.0 来注册地图。

// registerMap 接收两个参数
// 第一个是地图名称,china 为显示右下角南海诸岛,china1 则不显示右下角南海诸岛
// 第二个参数是绘制地图所需的json数据,在这里我下载了两个版本的json数据放在本地引用来使用,见下文

echarts.registerMap('china',chinaJson)

2. echarts.init

echarts 方法:创建一个 ECharts 实例,返回 echartsInstance,不能在单个容器上初始化多个 ECharts 实例

// 创建实例,接收三个参数
// 参数dom:实例容器,一般是一个具有高宽的div元素
// 参数theme:可选,应用的主题。可以是一个主题的配置对象
// 参数opts:可选,附加参数

this.myChart = echarts.init(dom,theme,opts)

3. echartsInstance.on

实例方法:绑定事件处理函数(对应 off:解绑事件处理函数)

// 创建实例,接收三个参数
// 参数eventName:事件名称,全小写,例如'click','mousemove','legendselected'
// 参数query:可选,过滤条件,能够只在指定的组件或者元素上进行响应。可为 string 或者 Object
// 参数handler:事件处理函数

this.myChart.on(eventName,query,handler)

4. echartsInstance.setOption

实例方法:设置图表实例的配置项以及数据,万能接口,所有参数和数据的修改都可以通过 setOption 完成,ECharts 会合并新的参数和数据,然后刷新图表。

配置项部分用法见下文五、echarts 部分配置项。官方配置项手册

// 参数 option:配置项

this.myChart.setOption(option)

四、AMap 相关 api 使用说明

1. 引入 AMap

<!-- html文件 -->

<!--引入高德地图JSAPI,key值是在AMap官方申请的哦,plugin是项目中用到的插件 -->
<script src="//webapi.amap.com/maps?v=2.0&key=bb36205e1ab4869979c6505a3cc362ee&plugin=AMap.DistrictSearch"></script>

<!--引入UI组件库(1.1版本) -->
<script src="//webapi.amap.com/ui/1.1/main.js"></script>

2. AMap.DistrictSearch(opt)

插件,行政区查询服务,提供行政区相关信息。官方文档

/** 
参数opts:对象,实例时的配置
opts:{
  level: String,关键字对应的行政区级别或商圈,可选值
  showbiz: Boolean,是否显示商圈,默认值true
  extensions: String,是否返回行政区边界坐标点。默认值:base,不返回行政区边界坐标点,取值:all,返回完整行政区边界坐标点
  subdistrict:Number,默认1,显示下级行政区级数(行政区级别包括:国家、省/直辖市、市、区/县4个级别),商圈为区/县下一级。0不返回下一级区划,1返回下一级区划,2...,3...。
}
**/

const districtSearch = new AMap.DistrictSearch(opts)
// 根据关键字查询行政区或商圈信息 关键字支持:行政区名、citycode、adcode、商圈名,默认值:“全国”
districtSearch.search(obj.data.name,(status,result) => {
  console.log('加载区划信息',status,result)
})

3. DistrictExplorer

加载绘制地图所需的 geo 格式的 json 数据。(行政区划浏览) 提供了全国范围内到区县一级的行政区划数据(含边界),同时提供一些辅助功能,比如区划面绘制、事件监听,以及快速判断经纬度所属的子级区划等。官方文档

// 使用

AMapUI.loadUI(['geo/DistrictExplorer'],(DistrictExplorer) => {
  let districtExplorer = new DistrictExplorer({
    eventSupport: true,// 打开事件支持
    map: null,// 地图对象实例。仅仅获取数据,不涉及地图相关的操作时,可以不设置
  })
  districtExplorer.loadAreaNode(obj.data.cityCode,(error,areaNode) => {
    if (error) return
    const mapJson = {}
    // 返回该区域中全部的子级区划Feature数组
    mapJson.features = areaNode.getSubFeatures() || []
    console.log('绘制地图所需的json数据',mapJson)
  })
})

五、echarts 部分配置项

const option = {
  visualMap: {
    // 视觉映射组件配置
    type: 'continuous',// 定义为连续型 visualMap
    show: true,bottom: '5%',left: '2%',text: ['高','低'],// 两端的文本
    min: 0,// 指定 visualMapContinuous 组件的允许的最小值
    max: 100,// 指定 visualMapContinuous 组件的允许的最大值
    inRange: {
      // 定义 在选中范围中 的视觉元素
      color: ['#fff','#A0CFFF','#409EFF'],// 图元的颜色
    },calculable: true,// 是否显示拖拽用的手柄(手柄能拖拽调整选中范围)
  },tooltip: {
    // 提示框组件
    trigger: 'item',formatter: function (item) {
      if (item.name == '南海诸岛') {
        return ''
      } else {
        return item.name + '<br>业务数据:' + (item.value || 0) + ' 个'
      }
    },},series: [
    // 系列列表。每个系列通过 type 决定自己的图表类型
    {
      type: 'map',map: registerName,name: '业务数据',// 系列名称,用于tooltip的显示,legend 的图例筛选,在 setOption 更新数据和配置项时用于指定对应的系列
      aspectScale: 0.75,// 用于 scale 地图的长宽比
      zoom,// 地图缩放多少倍
      roam: true,// 允许缩放和平移
      mapType: '自定义地图',selectedMode: 'single',// 点击区域,会处于选中状态,single单选
      showLegendSymbol: false,// 在图例相应区域显示图例的颜色标识(系列标识的小圆点),存在 legend 组件时生效
      // center: [100.97,35.71],// 初始化时的地图位置,可通过改变地图中心视角的经纬度来实现地图的平移
      itemStyle: {
        // 地图区域的多边形图形样式
        normal: {
          // 正常时的样式
          color: '#ccc',// 图形的颜色
          borderColor: '#303133',// 图形的描边颜色
          areaColor: '#d4f7fc',// 地图区域颜色
          borderWidth: 0.5,// 描边线宽。为 0 时无描边
          label: {
            // 设置地图区域名的文本样式,例如地名的字体大小等
            show: true,// 显示地区的文本名称,默认是不显示的,默认状态是hoverORclick才显示
            fontSize: 12,textStyle: {
              color: '#606266',emphasis: {
          // 选中后的样式
          areaColor: '#4382F6',borderColor: '#fff',areaStyle: {
            color: '#fff',label: {
            show: true,fontSize: 12,textStyle: {
              color: '#003767',data: this.mapData,// 地图系列中的数据内容数组。数组项可以为单个数值
    },],}

六、地图 json 数据说明及 demo 效果图

1. 地图 json 数据说明比较

  • echarts@5.0 版本之前内置的 geo 地图 json 数据(这里特指v4.9.0)是不显示海南省下方的南海诸岛海域,所以地图较方正。

  • 阿里datav的地图 json 数据是显示海南省下方的南海诸岛海域,所以地图偏高。

2. demo 效果图

  1. 使用echarts@4.9.0内置的地图 json 数据绘制

  1. 使用阿里datav下载的地图 json 数据绘制

demo gitee 地址

原文地址:https://www.cnblogs.com/Faith-Yin

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


https://segmentfault.com/a/1190000022018995 https://www.jianshu.com/p/8c3599dda094 vuex教程中,有这样一句话和这样一段代码: 实践中,我们会经常用到 ES2015 的参数解构来简化代码(特别是我们需要调用commi
ES6 (ECMAScript 6)中的模块是一个包含 JavaScript 代码的文件,在这个模块中所有的变量都对其他模块是不可见的,除非我们导出它。 ES6的模块系统大致分为导出(export)和导入(import)两个模块。 1、模块导出(export) 可以 导出 所有的最外层 函数 、 类
from https://mp.weixin.qq.com/s/-rc1lYYlsfx-wR4mQmIIQQ Vue知识点汇总(含Vue3) 一、Vue 基础 1. Vue的基本原理 当一个Vue实例创建时,Vue会遍历data中的属性,用 Object.defineProperty(vue3.0使
D:\Temp&gt;npm init vite@latest vue3study --template vuenpm ERR! code ETIMEDOUTnpm ERR! errno ETIMEDOUTnpm ERR! network request to https://registry.np
文章浏览阅读1.2k次。最近自己从零撸起的甘特图组件需要子组件的滚动条同步滚动这就涉及到子组件之间的互相通信,通过 消息总线可以达到我们的需求 ,首先建立一个标志位,拖动左边滚动条的时候,右边的滚动条事件不处理,反之拖动右边滚动条时,左边的滚动条事件不做处理,建立一个公共的变量用于两者的互斥store.jsimport Vue from 'vue'export let store = Vue.observable({ scrollFlag: true})export let mutations =.._vue 能不能同时有两个滚动事件
文章浏览阅读3.3k次,点赞3次,收藏16次。静默打印是什么?简单来说就是不需要用户点击"打印",自动去打印,但是使用浏览器web打印不可避免的要弹出以下画面面对这种问题也只能用"富客户端"技术来解决,在浏览器的沙盒安全模型中无法做到,那么只能使用插件的技术,这个我们就不自己花力气去做了,我找来了 lodop 这个免费的打印组件,功能还是挺强大的,下载下图的发行包解压后安装下图两个exe如果你的系统是64位的,可以安装install_lodop64.exe上图的LodopFuncs.js 是客户端要使用的核心库文件..._this.$getlodop().then((lodop) =>{
文章浏览阅读1.7k次。个人觉得大屏展示其实很简单,噱头多过技术含量,下面使用了 DataV (不是阿里的那个DataV哈,具体链接在这里)开发了一个大屏展示,使用了css flex弹性布局,使用了DataV的一些比较酷炫的边框(SVG写的),基本上功能没有全部完成,但是模子已经刻出来了,只是后端推送的内容没有全部写出来前端<template> <dv-full-screen-container class="screen-container"> <div class="ti_用signalr做一个简单的实时大屏显示
文章浏览阅读3.4k次,点赞3次,收藏10次。【说明】导入的Excel 字体颜色和背景色只能识别【标准色】,别的如"主题颜色",exceljs 解析出来不是颜色值。导入的样式包括字体,字号,列宽,合并单元格,【部分能识别】的背景色,文字颜色。导入到 x-data-spreadsheet 如下图。原Excel样式如下。_x-data-spreadsheet
文章浏览阅读1.7k次。之前参考某文章把 router-view 放在 el-tab-pane 外面都不起作用,问题根本不是出在 el-tab-pane,而是v-for 里面有多个route-view , keep-alive 时 tab 并未销毁掉,而是缓存隐藏了起来。需要把 router-view 的 name 与路由的 index.js 名称对应起来。之前参照很多文章修改试图修正这个问题,结果都徒劳,终于让我找到。我做了如下修改,主页面 main.vue。_el-tab-pane 后面接router-view
文章浏览阅读533次。今天在一台虚拟机上面运行老项目,报各种类型上图的错误提示,一开始还以为是less的问题,结果一个个装完还是报错,后面又说webpack, webpack cli有问题,头有点大了,google 一下,发现一个命令。讨论这个命令的文章,可以了解一下。运行以后终于出现了期待已久的。_npm install 忽略依赖
文章浏览阅读8k次,点赞3次,收藏12次。从这篇文章得到启发先定义一个组件从外部接收Template,然后在组件里调用<template > <div ref="markedContent"></div></template><script>import Vue from 'vue/dist/vue.esm.js'export default { name: 'wf-marked-content', props: ['content'], mounte.._vue components 动态传入模板
文章浏览阅读5.4k次。参考上一篇知识开发的一个功能,制作一个打印模板的管理模块,如下(就是保存froala编辑后的html文本,其中包括Vue的Template,这样我们可以利用Vue的模板的优势来动态绑定一些数据源进行HTML的打印,基本上跟过去水晶报表做一个模板再绑定数据源的方法异曲同工)在 main.js 里引用 froala 组件// Import and use Vue Froala lib.import VueFroala from 'vue-froala-wysiwyg'// 引入 Fr.._vue设计网页打印模板
文章浏览阅读992次。计划是这样,公司的项目一直在持续改动,安装包总是需要频繁生成新的,由此我想到了"持续集成"!有自动化工具不用,岂不可惜?这周的主要时间就用来学习CruiseControl.Net全面实现持续集成_怎么在vue的 script部分使用 eldigloa
文章浏览阅读1.2k次。其实Element UI 只用了文字提示的 el-tooltip 组件,不喜欢可以去掉,不记得是从哪拿到的原始代码,我给加了高亮渐变显示,图标,和拖拽时只能拖拽图标的位置,效果如上图,可以水平方向拖动,也可以垂直方向拖动。样式是less写的,css写嵌套样式太繁琐了。拿来主义,改造有理!下面贴代码<template> <div ref="splitPane" class="split-pane" :class="direction" :"{ fl..._element ui拉条样式
文章浏览阅读953次,点赞2次,收藏2次。接上一篇,这次加入的是从x-speadsheet导出Excel,并且带有x-speadsheet中的样式,重点关注 exportExcel 这个方法,我加入了 tinycolor 这个库用来翻译颜色值,值得注意的是, exceljs的颜色值是 argb 不是 rgba,一定不要弄混了a 是代表的透明度放在最前面_x-data-spreadsheet 导出
文章浏览阅读5.5k次,点赞2次,收藏21次。尝试了两个连线库 jsplumb 和 leadline ,其实两个库都很强大,但是基于个人使用的习惯,决定还是用 leadline ,在Vue 下我使用它的一个包装库 leader-line-vue 下面是上图的连接线示例代码,连接线很轻松的就实现了一个渐变效果..._vue 连线
文章浏览阅读4.2k次,点赞2次,收藏5次。首先官网推荐的安装方法没有生成dist文件,导致样式表等这些文件并没有生成npm install element-plus --save以上方法是有问题的,如果不幸执行了上面的命令,那么先执行卸载npm uninstall element-plus删除 main.js文件对element ui的引用,输入以下命令vue add element-plus..._elementui3.0
文章浏览阅读3.1k次。如上图,下面贴代码<template> <div> <el-date-picker size="large" style ="width:120px" v-model="selectYear" format="yyyy 年" value-format="yyyy" type="year" :clearable = "false" placeholder="选择年">.._vue多选周
文章浏览阅读1.8k次,点赞6次,收藏6次。经过 2021年的一个春节,从年前到现在,大致撸出一个 甘特图,进度条是用SVG画的,使用了几个工具库 (interactjs 用来处理拖拽和修改尺寸,snap.svg 用来处理 svg 的dom 操作,moment.js用来处理时间的操作),其他没有依赖任何的UI组件,目前初见雏形,还比较粗糙,后面会不断更新源码地址点击期间也摸索了怎么把vs code的项目上传到 GitHub 上面进行源代码的管理,基本上是参考的这篇文章做的..._vue gantt demo
文章浏览阅读2.1k次。接上两篇vue 下使用 exceljs + x-spreadsheet 带样式导入Excelvue 下使用 exceljs + x-spreadsheet 带样式导出Excel下面封装好一个组件调用组件的页面效果如图,目前“导出Json”还没有做_x-spreadsheet导入导出