- 官网:https://lbs.amap.com/api/webservice/guide/api/weatherinfo
- 代码:
@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 = "https://restapi.amap.com/v3/ip";
private static final String GEO_URL = "https://restapi.amap.com/v3/geocode/geo";
private static final String WEATHER_URL = "https://restapi.amap.com/v3/weather/weatherInfo";
static {
Map<String, Object> commonYml = LoadYml.getCommonYml("amap.key");
log.info("加载amap配置 {}", DmMapperUtil.writeValueAsString(commonYml));
assert commonYml != null;
AMAP_KEY = String.valueOf(commonYml.get("amap.key"));
}
/**
* 通过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);
}
3.LoadYml.class
public class LoadYml {
public static Map<String, Object> getCommonYml(String... keys) {
Resource resource = new ClassPathResource("application-infrastructure.yaml");
Properties properties;
Map<String, Object> map = Maps.newConcurrentMap();
try {
YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
yamlFactory.setResources(resource);
properties = yamlFactory.getObject();
assert properties != null;
for (String key : keys) {
map.put(key, properties.get(key));
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return map;
}
4.DmMapperUtil.class
public class DmMapperUtil {
public static String writeValueAsString(Object o) {
try {
return DmMapperEnum.INSTANCE.getObjectMapper().writeValueAsString(o);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new BizException(ResultCode.JSON_FAILED);
}
}
public static ObjectMapper instance() {
return DmMapperEnum.INSTANCE.getObjectMapper();
}
public static <T> T readValue(String s, Class<T> tClass) {
try {
return DmMapperEnum.INSTANCE.getObjectMapper().readValue(s, tClass);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new BizException(ResultCode.JSON_FAILED);
}
}
}
5.DmMapperEnum.class
public enum DmMapperEnum {
/**
* mapper
*/
INSTANCE,
;
private final ObjectMapper mapper = new ObjectMapper();
DmMapperEnum() {
// 日期格式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
// 美化输出
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.registerModule(new JavaTimeModule());
}
public ObjectMapper getObjectMapper() {
return mapper;
}
}