动态中国城市疫情地图的实现,主要是参照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 = rejectdocument.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"));},

关于百度地图河流道路城市等样式的调节均可在option的bmap中调节,我设置的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数据的形式是这样的:

所有的城市数据都在list中item.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的城市,这边写的是静态的,将前五的数据放在数组中,然后将其添加给option中series的第二块数据,再在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,},

最终的代码布局长这样:

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

  1. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划

    2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划 开发前配置,显示基本地图,实时定位等查看之前代码,此博客紧接上一博客:https://blog.csdn.ne ...

  2. 超详细的Android百度地图开发:在APP上定位并显示出来

    超详细的Android百度地图开发:在APP上定位并显示出来 一 写在前面 二 注册百度开发者账户.申请API KEY 三.代码实现 四.问题 五.总结 一 写在前面 由于项目所需,我需要在手机APP ...

  3. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(6) POI检索, 根据地址输入提示检索 Sug

    POI检索, 根据地址输入提示检索 Sug 参考百度地图官方文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/search/sug ...

  4. 超详细版本vue+capacitor(自定义capacitor插件)编写移动端应用

    人生苦短,我们要: 我的环境 Node v16.13.0 npm v8.1.0 mac的话需要安装Xcode windows的话需要Java 8 JDK和Android Studio软件 本文以安卓开 ...

  5. 超详细的Vue渲染原理讲解

    目录 一.Vue简介 1. MVVM.MVP和MVC 2. Vue的基本配置 二.Vue渲染原理 1. HTML与模板 2. Vue组件的完整渲染过程 (1). Vue自身的初始化阶段 (2). 组件 ...

  6. 动态实现全国疫情地图

    通过Vue实现全国疫情地图 先上效果图!! 在这个小DEMO中,使用到获取肺炎感染人数的api接口是: http://interface.sina.cn/news/wap/fymap2020_data ...

  7. android studio百度地图教程,Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(4) 路线规划之起始点地址输入实现规划...

    实现起始点输入的路线规划 要实现输入起始点的路线规划,需要两个输入框,可以将两个输入框设置在和地图同一个Activity中,也可以新建一个Activity,来实现地址的输入,然后通过页面之间的跳转来传 ...

  8. 超详细的Python matplotlib 绘制动态图

    复习回顾 在matplotlib模块中我们前面学习绘制如折线.柱状.散点.直方图等静态图形.我们都知道在matplotlib模块主要有三层脚本层为用户提供快捷的绘制图形方法,美工层接收到脚本层的命令后 ...

  9. 成功案例超详细-vs2019 opencv qt创建动态库被C#调用

    之前有个项目关于图像处理,既用到了opencv,还二次开发了相机提供的动态库.一开始我是用QT写的,然后发现人家只需要我提供一个库函数调用就可以了,但是他是用C#写的.没办法,到处找资料,但是没有找到 ...

最新文章

  1. re.findall()用法详解
  2. 从零开始实现一个简易的Java MVC框架(六)--加强AOP功能
  3. 大数据风控之贷前调查必知的十大客户信息
  4. 问题 | 执行pip install --upgrade --ignore-installed tensorflow出现Cannot open\Scripts\pip-script.py
  5. linux powerdns服务器搭建,开源DNS服务器 PowerDNS
  6. pagefooter如何不占位置_小卫生间如何装修?照着小浴室装修效果图这样装
  7. 项目中使用CLR编程
  8. MSDN 教程短片 WPF 20(绑定3-ObjectDataProvider)
  9. linux服务占用的真实内存,为什么TOP看不出真实的内存占用情况?
  10. 我开发的内部ORM(一)数据库组件
  11. PyTorch1.2安装(Anaconda3 + Python3.6 + cpu版本)
  12. Zabbix 微信报警Python版(带监控项波动图片)
  13. 飞鸽传书2007绿色版还需要遵循些基本的原则
  14. 燕山大学联通新卡绑定校园网
  15. C++中switch用法的意义
  16. 几种常用的power bi 图表怎么做
  17. 统计学知识大梳理(三)
  18. 使用Node.js express 开发上传文件/图片api接口
  19. PTA:一帮一(C语言)
  20. 本月(2019年8月)算法工程师一二线城市工资,杭州,广州,宁波,合肥半年涨幅在500元以上

热门文章

  1. epub格式电子书剖析
  2. 什么是真正的架构设计?某厂十年Java经验让我总结出了这些,不愧是我
  3. 更换移动硬盘显示图标
  4. 2020年6月六级真题翻译:青藏铁路
  5. 《Wireshark数据包分析实战(第2版)》目录—导读
  6. java md5加密 jar包_BeanShell调用自己写的jar包进行MD5加密
  7. 如何画出diffusion models的扩散过程示意图?
  8. windows 服务器使用量高导致网络异常
  9. C# MVC《捷信达酒店管理系统》项目研发技术总结文献
  10. Magic Firewall 简介