Echart图表之map

562 阅读4分钟

Echart 5.3.2

一、数据准备

let mapJSON = {}
/**
* 地图数据,可从高德地图中请求(中国地图的adCode:100000),数据格式需满足:
* mapJSON是Object格式,key必须是**features**,值是省市县地图数组数据
*/
mapJSON.features = [
    {
        geometry: Object,
        properties: Object,
        type: 'Feature'
    },
    ...
]

// 1. 渲染地图各个区域数据。渲染结果见图一
let seriesData = [
     {
         name: '北京市', // 必须字段,且key必须为name
         value: 3245.8, // 必须字段,且key必须为value,value必须为number类型
         adCode: 110000, // 自定义字段
         level: 'province', // 自定义字段
         tooltipPrice: '3254.80'
         ...
     }, {
         name: '天津市',
         value: 2145,
         adCode: 120000,
         level: 'province',
         tooltipPrice: '2145.00'
         ...
     }, 
     ...
 ]
 
 // 2. 地图叠加带涟漪特效动画的散点图效果。见图二
 let scatterData = [
     {
         name: '北京市', // 自定义字段
         value: [116.405285, 39.904989], // 必须字段,且key必须为value,value必须为[经度, 纬度]
         adCode: 110000, // 自定义字段
         level: 'province', // 自定义字段
         tooltipPrice: '3254.80'
         ...
     }, {
         name: '天津市',
         value: [117.19018239.125596],
         adCode: 120000,
         level: 'province',
         tooltipPrice: '2145.00'
         ...
     }, 
     ...
 ]
 
 // 3. 带有起点和终点信息的地图路径图,可用于地图上航线、路线的可视化。见图三
 let linesData = [
     {
        coords: [
          [117.190182, 39.125596], // 起始:天津
          [126.642464, 45.756967] // 结束:黑龙江
        ]
      },
      {
        coords: [
          [91.132212, 29.660361], // 起始:西藏
          [87.617733, 43.792818] // 结束:新疆
        ]
      },
      {
        coords: [
          [116.405285, 39.904989], // 起始:北京
          [102.712251, 25.040609] // 结束:云南
        ]
      },
      { ... }
 ]

图一

image.png

图二

image.png

图三

image.png

二、option配置

function renderMap(seriesData, scatterData, linesData, mapJSON) {
    /**
    * echarts.registerMap(mapName: string, geoJSON: Object | string, specialAreas?: Object)
    * 注意:需要显示【南海诸岛】的时候,mapName必须是china,不能China或是‘中国’,否则无法显示
    */
    echarts.registerMap('china', mapJSON)
    var options = {
        tooltip: {
          trigger: 'item',
          formatter: function (params) {
            const { name, tooltipPrice } = params.data
            let txtCon = `<div>
              ${name}<br />销售金额:${tooltipPrice} 元</div>`
            return txtCon
          }
        },
        // 视觉映射组件
        visualMap: {
          type: 'continuous', // 连续型
          // max = Math.max.apply(Math, seriesData.map(item => { return item.value }))
          min: 0, // 计算数据最小值
          max, // 计算数据最大值
          show: true, // 只控制映射组件是否展示,默认false。但视觉映射功能还存在
          text: ['高', '低'], // 映射组件的文本
          calculable: true, // 是否显示拖拽的手柄(手柄能拖拽调整选中的范围)
          realtime: true, // 拖拽手柄,是否实时更新。true拖拽时实时更新图表视图;false拖拽结束后才更新视图
          hoverLink: true, // 鼠标悬浮到visualMap组件上时,鼠标位置对应数值在图表中对应的图形元素会高亮显示
          precision: 0, // 数据的小数点精度,默认0,即无小数点
          seriesIndex: [0], // series.data哪个系列的值,默认取所有
          // 定义选中范围中的视觉元素(用户可以和visualMap组件交互,用鼠标或触摸选择范围),地图区域的颜色
          inRange: {
            color: ['#1bdbfc', '#434fe7']
          }
        },
        geo: {
          show: true, // 地理坐标系组件(是否显示地图)
          map: 'china', // 地图名称,与registerMap的mapName保持一致
          roam: 'move', // 是否开启鼠标平移和缩放,可以设置成‘scale’或‘move’。设置成true为都开启
          top: 30, // 组件距离容器上方的距离
          zoom: 1.2, // 缩放比例
          layoutCenter: ['30%', '50%'], // 定义地图中心在屏幕中的位置(与layoutSize结合使用才起作用)
          layoutSize: 100, // 地图大小(与layoutCenter结合使用才起作用)。设置layoutCenter和layoutSize后 `left/right/top/bottom/width/height` 值无效
          // 地图区域样式
          itemStyle: {
            borderColor: '#fff',
            borderWidth: 1
          },
          // 地图高亮下的设置
          emphasis: {
            disabled: false, // 是否关闭高亮状态
            label: {
                show: true,
                color: '#fff',
                fontSize: 12,
                ...
            },
            itemStyle: {
                borderWidth: 1.5,
                shadowBlur: 2,
                areaColor: '#ffac4d', // 鼠标经过的区域颜色
                ...
            }
          },
          // 在地图中为指定区域块设置(文字颜色等)样式
          regions: [
            {
              name: '南海诸岛',
              itemStyle: { color: '#bff1ff', borderColor: '#6be2ff' },
              label: {
                color: '#5d5d5d',
                fontSize: 9
                offset: [0, -18] // 文字偏移量
              }
            },
            {
              name: '北京市',
              itemStyle: { color: '#000', borderColor: '#fff' },
              label: {
                color: '#5d5d5d',
                fontSize: 12
              }
            }, 
            { ... }
          ],
          label: {
            show: true, // 地图区域内的文字
            color: '#fff',
            fontSize: 9,
            formatter: function(params) {
              const nameMap = {
                内蒙古自治区: '内蒙古',
                西藏自治区: '西藏',
                ...
              }
              return nameMap[params.name]
            }
          }
        },
        series: [
          {
            type: 'map',
            name: '中国地图',
            map: 'china', // 与registerMap的mapName保持一致
            geoIndex: 0,
            hoverable: true, // 鼠标经过高亮
            data: seriesData,
            label: {
              show: false
            }
          },
          {
            type: 'effectScatter',
            name: '涟漪特效动画散点中国地图',
           
            coordinateSystem: 'geo', // geo地理坐标系
            silent: true, // 图形不响应和触发鼠标事件
            rippleEffect: {
              color: 'yellow',
              number: 3,
              brushType: 'fill'
            },
            // 图形的样式
            itemStyle: {
              color: 'red'
            },
             symbol: 'pin', // 标记的图形。string | Function。可选值有circle、rect、roundRect、triangle、diamond、pin、arrow、none、可通过'image://url'设置为图片,url为图片链接、也可通过'path://'矢量路径
             // 标记图形大小
             symbolSize: function (value, { name, data }) {
              if (data.salesAmountVal == max && ['新疆维吾尔自治区', '西藏自治区'].includes(name)) {
                return 22
              }
              return 10
            },
            data: scatterData,
            showEffectOn: 'render' // 何时显示特效。render绘制完成后显示特效;emphasis高亮时显示特效
          },
          {
            type: 'lines',
            zlevel: 2, // 路径所有图形的zlevel值
            // 路径线的特效配置
            effect: {
              show: true,
              period: 4, // 箭头指向速度,值越小速度越快
              trailLength: 0.4, // 特效尾迹长度[0,1]值越大,尾迹越长重
              symbol: 'arrow', // 箭头图标
              symbolSize: 5 // 图标大小
            },
            // 路径线的样式配置
            lineStyle: {
                color: 'green',
                width: 1, // 路径线条宽度
                opacity: 0.1, //路径线条透明度,0到1,为0不绘制
                curveness: 0.5 // 路径线的曲度。0到1,值越大曲度越大
            },
            label: { ... },
            emphasis: { ... },
            data: linesData
          }
        ]
    }
    // instanceChart是echarts.init(this.$refs['domChart'])的实例
    instanceChart.setOption(options, true)
}