Java如何调用高德或百度地图的Web服务api并解析返回值

2018-08-31  本文已影响0人  啊其11

很多时候我们会需要调用高德或百度地图的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

上一篇下一篇

猜你喜欢

热点阅读