高德天气服务api

  1. 官网:https://lbs.amap.com/api/webservice/guide/api/weatherinfo
  2. 代码:
@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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值