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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345