本来是在网上看一下地图和天气,结果沉迷于高德地图无法自拔,想着自己也做一个简单的地图。后来发现高德还有天气预报的接口,于是加了一个天气预报模块。
高德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
项目截图:
![](https://i-blog.csdnimg.cn/blog_migrate/c1c5849ef0216cffe7cf7271e2457a5d.gif)