很多时候我们会需要调用高德或百度地图的web服务api来获取一些交通信息。其实调用高德或者百度地图的步骤和解析方式都区别不大。其主要步骤有一下几点
1.注册成为高德或百度的开发者并获取调用服务的key。
百度和高德都需要用户先注册成为开发者,才能使用Web服务api。一般申请一个key就可以提供Web调用的所有请求功能。但是每天的请求次数是有一定的限制的,单位时间的并发数也是有一定的限制的。想要提高请求次数一般需要付费或者成为企业开发者。
高德地图的申请key的方式的链接:https://lbs.amap.com/api/webservice/guide/create-project/get-key;
百度地图获取key的链接:http://lbsyun.baidu.com/apiconsole/key?application=key。
2.编写访问方法
对于高德和百度地图的Web服务,都是通过一个get请求,获取Json或XML的返回。这里我们使用URLConnection获取连接。当我们输入String类型的URL,可以返回String类型的Json或XML。输入的URL中可以选择返回的类型。
public static String getResponse(String serverUrl){
//用JAVA发起http请求,并返回json格式的结果
StringBuffer result = new StringBuffer();
try {
URL url = new URL(serverUrl);
URLConnection conn = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
while((line = in.readLine()) != null){
result.append(line);
}
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result.toString();
}
3.解析Json或XML
(1).Json
我们需要添加Json.jar进入工作,将String类型转换为JSONObject再获取其中的值。Json是一种轻量级的数据交换格式,主要包含两种结构,{}括起来的对象,[]括起来的数组,数组和对象之间可以互相嵌套。如下为调用高德地图交通态势返回Json:
{
"status": "1",
"info": "OK",
"infocode": "10000",
"trafficinfo": {
"description": "西土城路:学知桥附近自北向南严重拥堵;京藏高速:西三旗桥附近出京方向严重拥堵,北沙滩桥附近出京方向行驶缓慢;北四环路:安慧桥附近自东向西行驶缓慢。",
"evaluation": {
"expedite": "45.00%",
"congested": "40.00%",
"blocked": "15.00%",
"unknown": "0.00%",
"status": "3",
"description": "中度拥堵"
}
}
}
我们可以看出,最外层是一个对象,对象中包含有常量status,info,infocode和对象trafficinfo,trafficinfo中又包含有常量description和对象evaluation,对象evaluation中又包含若干常量。首先我们应当用JSONObject获取这个Json对象。然后再分层获取我们需要的值。获取String类型的Json对象方式如下:
JSONObject joResult=new JSONObject(result);//其中result为getResponse方法返回的String类型Json串
从JSONObject中获取常量、对象和数组的方式分别如下:
String str=joResult.getString("info");//获取String
Integer inte=joResult.getInt("status");//获取Integer
JSONArray arr=joResult.getJSONArray("roads"); //获取数组
JSONObject jo=joResult.getJSONObject("trafficinfo");//获取对象
......
接下来还有需要注意的是数组的遍历,如果数组中存储的是对象
for(int i=0;i<arr.length();i++) {
JSONObject joRoad=arr.getJSONObject(i);
}
这些都能成功处理,那么解析Json格式的数据已经不是问题了。
(2).XML
解析XML一般通过dom4j处理。
如下为高德地图请求交通态势的XML返回值
<?xml version="1.0" encoding="UTF-8"?>
<response>
<status>1</status>
<info>OK</info>
<infocode>10000</infocode>
<trafficinfo>
<description>京汉大道:从黄浦大街到芦沟桥路行驶缓慢;黄浦大街:黄浦路立交附近自西向东行驶缓慢。</description>
<evaluation>
<expedite>77.78%</expedite>
<congested>22.22%</congested>
<blocked>0.00%</blocked>
<unknown>0.00%</unknown>
<status>2</status>
<description>轻度拥堵</description>
</evaluation>
</trafficinfo>
</response>
XML文件主要是一个父子节点关系。
首先将String类型的XML文件转化成Document类型。
Document doc = DocumentHelper.parseText(result);
然后我们可以
Element rootElt = doc.getRootElement(); // 获取根节点response
Iterator iter = rootElt.elementIterator("trafficinfo");// 获取根节点下的子节点trafficinfo
while (iter.hasNext()) {//遍历trafficinfo节点
Element recordEle = (Element) iter.next();
String title = recordEle.elementTextTrim("description");//获取trafficinfo的子节点description的内容
}
......
通过上面的获取方式,我们就可以成功解析出返回的所有信息。
附一个我写的获取高德区域交通态势的的代码,处理的是Json返回值,每五分钟查询采集一次,保存为txt文件。开始写的存数据库版本,所以有点废代码,但是确保能够运行。第一次上传Github,大家多包涵。地址为:https://github.com/HaoWangAndTingLuo/gaodeTest