SpringBoot拉取高德天气预报数据

SpringBoot拉取高德天气预报数据

一、账号申请

1.整体流程

天气文档:https://lbs.amap.com/api/webservice/guide/api/weatherinfo
整体流程可参考:https://lbs.amap.com/api/webservice/guide/create-project/get-key
在这里插入图片描述

2.注册账号

注册地址:https://console.amap.com/dev/id/phone
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.创建应用

地址:https://console.amap.com/dev/key/app
在这里插入图片描述

4.申请key

在这里插入图片描述
请勾选web服务
在这里插入图片描述
在这里插入图片描述

二、代码编写

1.核心代码如下

  • 目前使用spring定时任务去拉取天气
  • 分为实时天气和预报天气
  • 实时天气每隔一个小时拉取一次
  • 预报天气分别在每天8、11、18时30分拉取一次
package com.qiangesoft.weather.gaode;import com.qiangesoft.weather.entity.Weather;
import com.qiangesoft.weather.entity.WeatherForecast;
import com.qiangesoft.weather.gaode.constant.WeatherConstant;
import com.qiangesoft.weather.gaode.constant.WeatherType;
import com.qiangesoft.weather.gaode.model.Forecast;
import com.qiangesoft.weather.gaode.model.GaoDeResult;
import com.qiangesoft.weather.gaode.model.Live;
import com.qiangesoft.weather.service.IWeatherForecastService;
import com.qiangesoft.weather.service.IWeatherService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate;import java.util.ArrayList;
import java.util.List;/*** 天气数据更新** @author qiangefost* @date 2023-07-18*/
@Slf4j
@Component
public class WeatherTask {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate IWeatherService weatherService;@Autowiredprivate IWeatherForecastService weatherForecastService;/*** 北京市* 城市编码表:doc/AMap_adcode_citycode.xlsx*/private static final String AD_CODE = "110000";/*** 实况天气每小时更新多次* 每隔一小时执行一次*/@Scheduled(cron = "0 0 0/1 * * ?")public void pullLive() {log.info("Pull live weather data begin==================>");long startTime = System.currentTimeMillis();// 拉取实时天气this.saveLive(AD_CODE);long endTime = System.currentTimeMillis();log.info("spend time:" + (endTime - startTime));log.info("Pull live weather data end<==================");}/*** 预报天气每天更新3次,分别在8、11、18点左右更新* 每天8、11、18点30分执行*/@Scheduled(cron = "0 30 8,11,18 * * ?")public void pullForecast() {log.info("Pull forecast weather data begin==================>");long startTime = System.currentTimeMillis();// 拉取预报天气this.saveForecast(AD_CODE);long endTime = System.currentTimeMillis();log.info("spend time:" + (endTime - startTime));log.info("Pull forecast weather data end<==================");}/*** 预报天气** @param adcode*/private void saveForecast(String adcode) {StringBuilder sendUrl = new StringBuilder(WeatherConstant.WEATHER_URL).append("?key=").append(GaoDeApi.KEY_VALUE).append("&city=").append(adcode).append("&extensions=all");ResponseEntity<GaoDeResult> responseEntity = restTemplate.getForEntity(sendUrl.toString(), GaoDeResult.class);// 请求异常,可能由于网络等原因HttpStatus statusCode = responseEntity.getStatusCode();if (!HttpStatus.OK.equals(statusCode)) {log.info("Request for Gaode interface error");return;}// 请求失败GaoDeResult gaoDeResult = responseEntity.getBody();String status = gaoDeResult.getStatus();if (!status.equals(GaoDeApi.SUCCESS)) {log.info("Request for Gaode interface failed");return;}List<Forecast> forecasts = gaoDeResult.getForecasts();if (CollectionUtils.isEmpty(forecasts)) {return;}// 预报天气Forecast forecast = forecasts.get(0);List<WeatherForecast> weatherForecastList = new ArrayList<>();List<Forecast.Cast> casts = forecast.getCasts();for (Forecast.Cast cast : casts) {WeatherForecast weatherForecast = new WeatherForecast();weatherForecast.setProvince(forecast.getProvince());weatherForecast.setCity(forecast.getCity());weatherForecast.setAdcode(forecast.getAdcode());weatherForecast.setDate(cast.getDate());weatherForecast.setWeek(cast.getWeek());weatherForecast.setDayWeather(cast.getDayweather());weatherForecast.setDayWeatherImg(WeatherType.getCodeByDes(cast.getDayweather()));weatherForecast.setNightWeather(cast.getNightweather());weatherForecast.setNightWeatherImg(WeatherType.getCodeByDes(cast.getNightweather()));weatherForecast.setDayTemp(cast.getDaytemp());weatherForecast.setNightTemp(cast.getNighttemp());weatherForecast.setDayWind(cast.getDaywind());weatherForecast.setNightWind(cast.getNightwind());weatherForecast.setDayPower(cast.getDaypower());weatherForecast.setNightPower(cast.getNightpower());weatherForecast.setReportTime(forecast.getReporttime());weatherForecastList.add(weatherForecast);}weatherForecastService.saveBatch(weatherForecastList);}/*** 实时天气** @param adcode*/private void saveLive(String adcode) {StringBuilder sendUrl = new StringBuilder(WeatherConstant.WEATHER_URL).append("?key=").append(GaoDeApi.KEY_VALUE).append("&city=").append(adcode).append("&extensions=base");ResponseEntity<GaoDeResult> responseEntity = restTemplate.getForEntity(sendUrl.toString(), GaoDeResult.class);// 请求异常,可能由于网络等原因HttpStatus statusCode = responseEntity.getStatusCode();if (!HttpStatus.OK.equals(statusCode)) {log.info("Request for Gaode interface error");return;}// 请求失败GaoDeResult gaoDeResult = responseEntity.getBody();String status = gaoDeResult.getStatus();if (!status.equals(GaoDeApi.SUCCESS)) {log.info("Request for Gaode interface failed");return;}List<Live> lives = gaoDeResult.getLives();if (CollectionUtils.isEmpty(lives)) {return;}// 实况天气Live live = lives.get(0);Weather weather = new Weather();weather.setProvince(live.getProvince());weather.setCity(live.getCity());weather.setAdcode(live.getAdcode());weather.setWeather(live.getWeather());weather.setWeatherImg(WeatherType.getCodeByDes(live.getWeather()));weather.setTemperature(live.getTemperature());weather.setWindDirection(live.getWinddirection());weather.setWindPower(live.getWindpower());weather.setHumidity(live.getHumidity());weather.setReportTime(live.getReporttime());weatherService.save(weather);}}

2.源码仓库

源码地址:https://gitee.com/qiangesoft/weather

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/123382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为机试题:HJ7 取近似值

目录 第一章、算法题1.1&#xff09;题目描述1.2&#xff09;第一种解题思路与答案1.3&#xff09;第二种解题思路与答案1.4&#xff09;牛客链接 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、算法…

git建仓库小记

git建仓库小记 1.新建远端git仓库2.新建本地仓库3.添加ssh key4.将本地仓库关联到远端5.push & pull 每次新建git项目的时候都要翻翻之前收藏的几篇帖子&#xff0c;索性自己汇总一下记录&#xff0c;以后一次粘贴搞定。 1.新建远端git仓库 这个比较简单&#xff0c;网页…

腾讯云轻量应用服务器地域怎么选择比较好?

腾讯云轻量应用服务器地域怎么选比较好?腾讯云轻量应用服务器地域是指轻量服务器数据中心所在的地理位置&#xff0c;如上海、广州和北京等地域&#xff0c;如何选择地域&#xff1f;腾讯云百科txybk.com关于地域的选择建议就近原则&#xff0c;用户距离轻量服务器地域越近&am…

腾讯云国际-如何使用对象存储COS在 CKafka 控制台创建数据异步拉取任务?腾讯云代充

操作场景 Datahub 支持接入各种数据源产生的不同类型的数据&#xff0c;统一管理&#xff0c;再分发给下游的离线/在线处理平台&#xff0c;构建清晰的数据通道。 本文以 COS 数据为例介绍如何在 CKafka 控制台创建数据异步拉取任务&#xff0c;并对任务进行修改配置&#xf…

Java关于实例对象调用静态变量和静态方法问题

直接去看原文 原文链接:Java关于实例对象调用静态变量和静态方法问题_java对象可以调用static方法吗_骑个小蜗牛的博客-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- 实例…

STM32F103的GPIO

文章目录 STM32F103的地址STM32F103的GPIOA的地址推算 STM32F103的地址 GPIO 都是挂载在 APB2 总线之上。 STM32F103的GPIOA的地址推算 &#xff08;出自STM32F103开发指南P127&#xff09; GPIOA 的 7 个寄存器都是 32 位的&#xff0c;所以每个寄存器占有 4个地址&#x…

Fabric.js 复制粘贴元素

本文简介 点赞 关注 收藏 学会了 当你要复制一个 fabric 的元素时&#xff0c;你考虑到的是什么&#xff1f;是深拷贝当前选中对象再添加到画布中&#xff1f; 其实&#xff0c;fabric.js 提供了一个克隆方法&#xff0c;在 fabric.js 官网的案例里也有这个demo&#xff1a…

分布式消息队列:Rabbitmq(2)

目录 一:交换机 1:Direct交换机 1.1生产者端代码: 1.2:消费者端代码: 2:Topic主题交换机 2.1:生产者代码: 2.2:消费者代码: 二:核心特性 2.1:消息过期机制 2.1.1:给队列中的全部消息指定过期时间 2.1.2:给某条消息指定过期时间 2.2:死信队列 一:交换机 1:Direct交…

elasticsearch-5.6.15集群部署,如何部署x-pack并添加安全认证

目录 一、环境 1、JDK、映射、域名、三墙 2、三台服务器创建用户、并为用户授权 二、配置elasticsearch-5.6.15实例 1、官网获取elasticsearch-5.6.15.tar.gz&#xff0c;拉取到三台服务器 2、elas环境准备 3、修改elasticsearch.yml配置 4、修改软、硬件线程数 5、修改…

GAMP源码阅读(中)伪距单点定位 SPP

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、SPP 解算1、spp()&#xff1a;单点定位主入口函数2、estpos()3、estpose_()4、valsol()&#xff1a;GDOP和卡方检验结果有效性 二、卫星位置钟…

基于SSM的n省出口基地公共信息服务平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

vue3-vite-ts-pinia

Vue3 vite Ts pinia 实战 源码 electron 仓库地址&#xff1a;https://gitee.com/szxio/vue3-vite-ts-pinia 视频地址&#xff1a;小满Vue3&#xff08;课程导读&#xff09;_哔哩哔哩_bilibili 课件地址&#xff1a;Vue3_小满zs的博客-CSDN博客 初始化Vue3项目 方式一 …

【计算机网络笔记】DNS报文格式

DNS 提供域名到主机IP地址的映射  域名服务的三大要素&#xff1a;  域&#xff08;Domain&#xff09;和域名(Domain name)&#xff1a; 域指由地 理位置或业务类型而联系在一起的一组计算机构 成。  主机&#xff1a;由域名来标识。域名是由字符和&#xff08;或&a…

【多线程面试题十】、说一说notify()、notifyAll()的区别

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说一说notify()、notify…

pdf转jpg的方法【ps和工具方法】

pdf转jpg的方法&#xff1a; 1.photoshop办法&#xff1a; pdf直接拖入ps中&#xff0c;另存为*.Jpg文件即可 另外注意的时候&#xff0c;有时候别人给你pdf文件中包含你需要的jpg文件&#xff0c;千万不要截图进入ps中&#xff0c;直接把文件拖入ps中&#xff0c;这样的文件…

皮卡丘RCE靶场通关攻略

皮卡丘RCE靶场通关攻略 文章目录 皮卡丘RCE靶场通关攻略RCE(remote command/code execute)概述远程系统命令执行启动环境漏洞练习第一关exec "ping"第二关 exec "eval" RCE(remote command/code execute)概述 RCE漏洞&#xff0c;可以让攻击者直接向后台服…

el -table 多层级嵌套

只要你后端可以查到数据这个层级可以无限嵌套 这里用了懒加载&#xff0c;每次点击的时候将当前点击的父级id作为查询条件&#xff0c;向后端发送请求&#xff0c;来获取他子级的数据&#xff0c;并不是将所有数据查出来拼接返回的。 前端代码 <el-table:data"dataLis…

基于Ubuntu20.04安装ROS系统

文章目录 一、ROS简介二、ROS安装三、ROS安装测试四、安装问题解决1. sudo rosdepc init&#xff1a;找不到命令2. ERROR: cannot download default sources list from...3. Command roscore not found...4. Resource not found: roslaunch... 一、ROS简介 ROS是用于编写机器人…

C# 递归算法使用简介_常用整理

一、递归简介 递归算法是一种直接或者间接调用自身函数或者方法的算法。 递归算法的实质是把问题分解成规模缩小的同类问题的子问题&#xff0c;然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效&#xff0c;它可以使算法简洁和易于理解。 递归本质是循环&a…

Spring-声明式事务

声明式事务 一、简介1、准备工作2、测试 二、声明式事务概念1、编程式事务2、声明式事务3、基于注解的声明式事务1.测试无事务情况2.加入事务①Transactional注解标识的位置②事务属性&#xff1a;只读③事务属性&#xff1a;超时④事务属性&#xff1a;回滚策略⑤事务属性&…