JAVA获取天气情况功能实现

JAVA获取天气情况功能实现

package com.tydt.utils;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tydt.entity.po.TydtWeather;
import com.tydt.service.ITydtWeatherService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;
//定时任务工具类
@Component
public class WeatherToolsUtils {

    protected final Logger logger = LoggerFactory.getLogger(WeatherToolsUtils.class);

    @Autowired
    private ITydtWeatherService service;

    @Scheduled(cron = "0 5 0 * * ?") // 每天凌晨12点05分执行
    public void runTask() {
        HttpURLConnection conn = null;
        BufferedReader reader = null;
        try {
            // 构建URL
            String city = "根据实际更改";
            String appid = "根据实际更改";
            String appsecret = "根据实际更改";
            String hours = "根据实际更改";
			//API文档如下 start
			//http://www.tianqiapi.com/index/doc?version=2030
			//API文档如上 end
            String urlString = "http://v0.yiketianqi.com/free/v2030" +
                    "?city=" + URLEncoder.encode(city, "UTF-8") +
                    "&appid=" + URLEncoder.encode(appid, "UTF-8") +
                    "&appsecret=" + URLEncoder.encode(appsecret, "UTF-8") +
                    "&hours=" + URLEncoder.encode(hours, "UTF-8");
            URL url = new URL(urlString);
            // 打开连接
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");

            // 读取返回数据
            reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            StringBuilder response = new StringBuilder();
            String line;

            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            logger.info("天气预报返回信息:" + response.toString());
            if (response.length() > 0) {
            	//字段多得话可以json转实体类保存
                TydtWeather tydtWeather = new TydtWeather();
                ObjectMapper mapper = new ObjectMapper();
                JsonNode jsonNode = mapper.readTree(response.toString());
                String date = jsonNode.get("date").asText();
                String wea = jsonNode.get("wea").asText();
                String temperatureMax = jsonNode.get("tem1").asText();
                String temperatureMin = jsonNode.get("tem2").asText();
                String windDirection = jsonNode.get("win").asText();
                String windSpeed = jsonNode.get("win_speed").asText();
                String windMeter = jsonNode.get("win_meter").asText();
                String humidity = jsonNode.get("humidity").asText();
                String visibility = jsonNode.get("visibility").asText();
                String pressure = jsonNode.get("pressure").asText();
                JsonNode alarms = jsonNode.get("alarm");
                if (alarms.isArray()) {
                    for (JsonNode alarm : alarms) {
                        String alarmType = alarm.get("alarm_type").asText();
                        String alarmLevel = alarm.get("alarm_level").asText();
                        String alarmTitle = alarm.get("alarm_title").asText();
                        String alarmContent = alarm.get("alarm_content").asText();
                        tydtWeather.setAlarmType(alarmType);
                        tydtWeather.setAlarmLevel(alarmLevel);
                        tydtWeather.setAlarmTitle(alarmTitle);
                        tydtWeather.setAlarmContent(alarmContent);
                    }
                }
                JsonNode hour = jsonNode.get("hours");
                tydtWeather.setDate(date);
                tydtWeather.setWea(wea);
                tydtWeather.setTem1(temperatureMax);
                tydtWeather.setTem2(temperatureMin);
                tydtWeather.setWin(windDirection);
                tydtWeather.setWinSpeed(windSpeed);
                tydtWeather.setWinMeter(windMeter);
                tydtWeather.setHumidity(humidity);
                tydtWeather.setVisibility(visibility);
                tydtWeather.setPressure(pressure);
                tydtWeather.setCreateTime(new Date());
                //24小时趋势,将json保存到一个字段中,mysql数据库字段类型为json。后续查看详情接口进行转换
                tydtWeather.setHours(hour.toString());
                service.insertTydtWeather(tydtWeather);
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("获取天气预报异常" + e.getMessage());
        } finally {
            // 关闭连接和读取器
            if (conn != null) {
                conn.disconnect();
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

package com.tydt.entity.po;

import com.tydt.core.entity.BaseEntity;
import lombok.Data;

import java.util.List;

/**
 * 天气对象 tydt_weather
 *
 * @author tydt
 * @date 2024-06-27
 */
@Data
public class TydtWeather extends BaseEntity {

    private static final long serialVersionUID = 1L;

    /**
     * $column.columnComment
     */
    private Long id;

    /**
     * $column.columnComment
     */
    private String date;

    /**
     * $column.columnComment
     */
    private String wea;

    /**
     * $column.columnComment
     */
    private String tem1;

    /**
     * $column.columnComment
     */
    private String tem2;

    /**
     * $column.columnComment
     */
    private String win;

    /**
     * $column.columnComment
     */
    private String winSpeed;

    /**
     * $column.columnComment
     */
    private String winMeter;

    /**
     * $column.columnComment
     */
    private String humidity;

    /**
     * $column.columnComment
     */
    private String visibility;

    /**
     * $column.columnComment
     */
    private String pressure;

    /**
     * $column.columnComment
     */
    private String alarmType;

    /**
     * $column.columnComment
     */
    private String alarmLevel;

    /**
     * $column.columnComment
     */
    private String alarmTitle;

    /**
     * $column.columnComment
     */
    private String alarmContent;

    private String hours;

    private List<Hours> hoursList;
}

package com.tydt.entity.po;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Hours {

    private String hours;

    private String tem;
}

    @Override
    public TydtWeather selectTydtWeatherById(Long id)
    {
        TydtWeather tydtWeather = tydtWeatherMapper.selectTydtWeatherById(id);
        //转json
        if(tydtWeather!=null && StringUtils.isNotBlank(tydtWeather.getHours())){
            try {
                ObjectMapper objectMapper = new ObjectMapper();
                List<Hours> hoursList = Arrays.asList(objectMapper.readValue(tydtWeather.getHours(), Hours[].class));
                tydtWeather.setHoursList(hoursList);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return tydtWeather;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取当前位置的天气预报,你可以使用高德、心知天气或和风天气这三家免费接口。其中,高德只支持实时天气查询和三日天气预报,心知天气免费接口比较全,支持天气实况和未来15天/24小时省市的天气预报查询,而和风天气免费版则不支持未来7天/15天的天气预报查询。这些接口提供的天气数据包括基本天气、白天夜间温度、风力风向风速、空气质量、气压、湿度、降雨量、能见度等信息,基本上算是很全面了。此外,你还可以获取地区气象台发布的气象预警信息,包括预警类型、预警等级、预警详情等。具体的实现方法可以参考相应的接口文档。 #### 引用[.reference_title] - *1* [java获取天气预报的信息](https://blog.csdn.net/weixin_35988065/article/details/114114883)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Java实现天气预报功能](https://blog.csdn.net/u010709330/article/details/130777669)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值