教你如何拔取百度地图POI兴趣点
通过聚合数据提供的接口,获取百度地图的POI兴趣点,并存储至数据库中。
实现:
1、聚合数据百度POI接口说明
调用聚合数据,首先得注册聚合。聚合数据提供的百度地图POI的接口有三个:数据分类,查询数据和获取周边数据。想要获取百度POI兴趣点,涉及到的接口为数据分类,查询数据。
a、数据分类
接口地址:http://apis.juhe.cn/baidu/getCategory
支持格式:JSON/XML
请求方式:GET
请求示例:http://apis.juhe.cn/baidu/getCategory?key=您申请的APPKEY&fid=1
请求参数:
名称 | 类型 | 必填 | 说明 | |
key | string | 是 | 应用APPKEY(应用详细页查询) | |
fid | string | 否 | 分类父ID,默认空,即全部分类,否则返回指定分类下的子类 | |
dtype | string | 否 | 返回数据的格式,xml或json,默认json |
返回字段:
名称 | 类型 | 说明 | |
error_code | int | 返回码 | |
reason | string | 返回说明 | |
result | - | 返回结果集 | |
id | int | 分类ID | |
name | string | 分类名称 | |
fid | int | 父类ID,0则为一级分类 |
JSON返回示例:
{ "resultcode":"200", "reason":"Return Successd!", "result":[ { "id":"17", "name":"中式快餐", "fid":"1" }, { "id":"18", "name":"中餐馆", "fid":"1" }, { "id":"19", "name":"休闲餐饮", "fid":"1" }, { "id":"20", "name":"日韩式料理", "fid":"1" }, { "id":"21", "name":"西餐厅", "fid":"1" }, { "id":"22", "name":"西式快餐", "fid":"1" }, { "id":"33", "name":"东南亚菜", "fid":"1" } ] }
b、查询数据
接口地址:http://apis.juhe.cn/baidu/getData
支持格式:JSON/XML
请求方式:POST/GET
请求示例:http://apis.juhe.cn/baidu/getData?key=您申请的APPKEY&cid=1&city=%E4%B8%8A%E6%B5%B7%E5%B8%82&page=2
请求参数:
名称 | 类型 | 必填 | 说明 | |
city | string | 是 | 城市的名称,如:上海市 | |
cid | int | 否 | 分类ID,可从分类接口获取到,默认全部 | |
keyword | string | 否 | 名称包含的关键字 | |
page | string | 否 | 页数,默认第一页 最大50. | |
pnums | int | 否 | 每次返回数据数目,默认20,最大20 | |
key | string | 是 | 应用APPKEY(应用详细页查询) | |
dtype | string | 否 | 返回数据的格式,xml或json,默认json |
返回字段:
名称 | 类型 | 说明 | |
error_code | int | 返回码 | |
reason | string | 返回说明 | |
data | - | 返回结果集 | |
id | INT | 餐厅的标识符 | |
name | string | 餐厅名称 | |
province | string | 省份 | |
city | string | 城市 | |
address | string | 详细地址 | |
phoneNumber | string | 联系电话 | |
tags | string | 标签 | |
type1 | INT | 所属一级分类ID | |
type2 | int | 所属二级分类ID | |
tag | string | 商圈 | |
lng | string | 经度(适合百度地图) | |
lat | string | 纬度 | |
pageinfo | - | - | |
nums | int | 记录总数 | |
pnums | int | 每页显示条数 | |
current | int | 当前页 | |
pageall | int | 总页数 |
JSON返回示例:
{ "resultcode":"200", "reason":"Return Successd!", "result":{ "data":[ { "id":"493567", "title":"生良饭店", "province":"上海市", "city":"上海市", "address":"上海市", "tags":"餐饮", "type1":"1", "type2":"0", "tag":"", "lng":"121.375458", "lat":"31.794554" }, { "id":"493568", "title":"永兴饭店", "province":"上海市", "city":"上海市", "address":"上海市", "tags":"餐饮", "type1":"1", "type2":"0", "tag":"", "lng":"121.421982", "lat":"31.767340" }, { "id":"493569", "title":"猛东饭店", "province":"上海市", "city":"上海市", "address":"庙镇镇合作社区竖星路210号", "tags":"餐饮", "type1":"1", "type2":"0", "tag":"小吃", "lng":"121.372307", "lat":"31.747095" }, { "id":"493570", "title":"百顺酒家", "province":"上海市", "city":"上海市", "address":"宏海公路2010", "tags":"餐饮,中餐馆", "type1":"1", "type2":"18", "tag":"", "lng":"121.352936", "lat":"31.720875" }, { "id":"493571", "title":"群丰酒楼", "province":"上海市", "city":"上海市", "address":"上海市", "tags":"餐饮", "type1":"1", "type2":"0", "tag":"", "lng":"121.354179", "lat":"31.720181" } ], "pageinfo":{ "nums":93720, "pnums":"5", "current":"2", "pageall":18744 } } }
2、获取数据分类
根据提供的接口,获取数据全部分类的地址为:
http://apis.juhe.cn/baidu/getCategory?key=您的key&dtype=json
为方便使用,我将返回的数据整理成了表格形式,如下:
id | fid | name |
1 | 0 | 餐饮 |
2 | 0 | 汽车服务 |
3 | 0 | 地产小区 |
4 | 0 | 公司企业 |
5 | 0 | 宾馆 |
6 | 0 | 金融 |
7 | 0 | 交通设施 |
8 | 0 | 教育 |
9 | 0 | 生活服务 |
10 | 0 | 旅游景点 |
11 | 0 | 名称标注类 |
12 | 0 | 购物 |
13 | 0 | 休闲娱乐 |
14 | 0 | 行政地标 |
15 | 0 | 政府机构 |
16 | 0 | 医疗 |
17 | 1 | 中式快餐 |
18 | 1 | 中餐馆 |
19 | 1 | 休闲餐饮 |
20 | 1 | 日韩式料理 |
21 | 1 | 西餐厅 |
22 | 1 | 西式快餐 |
23 | 13 | 洗浴按摩 |
24 | 13 | 歌舞厅/夜总会/娱乐城 |
25 | 12 | 批发市场/集市 |
26 | 12 | 电器商场 |
27 | 7 | 停车场/停车区 |
28 | 15 | 党派团体 |
29 | 13 | ktv |
30 | 5 | 星级宾馆酒店 |
31 | 9 | 便利店 |
32 | 15 | 机关单位 |
33 | 1 | 东南亚菜 |
34 | 4 | 厂矿 |
35 | 13 | 度假村/度假区 |
36 | 4 | 运输 |
37 | 7 | 飞机场 |
38 | 8 | 培训机构 |
39 | 8 | 高等教育 |
40 | 6 | 银行 |
41 | 4 | 物业管理 |
42 | 13 | 文化馆/文化宫/活动中心 |
43 | 5 | 旅店 |
44 | 3 | 小区/楼盘 |
45 | 4 | 文化媒体 |
46 | 12 | 综合商场/购物中心 |
47 | 13 | 休闲广场 |
48 | 13 | 体育场馆 |
49 | 4 | 职业介绍/人才交流 |
50 | 6 | 证券公司 |
51 | 16 | 综合医院 |
52 | 9 | 美容美发 |
53 | 9 | 邮局 |
54 | 13 | 健身中心 |
55 | 8 | 初等教育(小学) |
56 | 15 | 福利机构 |
57 | 14 | 村庄 |
58 | 8 | 学前教育 |
59 | 12 | 家居建材 |
60 | 8 | 中等教育 |
61 | 12 | 烟酒茶叶 |
62 | 5 | 招待所 |
63 | 7 | 公交车站 |
64 | 7 | 地铁/轻轨 |
65 | 3 | 售楼处 |
66 | 9 | 洗衣/干洗 |
67 | 2 | 汽车配件/装饰 |
68 | 4 | 旅行社 |
69 | 8 | 科研机构/教育 |
70 | 5 | 连锁快捷酒店 |
71 | 9 | 摄影冲印 |
72 | 6 | 保险公司 |
73 | 12 | 服装鞋帽 |
74 | 10 | 风景区/旅游区 |
75 | 12 | 超市 |
76 | 16 | 社区医疗/诊所/卫生所 |
77 | 6 | atm |
78 | 6 | 农村信用社/城市信用社 |
79 | 2 | 汽车维修/养护/洗车 |
80 | 10 | 公园 |
81 | 4 | 公用事业 |
82 | 4 | 高新科技 |
83 | 12 | 文化办公 |
84 | 12 | 钟表眼镜 |
85 | 4 | 事务所 |
86 | 7 | 出入口 |
87 | 9 | 房屋租售中介 |
88 | 4 | 农林园艺 |
89 | 15 | 各级政府 |
90 | 12 | 珠宝饰品 |
91 | 12 | 礼品花卉 |
92 | 6 | 投资公司 |
93 | 14 | 乡镇 |
94 | 6 | 典当/当铺 |
95 | 4 | 婚介婚庆 |
96 | 4 | 新闻出版 |
97 | 10 | 美术馆/艺术馆 |
98 | 13 | 图书馆 |
99 | 4 | 工商业区 |
100 | 12 | 文物古玩 |
101 | 12 | 电子数码 |
102 | 7 | 交叉路口 |
103 | 10 | 博物馆 |
104 | 4 | 保安 |
105 | 16 | 药店/药房 |
106 | 9 | 彩票发行 |
107 | 13 | 迪吧 |
108 | 13 | 电影院 |
109 | 4 | 电信公司 |
110 | 10 | 展览馆/纪念馆 |
111 | 15 | 公检法机构 |
112 | 9 | 售票处 |
113 | 4 | 建筑装修 |
114 | 2 | 4s/汽车销售 |
115 | 2 | 汽车检验场 |
116 | 2 | 驾校 |
117 | 2 | 汽车租赁 |
118 | 7 | 长途汽车站 |
119 | 7 | 出租车站 |
120 | 9 | 电信营业厅 |
121 | 12 | 图书音像 |
122 | 4 | 高科技园区 |
123 | 13 | 网吧 |
124 | 7 | 加油站 |
125 | 7 | 火车站 |
126 | 16 | 医疗保健 |
127 | 15 | 涉外机构 |
128 | 9 | 家政服务 |
129 | 7 | 服务区 |
130 | 9 | 文印图文 |
131 | 12 | 母婴儿童 |
132 | 12 | 体育户外 |
133 | 12 | 摄影器材 |
134 | 9 | 家电维修 |
135 | 3 | 别墅 |
136 | 4 | 房地产开发 |
137 | 4 | 殡葬 |
138 | 4 | 出国留学 |
139 | 9 | 公厕 |
140 | 9 | 搬家 |
141 | 15 | 驻地机构 |
142 | 10 | 游乐园 |
143 | 13 | diy手工 |
144 | 13 | 音乐厅 |
145 | 7 | 港口/码头 |
146 | 9 | 送水 |
147 | 9 | 报亭 |
148 | 10 | 文物古迹 |
149 | 10 | 动物园 |
150 | 10 | 植物园 |
151 | 10 | 教堂 |
152 | 13 | 剧院 |
153 | 11 | 道路名称 |
154 | 10 | 水族馆 |
155 | 7 | 桥 |
156 | 13 | 电子游戏 |
157 | 16 | 私人诊所 |
158 | 5 | 青年旅舍 |
159 | 15 | 中央机构 |
160 | 7 | 收费处/收费站 |
161 | 7 | 环岛 |
162 | 7 | 红绿灯 |
163 | 10 | 科技馆 |
164 | 4 | 教育 |
165 | 12 | 箱包日用 |
166 | 14 | 区县 |
167 | 14 | 地级市 |
168 | 14 | 商圈 |
169 | 16 | 专科医院 |
170 | 9 | 宠物 |
171 | 16 | 急救中心 |
172 | 16 | 下属科室机构 |
173 | 16 | 防疫站 |
174 | 16 | 中医医院 |
175 | 16 | 职工医院 |
3、获取POI
根据提供的接口,获取POI的地址为:
http://apis.juhe.cn/baidu/getData?key=您的key&dtype=json&city=北京市&page=1&cid=1
其中:
city:城市名称;
page:当前页;
cid:获取到的数据分类的id
为了能将获取到的数据保存下来,用java+oracle写了一段小程序,实现了数据的获取与保存。
a、数据库表
根据获取到的json数据,建立表BDPOI,表结构设计如下:
b、获取并保存数据
package com.lzugis.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.sql.SQLException; import com.lzugis.db.ConOrcl; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class GetPoiData { public static void main(String[] args) throws SQLException { String poiUrl = "http://apis.juhe.cn/baidu/getData"; String poiParam = "key=7ea83e6f1e025782c47229b49865111b&dtype=json&city=北京市"+ "&page="+1+"&cid=1"; String poiResult = SendGET(poiUrl,poiParam); JSONObject poiJson = JSONObject.fromObject(poiResult); System.out.println(poiJson); int pageAll = poiJson.getJSONObject("result").getJSONObject("pageinfo").getInt("pageall"); for(int i=0;i<pageAll;i++){ System.out.println("—————————————————————————————————————————————"); System.out.println("第"+(i+1)+"页"); String poiParam = "key=7ea83e6f1e025782c47229b49865111b&dtype=json&city=北京市"+ "&page="+(i+1)+"&cid=1"; String poiResult = SendGET(poiUrl,poiParam); JSONObject poiJson = JSONObject.fromObject(poiResult); JSONArray data = poiJson.getJSONObject("result").getJSONArray("data"); int size = data.size(); for(int j=0;j<size;j++){ JSONObject item = data.getJSONObject(j); //id,title,addr,pro,city,tags,ty1,ty2,lng,lat String sql = "insert into bdpoi values(‘"+item.getString("id")+"‘,‘" +item.getString("title")+"‘,‘" +item.getString("address")+"‘,‘" +item.getString("province")+"‘,‘" +item.getString("city")+"‘,‘" +item.getString("tags")+"‘," +item.getInt("type1")+"," +item.getInt("type2")+"," +item.getDouble("lng")+"," +item.getDouble("lat")+")"; System.out.println(" "+sql); ConOrcl.runSql(sql); } } } public static String SendGET(String url,String param){ String result="";//访问返回结果 BufferedReader read=null;//读取访问结果 try { //创建url URL realurl=new URL(url+"?"+param); //打开连接 URLConnection connection=realurl.openConnection(); // 设置通用的请求属性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); //建立连接 connection.connect(); // 定义 BufferedReader输入流来读取URL的响应 read = new BufferedReader(new InputStreamReader( connection.getInputStream(),"UTF-8")); String line;//循环读取 while ((line = read.readLine()) != null) { result += line; } } catch (IOException e) { e.printStackTrace(); } finally{ if(read!=null){//关闭流 try { read.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; } }
这样,就将百度地图的POI数据获取并保存了下来。
注:聚合数据是有请求次数限制的,想获取更多的话就自己想办法掏钱吧!