免费历史天气api使用

最近有个业务,其中有一部分是要根据城市名获取历史30天的平均温度和湿度

接口链接 :

新版历史天气接口

注册好账号就有免费测试的额度

在这里插入图片描述

根据说明放好对应的请求参数

在这里插入图片描述注意这里的cityid。点击右侧备注栏里的城市ID列表(点这里也可以)。

下载对应文件后

在这里插入图片描述在这里插入图片描述
把city_cn.sql文件直接导入数据库,这样就能根据城市名获取对应的cityid

city_cn数据表

在这里插入图片描述

代码部分

ps:下面一些工具类是公司平台框架的,用不了就替换其他。
运算都是用BigDecimal,用惯了…

 private Map<String,BigDecimal> getCityHistory(String cityName){
        //先定义好返回值 (湿度、温度)
        Map<String,BigDecimal> map = new HashMap<>();
        BigDecimal humidity = new BigDecimal(0);
        BigDecimal temperature = new BigDecimal(0);

        //定义起始时间(近30天)
        String startDay = DateUtil.format(DateUtil.offsetDay(new Date(), -30), "yyyy-MM-dd");
        String endDay =  DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd");

        //这里因为我传入的城市名是带有市、县结尾的,所以这里sql语句这样写
        List<Record> list =  Db.find("select * FROM city WHERE  '"+cityName+"' like  CONCAT(cityZh,'%') UNION select * FROM city WHERE  '"+cityName+"' like  CONCAT('%',cityZh,'%') ");
        if(ObjectUtils.isNotNull(list) && ObjectUtils.isNotNull(list.get(0))){
            //拿到cityId
            Long cityId = Long.valueOf(list.get(0).getColumns().get("id").toString().substring(2));

            //定义apiUrl
            String url = "http://gfeljm.tianqiapi.com/free/history?appid=用自己的&appsecret=用自己的";
            url += "&cityid="+cityId;
            url += "&date="+startDay+"_"+endDay;

            //定义请求
            HashMap header = new HashMap();
            header.put("Content-Type", "application/json;charset=UTF-8");
            String res = HttpUtil.httpPost(url, null, header, null);
            Map resMap = JSON.parseObject(res, Map.class);
            List<Map> hisList = (List<Map>) resMap.get("list");
            //总天数(理论上是30)
            int days =Integer.valueOf(resMap.get("days").toString());
            //遍历接口返回的list 累加温度和湿度 这里温度有两个,白天温度和夜间温度,取平均值
            for (int i = 0; i < days; i++) {
                humidity = BigDecimalUtils.add(humidity, new BigDecimal(Integer.valueOf(hisList.get(i).get("humidity").toString())));
                BigDecimal averageTemperature = BigDecimalUtils.divide(BigDecimalUtils.add(new BigDecimal(Integer.valueOf(hisList.get(i).get("tem_day").toString())),new BigDecimal(Integer.valueOf(hisList.get(i).get("tem_night").toString()))),new BigDecimal(2)) ;
                temperature = BigDecimalUtils.add(temperature, averageTemperature);
            }
            humidity = BigDecimalUtils.divide(humidity,new BigDecimal(days));
            temperature = BigDecimalUtils.divide(temperature,new BigDecimal(days));
            map.put("humidity",humidity);
            map.put("temperature",temperature);
        }
        return map;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方圆几里tb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值