高德API的使用 | java 获取天气预报信息

9 篇文章 0 订阅
8 篇文章 0 订阅

    本来是在网上看一下地图和天气,结果沉迷于高德地图无法自拔,想着自己也做一个简单的地图。后来发现高德还有天气预报的接口,于是加了一个天气预报模块。

    高德API的使用

    说实话这个怎么使用,高德自己的文档比我说的清楚,我再说也是狗尾续貂。简单来说就是申请key,在<script>标签中写清楚自己的key,然后在另外一个<script>标签中写js函数,直接复制开发文档的内容即可。

    高德开发文档:https://lbs.amap.com/api/javascript-api/summary

    开发步骤:

    找一个自己喜欢的网页界面,右击-->查看源代码-->复制粘贴到自己的index.html页面。

    引入key值 。

    复制文档中的js函数。

    开发思路:

    打开页面--->获取位置信息--->根据位置查询天气信息。

    一些注意事项:

    申请key的时候要注意,web服务和web端的key不是一回事。否则会报错。

    定位有两种途径,浏览器定位和ip定位。前者精确但是要用户开启浏览器定位,而且对网速也有要求,1秒内没有定位的话就会显示定位失败,这个时间自己可以设定。后者只能定位到市级行政区。

    java 获取天气预报信息 

    开发步骤:

    找一个免费的适合自己的天气预报接口。我用的是新知天气https://www.seniverse.com/doc#suggestion

    (新知天气有一个专门的生成url的UrlUtil.java,不知道其他的数据提供商有没有。)

public class XinZhiUrlUtil {

    private static  String TIANQI_DAILY_WEATHER_URL = "https://api.seniverse.com/v3/weather/daily.json";

    private static String TIANQI_API_SECRET_KEY = "APIkey";

    private static String TIANQI_API_USER_ID = "userId";

    /**
     * Generate HmacSHA1 signature with given data string and key
     * @param data
     * @param key
     * @return
     * @throws SignatureException
     */
    private static String generateSignature(String data, String key) throws SignatureException {
        String result;
        try {
            SecretKeySpec signingKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signingKey);
            byte[] rawHmac = mac.doFinal(data.getBytes("UTF-8"));
            result = new sun.misc.BASE64Encoder().encode(rawHmac);
        }
        catch (Exception e) {
            throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
        }
        return result;
    }

    /**
     * Generate the URL to get diary weather
     * @param location
     * @param language
     * @param unit
     * @param start
     * @param days
     * @return
     */
    public static String generateGetDiaryWeatherURL(
            String location,
            String language,
            String unit,
            String start,
            String days
    )  throws SignatureException, UnsupportedEncodingException {
        String timestamp = String.valueOf(System.currentTimeMillis());
        String params = "ts=" + timestamp + "&ttl=30&uid=" + TIANQI_API_USER_ID;
        String signature = URLEncoder.encode(generateSignature(params, TIANQI_API_SECRET_KEY), "UTF-8");
        return TIANQI_DAILY_WEATHER_URL + "?" + params + "&sig=" + signature + "&location=" + location + "&language=" + language + "&unit=" + unit + "&start=" + start + "&days=" + days;
    }

    public static void main(String args[]){
       // DemoJava demo = new DemoJava();
        try {
            String url = XinZhiUrlUtil.generateGetDiaryWeatherURL(
                    "beijing",   //城市信息
                    "zh-Hans",   //语言信息
                    "c",            //c 表示摄氏度, f表示华氏度
                    "0",           //0 表示今天,1表示明天,-1表示昨天(收费)
                    "2"            //查询天数
            );
            System.out.println("URL:" + url);
        } catch (Exception e) {
            System.out.println("Exception:" + e);
        }

    }
}

    新建java获取天气的工具类。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;

import java.util.HashMap;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Component;

/**
 * java调用新知天气预报接口
 *
 * @author Administrator
 *
 */
@Component
public class WeatherUtil {

    /**
     * 获取一周天气
     * 方 法 名:getWeekWeatherMap
     * @param cityName  城市名称
     */
    public  static  Map getTodayWeatherMap(String cityName)
            throws IOException, NullPointerException {
        // 连接新知天气的api
        URL url = new URL("你刚才生成的url");
        URLConnection connectionData = url.openConnection();
        connectionData.setConnectTimeout(2000);
        Map map = new HashMap();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    connectionData.getInputStream(), "UTF-8"));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null){
                sb.append(line);
            }
            String datas = sb.toString();
            JSONObject jsonData = JSONObject.fromObject(datas);
            //返回的是一个JSONArray,数组形式
            JSONArray results = jsonData.getJSONArray("results");
            //目前只需要当天的天气情况,因此只取出第一个对象即可
            JSONObject result = results.getJSONObject(0);
            //根据对象的"key"值获取数据

            //城市名称信息   存入map
            JSONObject location = result.getJSONObject("location");
            map.put("name", location.getString("name").toString());

            //天气信息     存入map
            JSONArray dailys = result.getJSONArray("daily");
            JSONObject daily = dailys.getJSONObject(0);
            map.put("text_day", daily.getString("text_day").toString());
            map.put("text_night", daily.getString("text_night").toString());
            map.put("low", daily.getString("low").toString());
            map.put("high", daily.getString("high").toString());
            map.put("wind_direction", daily.getString("wind_direction").toString());
            map.put("wind_scale", daily.getString("wind_scale").toString());
        } catch (SocketTimeoutException e) {
            System.out.println("连接超时");
        } catch (FileNotFoundException e) {
            System.out.println("加载文件出错");
        }

        return map;

    }



    public static void main(String[] args) {
        try {
            //测试获取当天
            Map map = WeatherUtil.getTodayWeatherMap("beijing");
            System.out.println(map.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

    运行main方法进行测试。

     获取源码:

    源码地址:https://github.com/bian1234/studyNote/tree/master/APILearn/map

    项目截图:

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值