高德天气服务api
@Slf4j
public class AmapUtil {
private static final RestTemplate REST_TEMPLATE = new RestTemplate();
private static final String AMAP_KEY;
private static final String INFO = "OK";
private static final String ADCODE = "adcode";
private static final String INF = "info";
private static final Integer ZERO = 0;
private static final String IP_URL = "/v3/ip";
private static final String GEO_URL = "/v3/geocode/geo";
private static final String WEATHER_URL = "/v3/weather/weatherInfo";
static {
Map<String, Object> commonYml = LoadYml.getCommonYml("");
log.info("加载amap配置 {}", DmMapperUtil.writeValueAsString(commonYml));
assert commonYml != null;
AMAP_KEY = String.valueOf(commonYml.get(""));
}
/**
* 通过ip获取城市代码
*
* @param ip ip地址
* @return 返回值
*/
@SuppressWarnings("rawtypes")
private static String getAdcodeByIp(String ip) {
String format = String.format("%s?key=%s&ip=%s", IP_URL, AMAP_KEY, ip);
log.info("高德获取adcode;请求url:{},请求人:{}",format, StpUtil.getLoginIdAsLong());
ResponseEntity<String> responseEntity = REST_TEMPLATE.getForEntity(format, String.class);
String body = responseEntity.getBody();
if (responseEntity.getStatusCode().isError()) {
log.error("高德通过ip获取adcode时的返回值:{}",responseEntity);
throw new BizException(ResultCode.WEATHER_IPLOCATIONADCODE_FAIL);
}
Map map = DmMapperUtil.readValue(body, Map.class);
if (map.get(ADCODE) instanceof List) {
throw new BizException(ResultCode.WEATHER_IPLOCATIONADCODE_FAIL);
}
return (String) map.get(ADCODE);
}
/**
* 通过ip获取城市代码
* 通过ip获取城市天气信息
*
* @param ip ip地址
* @param extensions 实况天气或者预报天气
* @return 返回值
*/
@SuppressWarnings("rawtypes")
public static Map getWeatherByIp(String ip ,String extensions) {
String format = String.format("%s?key=%s&city=%s&extensions=%s", WEATHER_URL, AMAP_KEY, getAdcodeByIp(ip),extensions);
log.info("高德获取天气信息;请求url:{},请求人:{}",format, StpUtil.getLoginIdAsLong());
ResponseEntity<String> responseEntity = REST_TEMPLATE.getForEntity(format, String.class);
if (responseEntity.getStatusCode().isError()) {
log.error("高德通过ip获取天气时的返回值:{}",responseEntity);
throw new BizException(ResultCode.WEATHER_IPLOCATIONADCODE_FAIL);
}
String body = responseEntity.getBody();
return DmMapperUtil.readValue(body, Map.class);
}
/**
* 通过地址名称和城市获取区域编码
*
* @param address 结构化地址信息:省份+城市+区县+城镇+乡村+街道
* @param city 城市
* @return 返回值
*/
@SuppressWarnings("all")
public static String getAdcodeByAddress(String address, String city) {
String format = String.format("%s?key=%s&address=%s&city=%s", GEO_URL, AMAP_KEY, address,city);
log.info("高德获取adcode;请求url:{},请求人:{}",format, StpUtil.getLoginIdAsLong());
ResponseEntity<String> responseEntity = REST_TEMPLATE.getForEntity(format, String.class);
if (responseEntity.getStatusCode().isError()) {
log.error("高德通过地址获取adcode时的返回值:{}",responseEntity);
throw new BizException(ResultCode.WEATHER_GEOLOCATIONADCODE_FAIL);
}
String body = responseEntity.getBody();
Map map = DmMapperUtil.readValue(body, Map.class);
if (!map.get(INF).equals(INFO)) {
throw new BizException(ResultCode.WEATHER_GEOLOCATIONADCODE_FAIL);
}
List<Map> geocodes = (List<Map>) map.get("geocodes");
return geocodes.get(ZERO).get(ADCODE).toString();
}
/**
* 通过地址名称和城市获取区域编码
* 通过地址名称和城市获取区域天气信息
*
* @param address 结构化地址信息:省份+城市+区县+城镇+乡村+街道
* @param city 城市
* @param extensions 实况天气或者预报天气
* @return 返回值
*/
@SuppressWarnings("rawtypes")
public static Map getWeatherByAddress(String address, String city,String extensions) {
String format = String.format("%s?key=%s&city=%s&extensions=%s", WEATHER_URL, AMAP_KEY, getAdcodeByAddress(address,city),extensions);
log.info("高德获取天气信息;请求url:{},请求人:{}",format, StpUtil.getLoginIdAsLong());
ResponseEntity<String> responseEntity = REST_TEMPLATE.getForEntity(format, String.class);
if (responseEntity.getStatusCode().isError()) {
throw new BizException(ResultCode.WEATHER_GEOLOCATIONADCODE_FAIL);
}
String body = responseEntity.getBody();
return DmMapperUtil.readValue(body,Map.class);
}