Java 实现天气预报

2023-05-16

效果图

1、登录高德地图API开放平台

天气查询-API文档-开发指南-Web服务 API | 高德地图API

2、用户在高德地图官网申请web服务API类型KEY

 

 

3、天气查询

天气查询API服务地址:

URL

https://restapi.amap.com/v3/weather/weatherInfo?parameters

请求方式

GET

parameters代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。下面的列表枚举了这些参数及其使用规则。 

  • 请求参数

参数名

含义

规则说明

是否必须

缺省值

key

请求服务权限标识

用户在高德地图官网申请web服务API类型KEY

必填

city

城市编码

输入城市的adcode,adcode信息可参考城市编码表

必填

extensions

气象类型

可选值:base/all

base:返回实况天气

all:返回预报天气

可选

output

返回格式

可选值:JSON,XML

可选

JSON

  • 返回结果参数说明

实况天气每小时更新多次,预报天气每天更新3次,分别在8、11、18点左右更新。由于天气数据的特殊性以及数据更新的持续性,无法确定精确的更新时间,请以接口返回数据的reporttime字段为准。天气结果对照表>>

名称

含义

规则说明

status

返回状态

值为0或1

1:成功;0:失败

count

返回结果总数目

info

返回的状态信息

infocode

返回状态说明,10000代表正确

lives

实况天气数据信息

province

省份名

city

城市名

adcode

区域编码

weather

天气现象(汉字描述)

temperature

实时气温,单位:摄氏度

winddirection

风向描述

windpower

风力级别,单位:级

humidity

空气湿度

reporttime

数据发布的时间

forecast

预报天气信息数据

city

城市名称

adcode

城市编码

province

省份名称

reporttime

预报发布时间

casts

预报数据list结构,元素cast,按顺序为当天、第二天、第三天的预报数据

date

日期

week

星期几

dayweather

白天天气现象

nightweather

晚上天气现象

daytemp

白天温度

nighttemp

晚上温度

daywind

白天风向

nightwind

晚上风向

daypower

白天风力

nightpower

晚上风力

4、测试获取杭州天气

api:https://restapi.amap.com/v3/weather/weatherInfo?key=你的key&city=330900

5、搭建对应的数据库表,字段要与json中的一一对应

 6、创建与表对应实体类

/**
 * TbHkhb:天气表
 * @author zyw
 * @since 2022-03-19 13:42:24
 */
@Data
@ApiModel(value="天气表,对应表tb_weather",description="适用于新增和修改页面传参")
public class TbWeather extends ProBaseEntity<TbWeather> {
    private static final long serialVersionUID = -89506524104887138L;
    /**
     * 主键id
     */
    @ApiModelProperty(value="主键id")
    private String id;
    /**
     * 日期
     */
    @ApiModelProperty(value="日期")
    private Date date;
    /**
     * 星期几
     */
    @ApiModelProperty(value="星期几")
    private String week;
    /**
     * 白天天气现象
     */
    @ApiModelProperty(value="白天天气现象")
    private String dayweather;
    /**
     * 晚上天气现象
     */
    @ApiModelProperty(value="晚上天气现象")
    private String nightweather;
    /**
     * 白天温度
     */
    @ApiModelProperty(value="白天温度")
    private String daytemp;
    /**
     * 晚上温度
     */
    @ApiModelProperty(value="晚上温度")
    private String nighttemp;
    /**
     * 白天风向
     */
    @ApiModelProperty(value="白天风向")
    private String daywind;
    /**
     * 晚上风向
     */
    @ApiModelProperty(value="晚上风向")
    private String nightwind;
    /**
     * 白天风力
     */
    @ApiModelProperty(value="白天风力")
    private String daypower;
    /**
     * 晚上风力
     */
    @ApiModelProperty(value="晚上风力")
    private String nightpower;

}

7、编写获取天气信息的业务逻辑

主要思想:

  1. 获取实时时间,根据当下时间获取所需要天气预报的时间范围;
  2. 通过API获取JSON格式的天气数据;
  3. 解析JSON格式,转换为字符串,再从字符串中分解出字符数组;
  4. 将其中的值分割出来,赋值给对应的对象属性;
  5. 设置定时任务,每次存入数据库之前,清除根据时间范围清除数据库中旧的天气预报信息;
  6. 批量新增最新的天气预报信息
    /**
     * TbZbzsService: 天气表 业务实现类
     *  开发注意:
     *      1. 增/删/改 方法需要进行事务注解(@Transactional);
     *      2. service中有异常则直接向外抛出;
     * @author zyw
     * @date 2022-03-19 13:55:31
     **/
    @Service
    public class TbWeatherService extends ProBaseService<TbWeatherDao, TbWeather> {
    
        private  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        /**
         * @方法名称: getWeather
         * @实现功能: 获取最新的天气预报 TODO: 方法入参根据页面对象设置
         * @create by zyw at 2022-03-19 17:12:31
         **/
        public List<TbWeather> getWeather(){
            Date date = new Date();
    
            Calendar rightSmall = Calendar.getInstance();
            Calendar rightBig = Calendar.getInstance();
            rightSmall.setTime(date);
            rightBig.setTime(date);
    
            rightSmall.add(Calendar.DAY_OF_YEAR,-3);//日期减3天
            rightBig.add(Calendar.DAY_OF_YEAR,2);//日期加2天
    
            return dao.getNewWeather(rightSmall.getTime(), rightBig.getTime());
    
        }
    
    
        /**
         * @方法名称: importWeather
         * @实现功能: 定时存入实时天气预报 TODO: 方法入参根据页面对象设置
         * @create by zyw at 2022-03-19 14:04:31
         **/
    //        @Scheduled(cron = "0/3 * * * * ?") //表达式只能写6位
    //    @Scheduled(cron = "0 0 */1 * * ?")    //每小时
        @Scheduled(cron = "0 0 1 * * ?")    //每天凌晨1点执行一次
        public void importWeather(){
            System.out.println("~~~~~~~~定时存入实时天气预报~~~~~~~~~~");
            String requestURL = "https://restapi.amap.com/v3/weather/weatherInfo?parameters&key=你的key&city=330900&extensions=all&output=JSON";
    
    
            HttpURLConnection conn = null;
            BufferedReader reader = null;
    //使用免费api查询天气,请求数据时需要提交的参数
            Map<String, String> params = new HashMap();
            StringBuilder stringBuilder = new StringBuilder();
    
            try {
                //存储返回结果
                String strRead = null;
                //开始连接
                URL url = new URL(requestURL);
                conn = (HttpURLConnection) url.openConnection();
                //使用Get方式请求数据
                conn.setRequestMethod("GET");
                conn.connect();
                //输入流获取返回数据
                InputStream is = conn.getInputStream();
                reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
    
                while ((strRead = reader.readLine()) != null) {
                    stringBuilder.append(strRead);
                }
    
                JSONObject jsonObject = JSON.parseObject(stringBuilder.toString());
    
                String casts = (jsonObject.getJSONArray("forecasts")).toString().substring(1, (jsonObject.getJSONArray("forecasts")).toString().length() - 1);
    
                List<TbWeather> tbWeathers = JSON.parseObject((JSON.parseObject(casts)).getJSONArray("casts").toJSONString(), new TypeReference<List<TbWeather>>() {
                });
                for (TbWeather tbWeather : tbWeathers) {
                    tbWeather.setId(UUID.randomUUID().toString().replace("-", "").substring(0, 20));
                    tbWeather.setCreateDate(new Date());
                }
    
    
                Date date = new Date();
                //清除数据库中存储的旧的天气预报
                Calendar rightSmall = Calendar.getInstance();
                Calendar rightBig = Calendar.getInstance();
                rightSmall.setTime(date);
                rightBig.setTime(date);
    
                rightSmall.add(Calendar.DAY_OF_YEAR,-1);//日期减1天
                rightBig.add(Calendar.DAY_OF_YEAR,3);//日期加2天
    
                int dates = dao.deleteWeatherByDates(rightSmall.getTime(),rightBig.getTime());
                System.out.println("清除"+dates+"条旧天气数据");
    
                int i = dao.insertTbWeatherList(tbWeathers);
                System.out.println("添加" + i+"条天气数据");
    
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (conn != null) {
                    conn.disconnect();
                }
    
            }
    
        }
    }

    <!--批量新增-->
    <insert id="insertTbWeatherList"  parameterType="java.util.List">
        insert into tb_weather (
        id,
        date,
        week,
        dayweather,
        nightweather,
        daytemp,
        nighttemp,
        daywind,
        nightwind,
        daypower,
        nightpower,
        create_date
        ) VALUES
        <foreach collection="list" item="item" separator=",">
            (
            #{item.id},
            #{item.date},
            #{item.week},
            #{item.dayweather},
            #{item.nightweather},
            #{item.daytemp},
            #{item.nighttemp},
            #{item.daywind},
            #{item.nightwind},
            #{item.daypower},
            #{item.nightpower},
            #{item.createDate}
            )
        </foreach>
    </insert>

<!--    删除指定时间范围内的-->
    <delete id="deleteWeatherByDates" parameterType="com.hlframe.intControl.entity.TbWeather">
        DELETE	from tb_weather
        where (date &gt;= #{yesterday} and date &lt; #{dayAfterTomorrow})
    </delete>

8、前端调用获取实时天气预报

获取前端所需要的时间范围,根据时间范围查找数据库中的天气预报数据

    private  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * @方法名称: getWeather
     * @实现功能: 获取最新的天气预报 TODO: 方法入参根据页面对象设置
     * @create by zyw at 2022-03-19 17:12:31
     **/
    public List<TbWeather> getWeather(){
        Date date = new Date();

        Calendar rightSmall = Calendar.getInstance();
        Calendar rightBig = Calendar.getInstance();
        rightSmall.setTime(date);
        rightBig.setTime(date);

        rightSmall.add(Calendar.DAY_OF_YEAR,-3);//日期减3天
        rightBig.add(Calendar.DAY_OF_YEAR,2);//日期加2天

        return dao.getNewWeather(rightSmall.getTime(), rightBig.getTime());

    }
    <select id="getNewWeather" resultType="com.hlframe.intControl.entity.TbWeather">
        select
        <include refid="TbHkhbColumns"/>
        from tb_weather a
        <include refid="TbHkhbJoins"/>
        <where>
            date &gt;= #{smallDate}
            and date &lt;= #{bigDate}
        </where>
        order by create_date
    </select>

    /**
     * @方法名称: getWeather
     * @实现功能: 获取实时最新天气预报, TODO: 方法入参根据页面对象设置
     * @return  java.lang.String
     * @create by zyw at 2022-03-19 17:32:26
     **/
    @ApiOperation(value="获取实时最新天气预报",notes="返回全部数据后端接口",response = TbWeather.class)
    @PostMapping(value = "/getWeather")
    public String getWeather(){
        try {
            return buildResultStr(buildSuccessResultData(service.getWeather(), TbWeather.class));
        } catch (Exception e) {
            logError(log, e);
            return buildResultStr(buildErrorResultData(e.getMessage()));
        }
    }

9、效果图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 实现天气预报 的相关文章

随机推荐

  • 代码改变生活-使用You-Get下载bilibili的视频【三】

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 112167893 我自己都想不到 xff0c 这个分享做到了第三篇 xff0c
  • Python脚本之ZIP文件压缩、解压

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 114632112 最近在翻看Python的官方文档 xff0c https d
  • 对文本和数据进行处理之awk编程

    转载地址 xff1a 点击打开链接 awk 是一种编程语言 xff0c 用于在Linux unix下对文本和数据进行处理 数据可以来自标准输入 stdin 一个或多个文件 xff0c 或其它命令的输出 它支持用户自定义函数和动态正则表达式等
  • Ubuntu20.04在vsCode配置opencv

    一 下载opencv xff1a https opencv org releases 我下载的为opencv4 5 4版本 xff0c 可以直接下载 zip文件 xff0c 可以选择其他版本 Sources版本即为 zip版本 xff1a
  • UISearchController使用中的几个坑和一个知识点

    坑1 点击搜索框后 xff0c 搜索框上移到屏幕之外了 不多说了 xff0c 都是坑 因为我之前设置了 UINavigationBar appearance 61 false 把这个去掉好了 坑2 搜索时搜索框和UITableview中间有
  • 深度学习环境搭建(四)之 CUDNN安装

    安装完CUDA Driver和CUDA后 xff0c 还需要安装CUDNN xff0c NVIDIA用于深度学习GPU加速的库 1 下载CUDNN 访问官网链接 xff0c 根据CUDA版本和Ubuntu版本选择CUDNN的版本 前面使用的
  • NMAP 六种端口状态解读

    NMAP 简介 nmap 是一款功能非常强大的扫描工具 xff0c 不仅能对端口扫描 xff0c 还可以在扫描中指定自定义的标志位 xff0c 对自己的 IP 地址进行隐藏伪装为别的 IP 地址 xff0c 还可以根据 nmap 数据库 x
  • IP ID idle 扫描

    IP ID idle 扫描简单介绍 在1998年的时候 xff0c 一个名叫 Antirez 的工程师 xff0c 发现了这种扫描技术 xff0c 攻击者可以通过不直接向目标主机发送报文的形式 xff0c 进行端口扫描 xff0c 而是通过
  • CentOS下编译Linux内核

    前言 编译内核是一项很简单的事情 xff0c 但却是进入Linux内核世界的第一步 xff0c 想要开发内核代码 xff0c 想要了解内核的运行机制 xff0c 第一步就是编译Linux内核 xff0c 以下是在centos7 5环境下编译
  • CentOS下快速升级gcc版本

    前言 很多时候由于gcc版本过低问题 xff0c 导致我们举步维艰 xff0c 从gcc官网下载源码编译又比较费时费力 xff0c 今天我就给大家分享一个快速升级gcc的方法 升级到gcc 6 3 xff1a devtoolset 6已经结
  • Linux带宽测试

    iperf是linux下一款非常实用的测带宽工具 xff0c 是C S模型的 xff0c 支持使用TCP和UDP测试 xff0c 可以测试带宽 xff0c 丢包 xff08 丢包指的是UDP的丢包 xff0c TCP丢包会重传 xff09
  • initramfs详解-----初识initramfs

    为什么需要initramfs 在Linux内核被加载到内存并运行后 xff0c 内核进程最终需要切换到用户太的进程来使用计算机 xff0c 而用户进程又存在于外存储设备上 xff0c 比如systemd进程 xff0c 通常systemd进
  • 抓包展示vlan报文(8021Q)

    VLAN数据帧格式 要使交换机能够分辨不同VLAN的报文 xff0c 需要在报文中添加标识VLAN信息的字段 IEEE 802 1Q协议规定 xff0c 在以太网数据帧的目的MAC地址和源MAC地址字段之后 协议类型字段之前加入4个字节的V
  • KVM NAT 模型

    目录 NAT原理 virbr0与virbr0 nic virbr0 nic作用 关于kvm中的网桥和virbr0 nic网卡需注意以下几点 xff1a NAT原理 virbr0与virbr0 nic zyq 64 zyq ip a 6 vi
  • Linux查看实时网卡流量的几种方式

    工作中 xff0c 我们经常需要查看服务器的实时网卡流量 通常 xff0c 我们会通过这几种方式查看Linux服务器的实时网卡流量 1 sar n DEV 1 2 sar命令包含在sysstat工具包中 xff0c 提供系统的众多统计数据
  • NUMA详解

    目录 NUMA简介 NUMA开启与关闭 查看系统是否支持 关闭方法 numactl hardware介绍 没有安装numactl工具下查看NUMA架构节点数 xff1a 查看每个NUMA节点的CPU使用情况 xff1a 看每个NUMA节点的
  • OpenStack中的CPU与内存超分详解

    目录 什么是超分 CPU超分 查看虚拟机虚拟CPU运行在哪些物理CPU上 内存超分 内存预留 内存共享 如何设置内存预留和内存共享 全局设置 临时设置 什么是超分 超分通常指的是CPU或者GPU的分区或者分割 xff0c 以在一个物理CPU
  • docker 官方的镜像大多基于debian,但是官方源apt-get update更新失败,如何更换成中国源

    一开始创建容器的时候就应该更换成国内数据源 xff0c 可是我的镜像源在经历重启后 xff0c 回归到官方镜像源 xff0c 当想安装别的linux命令时 xff0c 异常缓慢 xff0c 安装不上 这种情况就是镜像源导致 镜像源可以在容器
  • MySQL学习笔记(11)——创建视图

    11 视图 11 1 创建视图 创建视图的语法 创建视图使用CREATE VIEW语句 xff0c 基本语法格式如下 xff1a span class token keyword create span span class token p
  • Java 实现天气预报

    效果图 1 登录高德地图API开放平台 天气查询 API文档 开发指南 Web服务 API 高德地图API 2 用户在高德地图官网申请web服务API类型KEY 3 天气查询 天气查询API服务地址 xff1a URL https rest