手把手教你Vue+ECharts+高德地图API实现天气预报数据可视化

news/2025/2/21 12:37:18/

前言

所谓数据可视化,我们可以理解为从宏观角度来看一眼就能看出来整个数据的占比,走向。对于数据可视化,很多互联网公司是很看重这一块的,包括大厂;就比如阿里的淘宝,双十一的时候往往就需要将消费者的一些数据通过图的形式展现出来。接下来我们就来实现一个天气的数据可视化(移动端开发),看如下效果图(iPhone6/7/8)。

 

准备工作

  1. 注册一个高德地图API账号,选择开发支持,地图 JS API

 

2、登录控制台成为开发者并创建 key

 

3、进入安全密钥使用说明,找到方式二。

 

4、创建一个vue项目,将vue的一些默认组件和样式删除,在views下新建一个Index.vue,并且在index.js下配置路由。目录结构如下所示:

 

5、通过npm install echarts --save安装一个依赖,这样就可以使用echarts了。

开始(细分11步)

  1. 将准备工作第三步找到的方式二的两个<script>引入到index.html中,将你自己申请的key值和安全密钥粘贴到里面去。这样就可以使用高德地图 JS API 开发地图应用。

  2. 设置头部样式和背景色,时间和切换城市用到了弹性布局。

 

3、设置我们需要的天气数据展示的html+css结构,这主要考查的是切页面能力。 

 

4、再放一个div 用于存放折线图。 

 

5、用watchEffectonMounted来获取天气数据。 

6、想要获取天气情况我们先要获得定位,这是需要用到高德地图API,我们来到这个位置:开发 > 地图 JS API v2.0 > 教程 > 服务 > 定位,找到IP定位获取当前城市信息。

 将这段代码复制到onMounted的回调函数中,这样我们就能获取到定位信息。

7、接下来就可以来获取天气了,我们把获取天气封装成一个函数getWeather。同样的我们来到:开发 > 地图 JS API v2.0 > 教程 > 服务 > 天气,找到实时天气查询。

把上图中的代码复制到获取天气的函数中,并将它放在获取定位成功后执行,传入定位的城市,这样就可以获得定位的城市的天气情况了。

8、同样的,我们来获取未来几天的天气情况,通过下面的代码就可以获取到。

 注意:此时输出的未来天气是一个数组。

9、我们已经获取到了天气数据了,接下来就要把这些数据存起来,把它变成响应式的,然后把它放到页面上展示出来。

把数据放到页面上我理解的是挖坑然后埋数据,就像下面这样: 

 注意:由于futureData是一个数组,我们要在它放数据的div上加一个v-if="futureData.length > 0",要不然会报错。

<div class="group" v-if="futureData.length > 0">明天:
<span class="tm">白天:{{ futureData[1].dayTemp }}℃ {{ futureData[1].dayWeather}} {{ futureData[1].dayWindDir }}风 {{ futureData[1].dayWindPower }} </span>
<span class="tm"> 夜间:{{ futureData[1].nightTemp }}℃ {{ futureData[1].nightWeather }} {{ futureData[1].nightWindDir }}风 {{ futureData[1].nightWindPower
}}</span></div>

10、接下来我们就来做一个折线图了,打开ECharts官网,选一个折线图Examples - Apache ECharts

定义一个方法initEchart来完成图的绘制(这里定义了一个空数组来获取未来几天的温度)

const tempArr = ref([])data.forecasts.forEach(item => {tempArr.value.push(item.dayTemp)})const echartContainer = ref(null)const initEchart = () => {const myChat = echarts.init(echartContainer.value);let option = {xAxis: {type: 'category',data: ['今天', '明天', '后天', '大后天'],lineStyle: {color: '#fff'},axisTick: {show: false},},yAxis: {type: 'value',show: false},series: [{data: tempArr.value,type: 'line'}]};myChat.setOption(option)}return {echartContainer}

别忘了在装这幅图的div上挂一个ref="echartContainer"哟。

这样就能帮我们初始化一个折线图了。

11、最后直接在获取未来天气中调用initEchart就可以了。

部分代码

<script>
import { toRefs, watchEffect, reactive, ref, onMounted } from 'vue';
import * as echarts from 'echarts';export default {setup() {const echartContainer = ref(null)const state = reactive({today: {},futureData: [],})const tempArr = ref([])onMounted(() => {//1.获取定位AMap.plugin('AMap.CitySearch', function () {var citySearch = new AMap.CitySearch()citySearch.getLocalCity(function (status, result) {// console.log(status);if (status === 'complete' && result.info === 'OK') {// 查询成功,result即为当前所在城市信息//console.log(result.city);getWeather(result.city)}})})})const getWeather = (cityName) => {//加载天气查询插件AMap.plugin('AMap.Weather', function () {//创建天气查询实例var weather = new AMap.Weather();//执行实时天气信息查询weather.getLive(cityName, function (err, data) {console.log(err, data);state.today = data});//未来的天气weather.getForecast(cityName, function (err, data) {console.log(err, data);state.futureData = data.forecastsdata.forecasts.forEach(item => {tempArr.value.push(item.dayTemp)})initEchart()});});}const initEchart = () => {const myChat = echarts.init(echartContainer.value);let option = {xAxis: {type: 'category',data: ['今天', '明天', '后天', '大后天'],lineStyle: {color: '#fff'},axisTick: {show: false},},yAxis: {type: 'value',show: false},series: [{data: tempArr.value,type: 'line'}]};myChat.setOption(option)}return {...toRefs(state),echartContainer}}
}
</script>

结语

ECharts中的一些图表是很好用的,我们可以自己动手多去尝试尝试。未来的学习之旅还很长,对于数据的可视化我们还可以做成3D的效果。本文如有错失,欢迎大家指正,最后感谢大家的观看


http://www.ppmy.cn/news/64304.html

相关文章

SpringBoot 简单多模块构建

前言 SpringBoot系列到现在虽然代码不多&#xff0c;但是感觉结构很乱&#xff0c;随着项目的复杂性提高&#xff0c;代码会越来越臃肿&#xff0c;耦合性高。 所以SpringBoot多模块很有必要&#xff0c;简单来说就是由以前按包分模块变为jar包分模块。在多模块jar模式下可以将…

论文解读:DeepZ:一种用于Z-DNA预测的深度学习方法

标题 DeepZ: A Deep Learning Approach for Z-DNA Prediction. DOI 10.1007/978-1-0716-3084-6_15 期刊 Methods in molecular biology 作者 Nazar Beknazarov; Maria Poptsova 出版日期 2023-01-01 Github:https://github.com/Nazar1997/Sparse-vector 网址 https://doi…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置[升级1](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

上架Google play 提示 不符合64位版本应用的要求

此版本不符合 Google Play 关于提供 64 位版本应用的要求以下 APK 或 App Bundle 面向 64 位设备&#xff0c;但只有 32 位原生代码:[29]请向应用中添加64位和 32 位原生代码。使用 Android App Bundle 发布格式可自动确保每种设备架构仅收到所需加应用的总大小。 在build.gra…

Java 判空的常见方法

一、 对象判空 if (obj ! null) {// 进行对象非空判断 }Object obj null; // 或者 obj new Object(); if (obj null) {// 对象为空 }另外&#xff0c;Guava 库还提供了一个更方便的方法&#xff0c;使用方式如下&#xff1a; import com.google.common.base.Objects;if (O…

JavaWeb:Web 的基本概念、Tomcat 服务器、Http 详解、Maven 的下载安装步骤、模仿一个 Servlet

文章目录 JavaWeb - 01一、基本概念1、静态 Web2、动态 Web3、Web 应用程序4、三个技术 二、Web 服务器三、Tomcat 详解四、发布一个 Web 网站五、Http 详解1. Http 请求&#xff08;1&#xff09;请求行&#xff08;2&#xff09;消息头 2. Http 响应&#xff08;1&#xff09…

Linux线程同步(1)——一个例子看懂为什么需要线程同步?

对于一个单线程进程来说&#xff0c;它不需要处理线程同步的问题&#xff0c;所以线程同步是在多线程环境下需要注意的问题。线程的主要优势在于&#xff0c;资源的共享性&#xff0c;譬如通过全局变量来实现信息共享&#xff0c;不过这种便捷的共享是有代价的&#xff0c;那就…

极客公园对话 Zilliz 星爵:大模型时代,需要新的「存储基建」

大模型在以「日更」进展的同时&#xff0c;不知不觉也带来一股焦虑情绪&#xff1a;估值 130 亿美元的 AI 写作工具 Grammarly 在 ChatGPT 发布后网站用户直线下降&#xff1b;AI 聊天机器人独角兽公司 Character.AI 的自建大模型在 ChatGPT 进步之下&#xff0c;被质疑能否形成…