ECharts5 实现地图旅行足迹标记

《ECharts5 实现掘金数据中心折线图》中介绍了如何使用 ECharts(5.4版本)制作折线图,今天我将通过 ECharts 来实现一个中国地图,并且可以点击标记曾经去过的省份或地区。

注册地图

实现地图和折线图的基本步骤类似,这里直接讲不同点,就是在 setOption 之前,需要使用 echarts.registerMap 注册地图:

javascript 复制代码
echarts.registerMap('china', china_geojosn)

china_geojosn 为 GeoJSON 格式的数据:

获取 GeoJSON

GeoJSON 是一种用于编码各种地理数据结构的格式。我们可以从一些网站去获取对应地区的 GeoJSON:

我定义的 china_geojosn 的数据就是在该网站点击如下图箭头所示的按钮复制得到的:

里面有中国各个省份的 GeoJSON 数据:

直接使用 js 文件

可以看到,除了有提供 geojson 数据,还有直接提供 js 文件的,比如我下载了 china.js,其内容大概如下:

javascript 复制代码
!(function (e, t) {
  'function' == typeof define && define.amd
    ? define(['exports', 'echarts'], t)
    : 'object' == typeof exports && 'string' != typeof exports.nodeName
    ? t(exports, require('echarts'))
    : t({}, e.echarts)
})(this, function (e, t) {
  var o = function (e) {
    'undefined' != typeof console &&
      console &&
      console.error &&
      console.error(e)
  }
  t
    ? t.registerMap
    ? t.registerMap('china', {
      // geoJSON
    })
    : o('ECharts Map is not loaded')
    : o('ECharts is not Loaded')
})

这是一个立即执行的函数表达式 !(function() {})(),我对其中的代码做些解释:

  • 执行函数首先会执行 'function' == typeof define && define.amd, 用于检查当前环境是否支持 AMD (Asynchronous Module Definition) 模块定义方式,像我们直接新建了个简单的 html 文件做的小练习显然是不支持的;
  • 继而就会执行 'object' == typeof exports && 'string' != typeof exports.nodeName,检查了 exports 对象的类型以及它的 nodeName 属性,目的在于判断当前环境是否是 Node.js,我们直接在浏览器运行 html 文件,所以返回的还是 false
  • 那么就会执行 t({}, e.echarts)t 就是传给立即执行函数的第 2 个参数:

e 就是 this,此处指向 window。也就是说该 js 文件最终执行的函数就是上图中虚线所示的函数,参数为 {}window.echarts,执行的目的就是通过 echarts.registerMap 注册了名为 'china' 的地图,所以如果我们直接引入的是 js 文件,那么就不需要再自己写一遍注册地图的代码了。

配置 option

有 2 种方式可以配置制作地图:

  1. 同制作折线图一样配置 serise
javascript 复制代码
const option = {
  series: [
    {
      type: 'map',
      map: 'china'
    }
  ]
}
  1. 我采用的方式是配置 geo 对象,geo.map 的值即为 registerMap 传入的第 1 个参数,也就是地图的名字:
javascript 复制代码
const option = {
  geo: {
    map: 'china'
  }
}

这样我们就能得到一个中国地图了:

默认样式

我们修改一下地图的默认颜色,并让地图可以通过鼠标缩放与移动:

javascript 复制代码
const option = {
  geo: {
    map: 'china',
    roam: true, // 鼠标控制缩放和移动
    itemStyle: {
      areaColor: '#092D3D', // 暗蓝色
      borderColor: '#337AB7' // 浅蓝色
    }
  }
}

现在实现的地图效果如下:

高亮样式

接着通过 geo.emphasis 调整鼠标悬浮时的高亮配置:

javascript 复制代码
const option = {
        geo: {
          // ...
          emphasis: {
            itemStyle: {
              areaColor: '#B03A5B', // 酒红色
              borderColor: '#fff'
            },
            label: {
              fontSize: 8,
              color: '#FAC858' // 黄色
            }
          }
        }
      }

让高亮时的区域颜色改为酒红色,区域边界改为白色,标签改为黄色:

选中样式

geo.selectedMode'multiple' 使得地图变为支持多选的模式,然后通过 geo.select 配置选中时的区域样式即可:

javascript 复制代码
const option = {
  geo: {
    selectedMode: 'multiple', // 支持多选
    select: {
      itemStyle: {
        areaColor: '#B03A5B', // 酒红色
        borderColor: '#fff'
      },
      label: {
        show: false
      }
    }
  }
}

相关推荐
想你的风吹到了瑞士5 分钟前
变量提升&函数提升
前端·javascript·vue.js
生椰拿铁You17 分钟前
12 —— Webpack中向前端注入环境变量
前端
Huazzi.1 小时前
免费好用的静态网页托管平台全面对比介绍
前端·网络·github·web
吃土少女古拉拉1 小时前
前端和后端
前端·学习笔记
寒雒2 小时前
【Python】实战:实现GUI登录界面
开发语言·前端·python
独上归州2 小时前
Vue与React的Suspense组件对比
前端·vue.js·react.js·suspense
Komorebi⁼2 小时前
Vue核心特性解析(内含实践项目:设置购物车)
前端·javascript·vue.js·html·html5
明月清风徐徐2 小时前
Vue实训---0-完成Vue开发环境的搭建
前端·javascript·vue.js
SameX2 小时前
HarmonyOS Next 企业数据备份与恢复策略
前端·harmonyos
SameX2 小时前
HarmonyOS Next 企业数据传输安全策略
前端·harmonyos