SpringBoot拉取高德天气预报数据

news2024/11/17 2:40:40

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 {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private IWeatherService weatherService;
    @Autowired
    private 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.coloradmin.cn/o/1142673.html

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

相关文章

cmake 使用include 分层加载

include命令 说到cmake&#xff0c;可能最先想到的就是CmakeLists.txt文件&#xff0c;但是在很多情况下&#xff0c;也会看到.cmake文件。 cmake文件是干什么的&#xff0c;甚至会想.cmake文件是不是cmake的正统文件&#xff0c;而CmakeLists.txt并不是。但其实&#xff0c;Cm…

IP 地址查询,快速查询自己的 IP 地址

文章目录 在线结果 在线 http://myip.top/ 结果

c++ queue 的使用

目录 1. 默认构造函数 2. void push(const T& x) 3. void pop() 4. T& front() 5. T& back() 6. bool empty() 7. size_t size() 下面是 queue 的简介&#xff0c;来自 queue - C Reference (cplusplus.com) 的中文翻译&#xff0c;看看就行了&#xff…

使用Node.js软件包管理器(npm)安装TypeScript

安装node.js node.js的安装很简单&#xff0c;这里不再赘述&#xff0c;如果大家有需要&#xff0c;可以看一下这个&#xff1a;https://blog.csdn.net/David_house/article/details/123218488 检验电脑上node.js是否安装成功&#xff0c;或者是否已经安装node.js&#xff0c…

22款奔驰GLE450升级香氛负离子 清新淡雅

香氛负离子系统是由香氛系统和负离子发生器组成的一套配置&#xff0c;也可以单独加装香氛系统或者是负离子发生器&#xff0c;香氛的主要作用就是通过香氛外壳吸收原厂的香水再通过空调管输送到内饰中&#xff0c;而负离子的作用就是安装在空气管中通过释放电离子来打击空气中…

11月14号|Move生态Meetup相约浪漫土耳其

Move是基于Rust编程语言&#xff0c;由Mysten Labs联合创始人兼CTO Sam Blackshear在Meta的Libra项目中开发而来&#xff0c;旨在为开发者提供比现有区块链语言更通用的开发语言。Sam的目标是创建Web3的JavaScript&#xff0c;即一种跨平台语言&#xff0c;使开发人员能够在多个…

Java NIO 开发

Java NIO 新篇介绍加示例代码 Java NIO&#xff08;New IO&#xff09;是 JDK 1.4 引入的一组新的 I/O API&#xff0c;用于支持非阻塞式 I/O 操作。相比传统的 Java IO API&#xff0c;NIO 提供了更快、更灵活的 I/O 操作方式&#xff0c;可以用于构建高性能网络应用程序。 Ja…

电机控制方案汇总

以IR2104/IR2184为例&#xff08;第1讲&#xff09; NXP智能车永磁直流有刷电动机驱动器 (1)BTN7971B BTN7970 BTN7960 半桥 两片芯片即可驱动一个电机。好用 有个队有KEA128例程 (2)HIP4082 全桥 一片芯片4个MOS驱动一个电机。 好用 (3)IR2184 半桥 两片芯片4个MOS驱动一个电机…

Linux系统启动异常完整修复过程

当Linux启动时出现报错提示“Give root password for maintenance”&#xff0c;表明系统检测到某些系统文件可能损坏或丢失&#xff0c;因此需要进入维护模式来修复。此时&#xff0c;需要输入root用户的密码才能进入维护模式&#xff0c;以修复损坏的文件。 Linux系统无法正常…

MyBaties存储和查询json格式的数据(实体存储查询版本)

最近在做的功能&#xff0c;由于别的数据库有值&#xff0c;需要这边的不同入口的进来查询&#xff0c;所以需要同步过来&#xff0c;如果再继续一个一个生成列对应处理感觉不方便&#xff0c;如果没有别的操作&#xff0c;只是存储和查询&#xff0c;那就可以用MySql支持的jso…

数字孪生技术:智慧港口的未来

随着全球贸易的不断增长&#xff0c;港口运营已经成为国际贸易的重要枢纽。港口管理者和运营商正面临着巨大的挑战&#xff0c;需要应对日益复杂的物流网络、安全威胁、环境可持续性和客户需求。在这个背景下&#xff0c;数字孪生技术已经崭露头角&#xff0c;为智慧港口的建设…

安装sharepoint订阅版过程

一、安装需求 1、计算资源需求 CPU 4核&#xff0c;内存24G以上&#xff0c;硬盘300G 2、操作系统 Windows Server 2019 标准或数据中心 Windows Server 2022 标准或数据中心 3、数据库 支持数据库兼容性级别 150 的SQL Server 2019 或更高版本SQL Server 2022&#xf…

windows qemu安装飞腾Aarch64 操作系统 亲测

在win7&#xff08;X86架构CPU&#xff09;下使用QEMU虚拟机运行银河麒麟操作系统&#xff08;ARM架构CPU&#xff09; 1、下载并安装QEMU虚拟机软件 https://qemu.weilnetz.de/w64/2020/ 2、准备好ARM银河麒麟操作系统.iso文件 这里是 Kylin-Desktop-V10-Release-2107-ar…

MySQL主从同步-Gtid

【百炼成魔】MySQL主从同步-Gtid 服务器准备 IP节点配置系统版本191.168.117.143master2c2g40gcentos 7.9192.168.117.142slave2c2g40gcentos 7.9 环境准备 下面操作需要在两台机器都操作 关闭防火墙 systemctl stop firewalld && systemctl disable firewalldse…

如何写考勤分析报告?

如何写考勤分析报告&#xff1f;首先你得知道考勤分析报告需要分析哪些数据。 一般来说&#xff0c;一份完整的考勤分析报告&#xff0c;必须要分析的数据有8大类—— 基本考勤数据出勤数据加班数据迟到早退数据请假数据休息日和节假日数据打卡数据异常情况数据 除此之外还需…

lesson-2C++类与对象(中)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 类的6个默认成员函数 构造函数 概念 特性 析构函数 概念 特性 拷贝构造函数 概念 特性 赋值运算符重载 运算符重载 赋值运算符重载 前置和后置重载 日期类的实现 类的6个默认成员函数 如果一个类中什么…

基于java jsp垃圾分类管理系统的设计与实现

摘 要 我们的时代像一辆高速飞驰的列车&#xff0c;带着互联网冲入了我们的视野内&#xff0c;并且大家对生活品质的追求也更加地高了。花变成了人们生活中的一个常见品。鲜花的需求量在这些年来逐步增长&#xff0c;花本身就具有“高颜值”&#xff0c;还伴有特殊的香味&a…

内核进程的调度与进程切换

进程被创建到了链表中&#xff0c;如何再进行进一步的调用和调用&#xff1f; 进程调度 void schedule(void)&#xff1b; 进程调度 switch_to(next); 进程切换函数 void schedule(void) {int i,next,c;struct task_struct ** p;/* check alarm, wake up any i…

秒级启动的集成测试框架

本文介绍了一种秒级启动的集成测试框架&#xff0c;使用该框架可以方便的修改和完善测试用例&#xff0c;使得测试用例成为测试过程的产物。 背景 传统的单元测试&#xff0c;测试的范围往往非常有限&#xff0c;常常覆盖的是一些工具类、静态方法或者较为底层纯粹的类实现&…

群晖上搭建teamspeak3语音服务器

什么是 TeamSpeak &#xff1f; TeamSpeak &#xff08;简称 TS&#xff09;是一款团队语音通讯工具&#xff0c;但比一般的通讯工具具有更多的功能而且使用方便。它由服务器端程序和客户端程序两部分组成&#xff0c;如果不是想自己架设 TS 服务器&#xff0c;只需下载客户端程…