[超详细]Echarts+vue+百度地图 动态实现城市疫情地图

动态中国城市疫情地图的实现,主要是参照Echarts官网官方案例的方法:Examples - Apache ECharts ,但是官方给的案例数据都是静态写在Option的Data中的无法根据疫情实时变化而自动更新,所以我在此基础上使用了Jsonp访问疫情数据网站获取各城市实时数据。

先上效果图:

先在views文件夹下创建一个Vue文件Citys.vue,创建一个放地图的容器div

<template>
  <div id="chart-city" style="width: 60vw; height: 85vh"></div>
</template>

下载引入所有需要使用到的包,这里需要用到的是EchartsEcharts-glEcharts-stat,在终端使用npm分别下载引入就好。

import echarts from "echarts"; 
require("echarts/extension/bmap/bmap");
import "echarts-gl/dist/echarts-gl.min.js";
import "echarts-stat/dist/ecStat.min.js";
import "echarts/dist/echarts.min.js";
import "echarts/dist/extension/dataTool.min.js";

将所有你想要展示的城市的坐标点放在geoCoordMap,具体形式如下:

城市名:[经度,纬度] (注意经纬顺序不要搞错不然出不来!)

var geoCoordMap = {
  荆州: [112.239741, 30.335165],
  合肥: [117.17, 31.52],
  安庆: [117.02, 30.31],
            ...
}

引入百度地图:

由于项目需要使用百度地图,所以需要申请api,具体申请可以在这个网页申请百度地图开放平台,使用接口所需要的密钥就是创建应用后的AK,一键复制即可使用。

在src文件夹下创建一个map.js的文件,里面存放接百度地图接口的函数loadBMap()代码如下:

export function loadBMap(ak) {
    return new Promise(function(resolve, reject) {
        if (typeof BMap !== 'undefined') {
            resolve(BMap)
            return true
        }
        window.onBMapCallback = function() {
            resolve(BMap)
        }
        let script = document.createElement('script')
        script.type = 'text/javascript'
        script.src =
            'http://api.map.baidu.com/api?v=2.0&ak='+ ak +'&__ec_v__=20190126&callback=onBMapCallback'
        script.onerror = reject
        document.head.appendChild(script)
    })
}

Citys.vue中引用这个函数:

import { loadBMap } from "../map.js";

同时将其添加在mounted(),在加载百度地图后再对画的图进行初始化:

loadBMap("密钥内容").then(() => {
      this.init();
      this.getData();
    });

其中init函数的内容就是要通过id指定画图的元素,init()代码如下:

init() {
      this.myChart = echarts.init(document.getElementById("chart-city"));
    },

关于百度地图河流道路城市等样式的调节均可在optionbmap中调节,我设置的bmap属性如下

bmap: {
    center: [104.95, 37.57],
    zoom: 5,
    roam: true,
    mapStyle: {
      styleJson: [
        {
          featureType: "water",
          elementType: "all",
          stylers: {
            color: "#d1d1d1",
          },
        },
        {
          featureType: "land",
          elementType: "all",
          stylers: {
            color: "#f3f3f3",
          },
        },
        {
          featureType: "railway",
          elementType: "all",
          stylers: {
            visibility: "off",
          },
        },
        {
          featureType: "highway",
          elementType: "all",
          stylers: {
            color: "#fdfdfd",
          },
        },
        {
          featureType: "highway",
          elementType: "labels",
          stylers: {
            visibility: "off",
          },
        },
        {
          featureType: "arterial",
          elementType: "geometry",
          stylers: {
            color: "#fefefe",
          },
        },
        {
          featureType: "arterial",
          elementType: "geometry.fill",
          stylers: {
            color: "#fefefe",
          },
        },
        {
          featureType: "poi",
          elementType: "all",
          stylers: {
            visibility: "off",
          },
        },
        {
          featureType: "green",
          elementType: "all",
          stylers: {
            visibility: "off",
          },
        },
        {
          featureType: "subway",
          elementType: "all",
          stylers: {
            visibility: "off",
          },
        },
        {
          featureType: "manmade",
          elementType: "all",
          stylers: {
            color: "#d1d1d1",
          },
        },
        {
          featureType: "local",
          elementType: "all",
          stylers: {
            color: "#d1d1d1",
          },
        },
        {
          featureType: "arterial",
          elementType: "labels",
          stylers: {
            visibility: "off",
          },
        },
        {
          featureType: "boundary",
          elementType: "all",
          stylers: {
            color: "#d3d3d3",
          },
        },
        {
          featureType: "building",
          elementType: "all",
          stylers: {
            color: "#d1d1d1",
          },
        },
        {
          featureType: "label",
          elementType: "labels.text.fill",
          stylers: {
            color: "#999999",
          },
        },
      ],
    },
  },

设置好bmap后在option中的series中添加:

coordinateSystem: "bmap",

动态获取城市疫情数据:

关于获取疫情各城市的数据需要访问处理json数据,所以这里采用的是jsonp,在终端用npm下载引入即可

import jsonp from "jsonp";

可以发现,对新浪疫情数据网站网址访问返回的json数据的形式是这样的:

所有的城市数据都在listitem.city中,但由于存在地级市所以对list中的item的name也要全部获取到,所以最终getData()的代码如下

getData() {
      jsonp(
        "https://interface.sina.cn/news/wap/fymap2020_data.d.json?_=1585397547299",
        (err, data) => {
          console.log(data.data.list); 
          var citylist = new Array();
          var lists = data.data.list.map((item) => {
            var citys = item.city.map((items) => {
              return { name: items.name, value: items.conNum };
            });
            citys.forEach((element) => {
              citylist.push(element);
            });
            return { name: item.name, value: item.value };
          });
          lists.forEach((element) => {
            citylist.push(element);
          });
          option.series[0].data = convertData(citylist);
          this.myChart.setOption(option);
        }
      );
    }

这其中convertData()函数就是echarts官网给的案例中的,其功能是将获取到城市的疫情数据去与想要展现的坐标点的城市名遍历匹配,添加到value字段中,具体代码如下:

var convertData = function (data) {
  var res = [];
  for (var i = 0; i < data.length; i++) {
    var geoCoord = geoCoordMap[data[i].name];
    if (geoCoord) {
      res.push({
        name: data[i].name,
        value: geoCoord.concat(data[i].value),
      });
    }
  }
  return res;
};

根据以上步骤已经能够显示一张大小点一模一样的疫情地图了,为了让人数的多少更加直观,这里给symbolSize添加了对value累计确诊人数数值大小判断的函数,代码如下:

symbolSize: function (val) {
        if (val[2] > 12000) {
          return 35;
        }else if (val[2] > 2000 && val[2] <= 12000) {
          return 30;
        } else if (val[2] > 1133 && val[2] <= 2000) {
          return val[2] / 90;
        } else if (val[2] > 505 && val[2] <= 1133) {
          return val[2] / 70;
        } else if (val[2] > 200 && val[2] <= 505) {
          return val[2] / 35;
        } else if (val[2] > 0 && val[2] <= 200) {
          return val[2] / 15;
        }
      },

关于突出显示top5的城市,这边写的是静态的,将前五的数据放在数组中,然后将其添加给optionseries的第二块数据,再在series中设置突出的样式形态。

getData()中的数据附值:

var top5 = new Array(
            { name: "武汉", value: 50363 },
            { name: "荆州", value: 1580 },
            { name: "广州", value: 1133 },
            { name: "上海", value: 1987 },
            { name: "香港", value: 11770 }
          );
option.series[1].data = convertData(top5);

series中的样式设置:

{
      name: "Top 5",
      type: "effectScatter",
      coordinateSystem: "bmap",
      symbolSize: function (val) {
        if (val[2] > 10000) {
          return 35;
        } else if (val[2] > 1133 && val[2] <= 2000) {
          return val[2] / 90;
        } else if (val[2] > 505 && val[2] <= 1133) {
          return val[2] / 70;
        } else if (val[2] > 200 && val[2] <= 505) {
          return val[2] / 35;
        } else if (val[2] > 0 && val[2] <= 200) {
          return val[2] / 15;
        }
      },
      encode: {
        value: 2,
      },
      showEffectOn: "render",
      rippleEffect: {
        brushType: "stroke",
      },
      hoverAnimation: true,
      label: {
        formatter: "{b}",
        position: "bottom",
        show: true,
      },
      itemStyle: {
        color: "#660208",
        shadowBlur: 10,
        shadowColor: "#494949",
      },

      zlevel: 1,
    },

最终的代码布局长这样:

 

 

 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ECharts是一款基于JavaScript的开源可视化图表库,而Vue是一套用于构建用户界面的渐进式JavaScript框架。结合使用EChartsVue可以创建各种交互式的数据可视化图表。 一个常见的ECharts Vue案例是在Vue项目中使用ECharts来展示特定数据集的柱状图。以下是该案例的简要实现步骤: 1. 安装ECharts:使用npm或yarn命令在Vue项目中安装ECharts。例如,可以执行以下命令来安装ECharts: ``` npm install echarts --save ``` 2. 导入ECharts库:在需要使用EChartsVue组件中导入ECharts库。例如,可以在script标签中添加以下代码: ```javascript import echarts from 'echarts' ``` 3. 创建图表容器:在Vue组件中创建一个div元素作为图表的容器。例如,可以在template标签中添加以下代码: ```html <template> <div id="chartContainer"></div> </template> ``` 4. 初始化图表实例:在Vue组件的mounted生命周期钩子函数中通过ECharts初始化图表的实例。例如,可以在script标签中添加以下代码: ```javascript mounted() { const chartContainer = document.getElementById('chartContainer') const chart = echarts.init(chartContainer) } ``` 5. 配置图表选项:通过设置ECharts实例的option属性来配置图表的选项。例如,可以在mounted函数中添加以下代码: ```javascript mounted() { const chartContainer = document.getElementById('chartContainer') const chart = echarts.init(chartContainer) chart.setOption({ xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [{ data: [120, 200, 150, 80, 70, 110, 130], type: 'bar' }] }) } ``` 6. 渲染图表:通过调用ECharts实例的render方法将图表渲染到页面中。例如,可以在mounted函数中最后添加以下代码: ```javascript mounted() { const chartContainer = document.getElementById('chartContainer') const chart = echarts.init(chartContainer) chart.setOption({ // 配置图表选项 }) chart.render() } ``` 以上就是一个简单的ECharts Vue案例的实现步骤。通过按照以上步骤,可以在Vue项目中使用ECharts来展示各种类型的可视化图表,包括折线图、饼图、雷达图等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值