Java获取天气预报
2022/3/21 12:28:44
本文主要是介绍Java获取天气预报,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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字段为准。>" href="https://lbs.amap.com/api/webservice/guide/tools/weather-code/" rel="external nofollow" target="_blank">天气结果对照表>>
名称 | 含义 | 规则说明 | ||
---|---|---|---|---|
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=6f997729ce226b8a051a7048f6f81b5b&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、编写获取天气信息的业务逻辑
主要思想:
- 获取实时时间,根据当下时间获取所需要天气预报的时间范围;
- 通过API获取JSON格式的天气数据;
- 解析JSON格式,转换为字符串,再从字符串中分解出字符数组;
- 将其中的值分割出来,赋值给对应的对象属性;
- 设置定时任务,每次存入数据库之前,清除根据时间范围清除数据库中旧的天气预报信息;
- 批量新增最新的天气预报信息
/** * 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"); /** * @方法名称: importWeather * @实现功能: 定时存入实时天气预报 TODO: 方法入参根据页面对象设置 * @create by zyw at 2022-03-19 14:04:31 **/ @Scheduled(cron = "0 0 1 * * ?") //每天凌晨1点执行一次 public void importWeather(){ System.out.println("~~~~~~~~定时存入实时天气预报~~~~~~~~~~"); String requestURL = "https://restapi.amap.com/v3/weather/weatherInfo?parameters&key=6f997729ce226b8a051a7048f6f81b5b&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(); } } } }
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()); }
/** * @方法名称: 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、效果图
这篇关于Java获取天气预报的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南