使用Vue3和Echarts 5绘制带有立体感流线中国地图(推荐收藏!)

目录
  • 本文绘制的地图效果图如下:
  • 一、Echarts 使用五部曲
    • 1、下载并引入 echarts
    • 2、准备容器
    • 3、实例化 echarts 对象
    • 4、指定配置项和数据
    • 5、给 echarts 对象设置配置项
  • 二、开始绘制流线中国地图
    • 第一步:先绘制一个中国地图
    • 第二步:添加流线
    • 第三步:添加立体投影
  • 总结

本文绘制的地图效果图如下:

一、Echarts 使用五部曲

1、下载并引入 echarts

Echarts 已更新到了 5.0 版本,安装完记得检查下自己的版本是否是 5.0 。

npm install echarts --save

下载地图的 json 数据

可以下载中国以及各个省份地图数据。免费的文件下载地址:

http://datav.aliyun.com/portal/school/atlas/area_selector#&lat=30.332329214580188&lng=106.72278672066881&zoom=3.5

记得收藏哦!免得浪费加班时间。

引入:

import * as echarts from "echarts"
import chinaJSON from '../../assets/json/china.json'

2、准备容器

给元素定义宽高确定的容器用来装地图。

<template>
 <div id="chinaMap"></div>
</template>

3、实例化 echarts 对象

import * as echarts from 'echarts'
import chinaJson from '../../assets/json/china.json'
var myChart = echarts.init(document.getElementById('chinaMap'))
// 创建了一个 myChart 对象

4、指定配置项和数据

var option = {
 // 存放需要绘制图片类型,以及样式设置
}

5、给 echarts 对象设置配置项

myChart.setOption(option)

就这么简单几步还用你告诉我吗?不瞒你说,官网也有这东东。虽然这些你都知道,但是并不影响你还是不知道流线图是怎么绘制出来的。下面我们看看是如何绘制的。

二、开始绘制流线中国地图

第一步:先绘制一个中国地图

import * as echarts from 'echarts'
import chinaJson from '../../assets/json/china.json'
import { onMounted, ref } from 'vue'
const chinaMap = ref()
onMounted(() => {
 drawChina()
})
function drawChina() {
 var myChart = echarts.init(chinaMap.value)
 echarts.registerMap('china', chinaJson) //注册可用的地图
 var option = {
  geo: {
   show: true,
   //设置中心点
   center: [105.194115019531, 35.582111640625],
   map: 'china',
   roam: true, //是否允许缩放,拖拽
   zoom: 1, //初始化大小
   //缩放大小限制
   scaleLimit: {
    min: 0.1, //最小
    max: 12, //最大
   },
   //各个省份模块样式设置
   itemStyle: {
    normal: {
     areaColor: '#3352c7',//背景色
     color: 'red',//字体颜色
     borderColor: '#5e84fd',
     borderWidth: 2,
    },
   },
   //高亮状态
   emphasis: {
    itemStyle: {
     areaColor: '#ffc601',
    },
    label: {
     show: true,
     color: '#fff',
    },
   },
   // 显示层级
   z: 10,
  },
 }
 myChart.setOption(option)
}

一个简单的地图就绘制好了,继续研究如何添加流线。

第二步:添加流线

通过 series 属性来设置发色点的样式,接受点的样式,以及线条和线条上的动画。

设置 series 的值:

// 中国地理坐标图
var chinaGeoCoordMap: Object = {
 西安: [108.906866, 34.162109],
 拉萨: [91.140856, 29.645554],
}
//发射点
var chinaDatas = [
 [
  {
   name: '拉萨',
   value: 2,
  },
 ],
]
//投射点
const scatterPos = [108.906866, 34.162109]
// 数据转换
var convertData = function (data: any) {
 var res = []
 for (var i = 0; i < data.length; i++) {
  var dataItem = data[i]
  var fromCoord = chinaGeoCoordMap[dataItem[0].name]
  var toCoord = scatterPos
  if (fromCoord && toCoord) {
   res.push([
    {
     coord: fromCoord,
     value: dataItem[0].value,
    },
    {
     coord: toCoord,
     },
    ])
  }
 }
 return res
}

var series: Array<any> = []
;[['西安', chinaDatas]].forEach(function (item, i) {
 series.push(
  //设置指向箭头信息
  {
   type: 'lines',
   zlevel: 2,
   effect: {
    show: true,
    period: 4, //箭头指向速度,值越小速度越快
    trailLength: 0.02, //特效尾迹长度[0,1]值越大,尾迹越长重
    symbol: 'arrow', //箭头图标
    symbolSize: 8, //图标大小
   },
   lineStyle: {
    normal: {
     color: '#adffd0',
     width: 1, //尾迹线条宽度
     opacity: 1, //尾迹线条透明度
     curveness: 0.3, //尾迹线条曲直度
    },
   },
   data: convertData(item[1]),
  },
 // 发射点位置涟漪等效果
 {
  type: 'effectScatter',
  coordinateSystem: 'geo',
  zlevel: 2,
  rippleEffect: {
  //涟漪特效
  period: 4, //动画时间,值越小速度越快
  brushType: 'stroke', //波纹绘制方式 stroke, fill
  scale: 4, //波纹圆环最大限制,值越大波纹越大
  },
  label: {
   normal: {
   show: true,
   position: 'right', //显示位置
   offset: [5, 0], //偏移设置
   formatter: function (params) {
    //圆环显示文字
    return params.data.name
   },
   fontSize: 13,
  },
  emphasis: {
   show: true,
  },
 },
 symbol: 'circle',
 symbolSize: function (val: Array<any>) {
  return 5 + val[2] * 5 //圆环大小
 },
 itemStyle: {
 normal: {
  show: false,
  color: '#f8f9f5',
  },
 },
 data: item[1].map(function (dataItem: any) {
  return {
   name: dataItem[0].name,
   value: chinaGeoCoordMap[dataItem[0].name].concat([dataItem[0].value]),
   }
  }),
 },
 //被攻击点
 {
  type: 'effectScatter',
  coordinateSystem: 'geo',
  zlevel: 2,
  rippleEffect: {
   //涟漪相关
   period: 2,
   brushType: 'stroke',
   scale: 5,
   },
  label: {
   normal: {
    show: true,
    position: 'right',
    color: '#0f0',
    formatter: '{b}',
    textStyle: {
     color: '#fff',
     fontSize: 12,
     },
    },
    emphasis: {
     show: true,
     color: '#f60',
    },
   },
   itemStyle: {
    normal: {
    color: '#f00',
   },
  },
  symbol: 'circle',
  symbolSize: 10, //圆圈大小
  data: [
   {
    name: item[0],
    value: chinaGeoCoordMap[item[0]].concat([10]),
    },
   ],
  },
 )
})

给上边的 option 添加 series 属性。

第三步:添加立体投影

添加立体投影的时候,由于并没有这样的属性,所以需要通过设置边框投影,再加一个偏移。

实现原理:绘制两个地图,设置中心点是一样的,然后一个设置边框投影+偏移,它的层级设置小一点,上边再绘制一个地图不设置投影,这样就能够实现上述效果。

// series 添加一个对象,绘制新地图
{
 //绘制一个新地图
 type: 'map',
 map: 'china',
 zoom: 1,
 center: [105.194115019531, 35.582111640625],
 z: -1,
 aspectScale: 0.75, //
 itemStyle: {
  normal: {
   areaColor: '#f00',
   borderColor: '#090438',
   borderWidth: '2',
   shadowColor: '#090438',
   shadowOffsetX: 0,
   shadowOffsetY: 15,
   },
 },
}

上述效果的完整源码:

<template>
  <div>
    首页
    <div
      ref="chinaMap"
      class="chinaMap"
      style="
        height: 800px;
        border: solid 1px red;
        width: 100%;
        background: #0b0873;
      "
    >
      地图1
    </div>
  </div>
</template>
<style scoped>
.chinaMap {
  transform: rotate3d(1, 0, 0, 35deg);
}
</style>
<script lang="ts" setup>
import * as echarts from 'echarts'
import chinaJson from '../../assets/json/china.json'
import { onMounted, ref } from 'vue'
const chinaMap = ref()
onMounted(() => {
  drawChina()
})
/**************************** series start ************************************/
//中国地理坐标图
var chinaGeoCoordMap: Object = {
  西安: [108.906866, 34.162109],
  柯桥区: [120.476075, 30.078038],
  拉萨: [91.140856, 29.645554],
  沈阳: [123.431474, 41.805698],
  新疆: [87.627704, 43.793026],
  台湾: [121.508903, 25.044319],
}
var chinaDatas = [
  [
    {
      name: '柯桥区',
      value: 0,
    },
  ],
  [
    {
      name: '拉萨',
      value: 2,
    },
  ],
  [
    {
      name: '沈阳',
      value: 1,
    },
  ],
  [
    {
      name: '新疆',
      value: 1,
    },
  ],
  [
    {
      name: '台湾',
      value: 1,
    },
  ],
]
//设置投射点
const scatterPos = [108.906866, 34.162109]

var convertData = function (data: any) {
  var res = []
  for (var i = 0; i < data.length; i++) {
    var dataItem = data[i]
    var fromCoord = chinaGeoCoordMap[dataItem[0].name]
    var toCoord = scatterPos
    if (fromCoord && toCoord) {
      res.push([
        {
          coord: fromCoord,
          value: dataItem[0].value,
        },
        {
          coord: toCoord,
        },
      ])
    }
  }
  console.log('res', res)
  return res
}

var series: Array<any> = []
;[['西安', chinaDatas]].forEach(function (item, i) {
  console.log(item, item[0])
  series.push(
    {
      //绘制一个新地图
      type: 'map',
      map: 'china',
      zoom: 1,
      center: [105.194115019531, 35.582111640625],
      z: -1,
      aspectScale: 0.75, //
      itemStyle: {
        normal: {
          areaColor: '#f00',
          borderColor: '#090438',
          borderWidth: '2',
          shadowColor: '#090438',
          shadowOffsetX: 0,
          shadowOffsetY: 15,
        },
      },
    },
    //设置指向箭头信息
    {
      type: 'lines',
      zlevel: 2,
      effect: {
        show: true,
        period: 4, //箭头指向速度,值越小速度越快
        trailLength: 0.02, //特效尾迹长度[0,1]值越大,尾迹越长重
        symbol: 'arrow', //箭头图标
        symbolSize: 8, //图标大小
      },
      lineStyle: {
        normal: {
          color: '#adffd0',
          width: 1, //尾迹线条宽度
          opacity: 1, //尾迹线条透明度
          curveness: 0.3, //尾迹线条曲直度
        },
      },
      data: convertData(item[1]),
    },
    // 发射点位置涟漪等效果
    {
      type: 'effectScatter',
      coordinateSystem: 'geo',
      zlevel: 2,
      rippleEffect: {
        //涟漪特效
        period: 4, //动画时间,值越小速度越快
        brushType: 'stroke', //波纹绘制方式 stroke, fill
        scale: 4, //波纹圆环最大限制,值越大波纹越大
      },
      label: {
        normal: {
          show: true,
          position: 'right', //显示位置
          offset: [5, 0], //偏移设置
          formatter: function (params) {
            //圆环显示文字
            return params.data.name
          },
          fontSize: 13,
        },
        emphasis: {
          show: true,
        },
      },
      symbol: 'circle',
      symbolSize: function (val: Array<any>) {
        return 5 + val[2] * 5 //圆环大小
      },
      itemStyle: {
        normal: {
          show: false,
          color: '#f8f9f5',
        },
      },
      data: item[1].map(function (dataItem: any) {
        return {
          name: dataItem[0].name,
          value: chinaGeoCoordMap[dataItem[0].name].concat([dataItem[0].value]),
        }
      }),
    },
    //被攻击点
    {
      type: 'effectScatter',
      coordinateSystem: 'geo',
      zlevel: 2,
      rippleEffect: {
        //涟漪相关
        period: 2,
        brushType: 'stroke',
        scale: 5,
      },
      label: {
        normal: {
          show: true,
          position: 'right',
          // offset:[5, 0],
          color: '#0f0',
          formatter: '{b}',
          textStyle: {
            color: '#fff',
            fontSize: 12,
          },
        },
        emphasis: {
          show: true,
          color: '#f60',
        },
      },
      itemStyle: {
        normal: {
          color: '#f00',
        },
      },
      symbol: 'circle',
      symbolSize: 10, //圆圈大小
      data: [
        {
          name: item[0],
          value: chinaGeoCoordMap[item[0]].concat([10]),
        },
      ],
    },
  )
})

/****************************************************************/
function drawChina() {
  var myChart = echarts.init(chinaMap.value)
  echarts.registerMap('china', chinaJson) //注册可用的地图
  var option = {
    tooltip: {
      trigger: 'item',
      backgroundColor: 'rgba(166, 200, 76, 0.82)',
      borderColor: '#FFFFCC',
      showDelay: 0,
      hideDelay: 0,
      enterable: true,
      transitionDuration: 0,
      extraCssText: 'z-index:100',
      formatter: function (params, ticket, callback) {
        //根据业务自己拓展要显示的内容
        var res = ''
        var name = params.name
        var value = params.value[params.seriesIndex + 1]
        res = "<span style='color:#fff;'>" + name + '</span>
数据:' + value
        return res
      },
    },
    geo: {
      show: true,
      center: [105.194115019531, 35.582111640625],
      map: 'china',
      roam: true, //是否允许缩放,拖拽
      zoom: 1, //初始化大小
      //缩放大小限制
      scaleLimit: {
        min: 0.1, //最小
        max: 12, //最大
      },
      //设置中心点
      //center: [95.97, 29.71],
      //省份地图添加背景
      //regions: regions,
      itemStyle: {
        normal: {
          areaColor: '#3352c7',
          color: 'red',
          borderColor: '#5e84fd',
          borderWidth: 2,
        },
      },
      label: {
        color: 'rgba(255,255,255,0.5)',
        show: false,
      },
      //高亮状态
      emphasis: {
        itemStyle: {
          areaColor: '#ffc601',
        },
        label: {
          show: true,
          color: '#fff',
        },
      },
      z: 10,
    },
    //配置属性
    series: series,
  }
  myChart.setOption(option)
}
</script>

总结

到此这篇关于使用Vue3和Echarts 5绘制带有立体感流线中国地图的文章就介绍到这了,更多相关Vue3 Echarts5绘制中国地图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能

    随着前端技术的飞速发展,大数据时代的来临,我们在开发项目时越来越多的客户会要求我们做一个数据展示的大屏,可以直观的展示用户想要的数据,同时炫酷的界面也会深受客户的喜欢. 大屏展示其实就是一堆的图表能够让人一目了然地看到该系统下的一些基本数据信息的汇总,也会有一些实时数据刷新,信息预警之类的.笔者在之前也做过一些大屏类的数据展示,但是由于都是一些图表类的,觉得没什么可说的,加之数据也都牵扯到公司,所以没有沉淀下来什么. 最近有朋友要做一个大屏,问了自己一个问题,自己也刚好做了一个简单的大屏数据展示

  • vue+echarts5实现中国地图的示例代码

    使用echarts5.0版本实现中国地图,E charts在5.0版本之后,地图不能直接引入了,需要自己去下载. 地图文件下载地址:下载地址(http://datav.aliyun.com/portal/school/atlas/area_selector#&lat=30.772340792178525&lng=103.94573258937584&zoom=9.5) 注意: 将下载后的json文件放置/public目录下 map类型的地图 <template> <

  • vue+echarts实现中国地图流动效果(步骤详解)

    @vue+echarts实现中国地图流动效果 #话不多说看效果图 操作步骤: 执行命令:npm run echarts -s 并回车 看到这样的提示代表安装成功 PS:网络不好的情况建议用cnpm淘宝镜像(全局终端执行命令:npm i -g cnpm --registry=https://registry.npm.taobao.org) 下载china.js 链接: https://pan.baidu.com/s/1EODVh9tJNEbFebbrhKyd_Q 提取码: gjz4 引入 impo

  • vue 使用 echarts 绘制中国地图的实现代码

    1. 插入echarts 所需模块 import echarts from "echarts"; import 'echarts/map/js/china' // 使用中国地图需把China.js文件引入 2. 正式代码部分 //初始化echarts实例 通过传参获取要放置的id名称 var myChart = echarts.init(document.getElementById("容器的id名称")); // 指定图表的配置项和数据 var optionMap

  • vue+vuex+axios+echarts画一个动态更新的中国地图的方法

    本文介绍了vue+vuex+axios+echarts画一个动态更新的中国地图的方法,分享给大家,具体如下: 一. 生成项目及安装插件 # 安装vue-cli npm install vue-cli -g # 初始化项目 vue init webpack china-map # 切到目录下 cd china-map # 安装项目依赖 npm install # 安装 vuex npm install vuex --save # 安装 axios npm install axios --save

  • Vue+ECharts实现中国地图的绘制及各省份自动轮播高亮显示

    目录 实现效果 完整代码+详细注释 要点小结 实现效果 完整代码+详细注释 <template> <div class="echart"> <div class="content"> <div id="map_cn"></div> </div> </div> </template> <script> import echarts from

  • vue中echarts引入中国地图的案例

    如下所示: <div id="myChartChina" :style="{width: '100%', height: '500px'}"></div> mounted() { this.drawLine(); }, drawLine(){ // 基于准备好的dom,初始化echarts实例 var myChartContainer = document.getElementById('myChartChina'); var resizeM

  • 使用Vue3和Echarts 5绘制带有立体感流线中国地图(推荐收藏!)

    目录 本文绘制的地图效果图如下: 一.Echarts 使用五部曲 1.下载并引入 echarts 2.准备容器 3.实例化 echarts 对象 4.指定配置项和数据 5.给 echarts 对象设置配置项 二.开始绘制流线中国地图 第一步:先绘制一个中国地图 第二步:添加流线 第三步:添加立体投影 总结 本文绘制的地图效果图如下: 一.Echarts 使用五部曲 1.下载并引入 echarts Echarts 已更新到了 5.0 版本,安装完记得检查下自己的版本是否是 5.0 . npm in

  • 基于vue3+antDesign2+echarts 实现雷达图效果

    目录 右上角时间选择器的实现 五角雷达图的绘制及数据渲染 右上角时间选择器的实现 修改ant组件样式 根据原型图,该选择器为月份时间选择器,使用a-month-picker,但原始的月份选择器样式与设计图不符,需要进行修改,修改有分为两部分:1.选择框:2.额外弹出的日历 选择框样式修改 修改ant组件时应避免全局修改,如使用less语法,对ant组件的修改应在该页面的class下 <style lang="less" > @vw: 19.2vw; @vh: 10.8vh;

  • Vue3中echarts无法缩放的问题及解决方案

    目录 前言 问题描述 官网示例正常 官网示例在本地缩放异常 灵光乍现 问题解决 前言 实际工作中,使用到vue和echarts技术.项目原来用的vue2+echarts4,后来更新到了vue3+echarts5,结果遇到echarts无法绽放的问题. 问题描述 官网示例正常 1.打开echarts官网示例:https://echarts.apache.org/examples/zh/editor.html?c=area-rainfall这个示例的缩放功能是正常的.如下图: 官网示例在本地缩放异常

  • JavaScript使用百度ECharts插件绘制饼图操作示例

    本文实例讲述了JavaScript使用百度ECharts插件绘制饼图操作.分享给大家供大家参考,具体如下: 百度ECharts是一款由百度前端团队开发与维护的,基于HTML5的开源JavaScript图表库.E是Enterprise的简称,意思是商业级数据图表. 本文简述使用ECharts绘制饼图(Pie Chart)的过程,下图为使用ECharts绘制的饼图实例. 首先需要在页面中新建<script>标签,引入符合AMD规范的加载器,如esl.js 关于AMD规范的详细介绍,可以参考阮一峰的

  • vue2 利用echarts 单独绘制省份的步骤

    第一步:先引入所需的第三方模块 import echarts from "echarts"; // 引入所需要的echarts模块 import "echarts/map/js/province/shanxi"; // 引入省份的js文件 import "echarts/map/json/province/shanxi.json"; // 引入省份的json文件 第二步:开始绘制 // 基于准备好的dom,初始化echarts实例 var myC

  • python绘制带有色块的折线图

    前言: 如果正在看文章的你,还不会绘制折线图,请前往本人的主页看如何使用matplotlib绘制折线图这篇文章,该文章会仔细而详尽的告诉你绘制折线图的方法.言归正传,给折线图加色块,算是折线图的附加内容.加一个函数就可以搞定.效果图如下所示: 绘制带有色块的折线图的一般步骤: 第一步:绘制出基础的折线图: 在绘制色块前,我们可以使用绘制折线图的一般操作,绘制出折线图做基础准备. 第二步:计算每个坐标点对应的上下界: 其实色块看起来就像该坐标点在y轴方向上下平移所得的线条在x轴方向拼接而成.在绘制

  • Flask框架利用Echarts实现绘制图形

    目录 实现绘制饼状图 实现绘制柱状图 实现绘制折线图 echarts是百度推出的一款开源的基于JavaScript的可视化图表库,该开发库目前发展非常不错,且支持各类图形的绘制可定制程度高,Echarts绘图库同样可以与Flask结合,前台使用echart绘图库进行图形的生成与展示,后台则是Flask通过render_template方法返回一串JSON数据集,前台收到后将其应用到绘图库上,实现动态展示Web服务日志状态功能. 如下演示案例中,将分别展示运用该绘图库如何前后端交互绘制(饼状图,柱

随机推荐