头歌(Educoder)——Vue基础——数据接口绘图

部署运行你感兴趣的模型镜像

目录

第1关:Vue+Echarts 实现数据接口绘制疫情地图

任务描述

相关知识

寻找数据接口

设置代理

发送请求提取数据

数据处理

海外疫情地图数据处理绘制

jsonp 方法

编程要求

测试说明

代码文件


第1关:Vue+Echarts 实现数据接口绘制疫情地图

任务描述

本关任务:编写一个完成 Vue+Echarts 使用数据接口绘制的地图的程序。

相关知识

为了完成本关任务,你需要掌握:

  1. 寻找数据接口;

  2. 设置代理;

  3. 发送请求提取数据;

  4. 数据处理;

  5. 海外疫情地图数据处理绘制;

  6. jsonp 方法。

寻找数据接口

http://interface.sina.cn/news/wap/fymap2020_data.d.json?_=1580892522427

大家打开这个链接就会看到我们的疫情数据,但是因为最近疫情数据都不继续更新了,所以数据可能不是实时的,也不影响。其次就是因为疫情地图的例子最为广泛,所以我们就以疫情数据地图为例,采用 Vue+Echarts 进行数据接口模式下的绘图。具体网页打开,我们可以看到数据如下:

设置代理

axios 请求这些数据如果出现跨域问题(之前的课程中讲到过),就设置本地代理,在根目录下创建 vue.config.js 文件:

 
  1. module.exports = {
  2. devServer: {
  3. proxy: {
  4. "/api": {
  5. target: "https://www.ncovchina.com/data",
  6. changeOrigin: true,
  7. pathRewrite: {
  8. "^/api": ""
  9. }
  10. },
  11. "/aki": {
  12. target: "http://api.fanyi.baidu.com/api/trans/vip",
  13. changeOrigin: true,
  14. pathRewrite: {
  15. "^/aki": ""
  16. }
  17. }
  18. },
  19. host: "0.0.0.0",
  20. port: 8083,
  21. clientLogLevel: "info"
  22. }
  23. };

api 是中国疫情网数据; aki 是百度翻译接口,但是本次不用,因为百度翻译标准版返回的不准,用的爱翻译的谷歌翻译。

发送请求提取数据

提取数据 axios.post(/api/getDisease.html)

获得数据:

国内疫情数据获取并提取:

 
  1. this.isLoading = true;
  2. axios.post(`/api/getDisease.html`).then(res => {
  3. let data = JSON.parse(res.data.data);
  4. console.log(data);
  5. let dss = data.areaTree[0].children;
  6. this.datas = dss;
  7. this.chinaTotal = data.chinaTotal.confirm;
  8. this.chinaAdd = data.chinaAdd.confirm;
  9. this.chinaNow = data.chinaTotal.nowConfirm;
  10. this.lastTime = data.lastUpdateTime;
  11. this.isLoading = false;
  12. });

分别提取了新增,总确诊,现存确诊在绘制中国疫情地图时需要

 
  1. axios
  2. .post(
  3. “https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist”
  4. )

获取海外疫情这里获取了185个国家的数据,海外疫情数据获取并提取:

 
  1. this.isLoading = true;
  2. axios
  3. .post(
  4. "https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist"
  5. )
  6. .then(res => {
  7. let data = res.data.data;
  8. let names = [];
  9. data.forEach(item => {
  10. names.push(item.name);
  11. });
  12. this.worldData = data;
  13. this.test(names).then(res => {
  14. console.log(res.data.dst);
  15. let ss = res.data.dst;
  16. console.log(ss);
  17. let namess = ('"' + ss.replace(/, /g, '","') + '"').split(",");
  18. this.worldNames = namess;
  19. this.setEc(this.check);
  20. this.isLoading = false;
  21. });
  22. });

test 函数封装了爱翻译的谷歌翻译,setEc 是绘制地图函数。

 
  1. test(content) {
  2. return axios.post(
  3. "http://api.aifanyi.net/google.php",
  4. `content=${content}&from=zh-CN&fromtxt=中文&to=英文&totxt=英语`
  5. );
  6. },

为什么要这样提取数据,因为 echarts 地图数据是英文匹配,直接翻译即可:

  • namess 为提取翻译后的国家数组赋值给 worldName

  • worldData 为海外疫情数据

  • names.push 是提取国家名以便于翻译

数据处理

假如百度翻译,腾讯翻译,有道翻译会导致翻译不准数据减少,185个国家名字,返回了174或者多点 Push 改变原格式,所有我们先 push 字符串再把字符串赋值给地图数据,见下面:

 
  1. let min = 0;
  2. let max = 100;
  3. let title = " 地图";//地图标题(总,现存,新增)
  4. let data = [];//疫情数据
  5. let names = [];//提取省级名字
  6. let values = [];//提取城市疫情数据
  7. this.check = check;//获取选择(总,现存,新增)
  8. if (check === 0) {
  9. title = "国内现存确诊地图";
  10. this.datas.forEach((item, index) => {
  11. names.push(item.name);
  12. values.push(item.total.confirm - item.total.dead - item.total.heal);
  13. data.push({ name: names[index], value: values[index] });
  14. });
  15. min = 0;
  16. max = 100;
  17. }
  18. if (check === 1) {
  19. title = "国内总确诊地图";
  20. this.datas.forEach((item, index) => {
  21. names.push(item.name);
  22. values.push(item.total.confirm);
  23. data.push({ name: names[index], value: values[index] });
  24. });
  25. min = 0;
  26. max = 3000;
  27. }
  28. if (check === 2) {
  29. title = "国内新增确诊地图";
  30. this.datas.forEach((item, index) => {
  31. names.push(item.name);
  32. values.push(item.today.confirm);
  33. data.push({ name: names[index], value: values[index] });
  34. });
  35. min = 0;
  36. max = 5;
  37. }
  38. echarts.registerMap("china", china);
  39. let myChart = echarts.init(this.$refs.chart);
  40. myChart.clear();
  41. let option = {
  42. title: {
  43. text: title,
  44. left: "center"
  45. },
  46. tooltip: {
  47. trigger: "item",
  48. showDelay: 0,
  49. transitionDuration: 0.2
  50. },//工具
  51. visualMap: {
  52. left: "right",
  53. min: min,
  54. max: max,
  55. inRange: {
  56. color: [
  57. "#f9f9fa",
  58. // "#bfbfc0",
  59. // "#74add1",
  60. // "#abd9e9",
  61. // "#e0f3f8",
  62. // "#ffffbf",
  63. "#fee090",
  64. "#fdae61",
  65. "#f46d43",
  66. "#d73027",
  67. "#a50026"
  68. ]//颜色梯度
  69. },
  70. text: ["High", "Low"], // 文本,默认为数值文本 见地图
  71. calculable: true
  72. },
  73. toolbox: {
  74. show: true,
  75. //orient: 'vertical',
  76. left: "left",
  77. top: "top",
  78. feature: {
  79. dataView: { readOnly: false },
  80. restore: {},
  81. saveAsImage: {}
  82. }//工具功能
  83. },
  84. series: [
  85. {
  86. name: "数据",
  87. type: "map",
  88. roam: true,
  89. map: "china",//地图
  90. emphasis: {
  91. label: {
  92. show: true
  93. }
  94. },
  95. itemStyle: {
  96. normal: {
  97. label: {
  98. show: true//显示城市名
  99. }
  100. }
  101. },
  102. data: data
  103. }
  104. ]
  105. };
  106. myChart.setOption(option);//绘图
  107. this.isChina = true;//控制地图选择是否显示
  108. myChart.on("click", function(params) {
  109. console.log(params);
  110. });

解析 check 控制选择地图类型(总,新增,现存),minmax 还有 color 数组 对应最大最小和颜色梯度:

点击地图触发事件

 
  1. myChart.on(“click”, function(params) {
  2. console.log(params);
  3. });
海外疫情地图数据处理绘制
 
  1. let datas = [];
  2. let title = "";
  3. this.isChina = false;
  4. this.check = check;
  5. let min = 0;
  6. let max = 100;
  7. echarts.registerMap("world", world);
  8. let values = [];
  9. if (check === 0) {
  10. this.worldData.forEach((item, index) => {
  11. values.push(item.nowConfirm);
  12. let sss = this.worldNames[index];
  13. sss = sss.substring(1, sss.length - 1);
  14. if (sss === "USA") {
  15. sss = "United States";
  16. }
  17. datas.push({
  18. name: sss,
  19. value: values[index]
  20. });
  21. });
  22. datas.push({ name: "China", value: this.chinaNow });
  23. title = "世界疫情现存地图";
  24. min = 1000;
  25. max = 100000;
  26. }
  27. if (check === 1) {
  28. this.worldData.forEach((item, index) => {
  29. values.push(item.confirm);
  30. let sss = this.worldNames[index];
  31. sss = sss.substring(1, sss.length - 1);
  32. if (sss === "USA") {
  33. sss = "United States";
  34. }
  35. datas.push({
  36. name: sss,
  37. value: values[index]
  38. });
  39. });
  40. datas.push({ name: "China", value: this.chinaTotal });
  41. title = "世界疫情总确诊地图";
  42. min = 100000;
  43. max = 1000000;
  44. }
  45. if (check === 2) {
  46. this.worldData.forEach((item, index) => {
  47. values.push(item.confirmAdd);
  48. let sss = this.worldNames[index];
  49. sss = sss.substring(1, sss.length - 1);
  50. if (sss === "USA") {
  51. sss = "United States";
  52. }
  53. datas.push({
  54. name: sss,
  55. value: values[index]
  56. });
  57. });
  58. datas.push({ name: "China", value: this.chinaAdd });
  59. title = "世界疫情新增确诊地图";
  60. min = 10;
  61. max = 1000;
  62. }
  63. let myChart = echarts.init(this.$refs.chart);
  64. myChart.clear();
  65. let option = {
  66. title: {
  67. text: title,
  68. left: "center"
  69. },
  70. tooltip: {
  71. trigger: "item",
  72. showDelay: 0,
  73. transitionDuration: 0.2
  74. },
  75. visualMap: {
  76. left: "right",
  77. min: min,
  78. max: max,
  79. inRange: {
  80. color: [
  81. "#f9f9fa",
  82. // "#bfbfc0",
  83. // "#74add1",
  84. // "#abd9e9",
  85. "#e0f3f8",
  86. "#ffffbf",
  87. "#fee090",
  88. "#fdae61",
  89. "#f46d43",
  90. "#d73027",
  91. "#a50026"
  92. ]
  93. },
  94. text: ["High", "Low"], // 文本,默认为数值文本见地图
  95. calculable: true
  96. },
  97. toolbox: {
  98. show: true,
  99. //orient: 'vertical',
  100. left: "left",
  101. top: "top",
  102. feature: {
  103. dataView: { readOnly: false },
  104. restore: {},
  105. saveAsImage: {}
  106. }
  107. },
  108. series: [
  109. {
  110. name: "数据",
  111. type: "map",
  112. roam: true,
  113. map: "world",
  114. emphasis: {
  115. label: {
  116. show: true
  117. }
  118. },
  119. itemStyle: {
  120. normal: {
  121. label: {
  122. show: false
  123. }
  124. }
  125. },
  126. data: datas
  127. }
  128. ]
  129. };
  130. myChart.setOption(option);
  131. let vm = this;
  132. myChart.on("click", function(params) {
  133. console.log(params);
  134. if (params.name === "China") {
  135. console.log(1111);
  136. vm.setEcs(vm.check);
  137. }
  138. });

进入中国地图,关键参数:

 
  1. myChart.on(“click”, function(params) {
  2. console.log(params);
  3. if (params.name === “China”) {
  4. console.log(1111);
  5. vm.setEcs(vm.check);
  6. }
jsonp 方法

关于获取疫情各城市的数据需要访问处理 json 数据,重点在是 jsonp ,在终端用 npm 下载引入即可: import jsonp from "jsonp";

具体的方法这里再举一个例子: 可以发现,对新浪疫情数据网站网址访问返回的 json 数据的形式是这样的:


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

 
  1. getData() {
  2. // 项目中用到的疫情实时动态接口数据来自本地文件
  3. axios.get('/data.json')
  4. .then(data => {
  5. console.log(data);
  6. console.log(data.data)
  7. var lists = data.data.map(item => {
  8. return {
  9. //取出 name 以及 value,并将 name 中的省字替换掉
  10. name: item.name.replace("省",''),
  11. value: item.value
  12. }
  13. })
  14. console.log(lists)
  15. option.series[0].data = lists;
  16. this.mychart.setOption(option); // 执行的前提是demo已经渲染完成,只有demo渲染完成才能够执行echarts初始化
  17. })
  18. .catch(error => {
  19. console.error(error);
  20. });
  21. }

编程要求

根据提示,在右侧编辑器补充代码,完成 Vue+Echarts 使用数据接口绘制的地图程序。

  1. 补充代码文件;

  1. 在图形化界面打开终端,并进入 Desktop/workspace/myshixun 目录下;

  2. 采用 npm install 命令安装依赖;

  1. 采用命令 npm install axios 安装 axios 模块;

  2. 采用命令 npm run serve 命令运行项目;

  1. 打开平台浏览器输入 localhost:8080 即可查看效果。

测试说明

平台会对你编写的代码进行测试,具体的运行截图如下:

注意:平台会先验证环境是否启动,然后模拟 HTTP 请求访问页面,最后再验证绘图结果,如果图像对比一致,则通关。

预期输出:

 
  1. {"step":"正在验证环境是否启动"}
  2. Vue 程序启动成功!
  3. {"step":"模拟HTTP请求访问页面localhost:8080"}
  4. {"step":"正在验证绘图结果"}
  5. 图像对比一致,恭喜通关!

开始你的任务吧,祝你成功!


代码文件

<template>
<div class="hello">
  <!-- 初始化echarts 需要个有宽高的盒子 -->
  <div ref="mapbox" class="box">
  </div>
</div>
</template>

<script>
import axios from 'axios';
import echarts from 'echarts'
import 'echarts/map/js/china.js'

const option = {
  title: {
    text: '疫情地图', // 主标题
    line: '', // 链接
    subtext: '', // 副标题
    sublink: '',
  },
  series: [{ // 图表类型
    name: '确诊人数', //对应的是鼠标触摸后的内容 
    type: 'map', //告诉echarts 渲染地图
    map: 'china',
    label: {
      show: true, //显示各个省份名称
      fontSize: 8,
    },
    itemStyle: {
      areaColor: '#fff' //区域的背景颜色
    },
    emphasis: {
      //控制鼠标滑过时的高亮样式
      itemStyle: {
        areaColor: '#c7fffd'
      }
    },
    roam: true, // 鼠标滚轮控制地图放大缩小,可拖拽
    zoom: 1.2, //控制地图的大小
  }],
  visualMap: [{ // 视觉映射组件
    type: 'piecewise',
    show: true,
    splitNumber: 6, // 分成几条
    pieces: [{ // 手动分几条
        min: 10000
      }, // 不指定 max,表示 max 为无限大(Infinity)。
      {
        min: 1000,
        max: 9999
      },
      {
        min: 100,
        max: 999
      },
      {
        min: 10,
        max: 99
      },
      {
        min: 1,
        max: 9
      },
      {
        min: 0,
        max: 0
      }
    ],
    //align:'right' // 默认是left
    inRange: { // 地图颜色
      symbol: 'rect', // 图元的图形类别 图标的形状,还可以设置circle
      color: ['#fff', '#ffaa85', '#ff7b69', '#cc2929', '#8c0d0d', '#660208']
    },
    itemHeight: 10,
    itemWidth: 20
  }],
  tooltip: { // 鼠标触摸显示
    trigger: 'item'
    // position: function (pos, params, dom, rect, size) {
    //       // 鼠标在左侧时 tooltip 显示到右侧,鼠标在右侧时 tooltip 显示到左侧。
    //       var obj = {top: 60};
    //       obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 5;
    //       return obj;
    //   }
  },
  toolbox: { // 可下载地图
    show: true,
    orient: 'vertical',
    left: 'right',
    top: 'center',
    feature: {
      dataView: { // 数据视图
        readOnly: false
      },
      restore: {}, // 刷新
      saveAsImage: {} // 保存图片
    }
  },
};
export default {
  name: 'Map',
  mounted() {
    this.getData();
    this.mychart = echarts.init(this.$refs.mapbox); //获取mapbox盒子
    this.mychart.setOption(option);
  },
  methods: {
    getData() {
      // 项目中用到的疫情实时动态接口数据来自本地文件
      /********** begin **********/
      axios.get('/data.json')
        .then(data => {
          console.log(data);
          console.info("================")
          console.log(data.data)
          var lists = data.data.map(item => {
            return {
            //取出 name 以及 value,并将 name 中的“省”字替换掉
              name:_______________
              value: _______________
            }
          })
          console.log(lists)
          option.series[0].data = lists;
          this.mychart.setOption(option); // 执行的前提是demo已经渲染完成,只有demo渲染完成才能够执行echarts初始化
        })
        .catch(error => {
          console.error(error);
        });
    
    }
    /********** end **********/
  }
}
</script>

<style scoped>
.box {
  width: 750px;
  height: 650px;
  margin: auto;
  /* border: 2px solid aquamarine; */
}
</style>

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柒_02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值