最近有个业务,其中有一部分是要根据城市名获取历史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;
}