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
      }
    }
  }
}

相关推荐
有梦想的刺儿7 分钟前
webWorker基本用法
前端·javascript·vue.js
cy玩具28 分钟前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
qq_390161771 小时前
防抖函数--应用场景及示例
前端·javascript
枝上棉蛮1 小时前
GISBox VS ArcGIS:分别适用于大型和小型项目的两款GIS软件
arcgis·gis·数据可视化·数据处理·地理信息系统·gis工具箱·gisbox
John.liu_Test2 小时前
js下载excel示例demo
前端·javascript·excel
Yaml42 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
PleaSure乐事2 小时前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro
哟哟耶耶2 小时前
js-将JavaScript对象或值转换为JSON字符串 JSON.stringify(this.SelectDataListCourse)
前端·javascript·json
getaxiosluo2 小时前
react jsx基本语法,脚手架,父子传参,refs等详解
前端·vue.js·react.js·前端框架·hook·jsx
理想不理想v2 小时前
vue种ref跟reactive的区别?
前端·javascript·vue.js·webpack·前端框架·node.js·ecmascript