高德天气服务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;
    }
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android应用中添加高德天气API,需要按照以下步骤操作。 1. 首先,我们需要在高德开放平台上注册一个开发者账号并创建一个应用。登录高德开放平台(http://lbs.amap.com/)并点击右上角的「控制台」,进入开发者控制台。 2. 在控制台页面,点击左侧导航栏的「应用管理」,然后点击「创建新应用」按钮,填写应用名称和应用描述等相关信息,并选择「Web服务API」作为应用类型。 3. 创建完成后,在应用管理页面找到刚刚创建的应用,在应用详情中会显示该应用的key,将其复制保存备用。 4. 在Android项目中,打开Module级别的build.gradle文件,并在dependencies中添加高德天气API依赖库,例如: ``` dependencies { implementation 'com.amap.api:weather-api:x.x.x' } ``` 注意将x.x.x替换成对应的版本号。 5. 在AndroidManifest.xml文件中,添加以下权限: ``` <uses-permission android:name="android.permission.INTERNET" /> ``` 6. 在代码中使用高德天气API,以获取当前城市天气信息为例,代码示例如下: ```java import com.amap.api.weather.AMapWeather; import com.amap.api.weather.AMapWeatherListener; import com.amap.api.weather.AMapWeatherSearch; // 创建一个AMapWeatherSearch实例 AMapWeatherSearch weatherSearch = new AMapWeatherSearch(this); // 设置API key weatherSearch.setApiKey("你在高德开放平台上申请的API key"); // 调用查询方法获取天气信息 weatherSearch.searchWeatherAsyn("城市名称", new AMapWeatherSearch.OnWeatherSearchListener() { @Override public void onWeatherSearched(AMapWeatherResult aMapWeatherResult) { // 处理天气查询结果 if (aMapWeatherResult.getAMapException().getErrorCode() == 0) { // 查询成功 // 使用aMapWeatherResult获取天气信息 } else { // 查询失败 } } @Override public void onWeatherLiveSearched(AMapLocalWeatherLiveResult aMapLocalWeatherLiveResult) { // 这个方法是查询实时天气的,不是查询预报天气,一般用不到 } }); ``` 在代码中要将「城市名称」替换成你要查询的城市名称,「你在高德开放平台上申请的API key」替换成你在步骤3中获取的API key。 以上就是在Android应用中添加高德天气API的基本步骤和代码示例,根据实际需求可以进行更详细的配置和调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值