Java【代码 24】AOI数据获取(通过地址名称获取UID在获取AOI数据)
AOI数据获取
- 1.业务需求
- 2.数据查询
- 3.数据获取
- 3.1 获取地点的 UID
- 3.1.1 百度官方接口
- 3.1.2 其他接口
- 3.2 通过 UID 获取边界
- 4.数据处理
- 5.总结
1.业务需求
详细的业务需求这里不赘述了,核心的功能是获取一个位置 Point 所在的区域 Area,这里就需要 AOI 数据了,尝试过以下方式:
- 下载 OSM 数据(数据量小)
- 使用水经微图下载(经验证其数据跟 OSM 的一样)
- 使用 QGIS 绘制(可行,但是工作量很大)
- 使用百度地图获取
2.数据查询
使用百度地图搜索一个地址(以小区为例),可以看到这个地址的边界信息,如图:
拦截接口响应可以获取边界数据:
将边界数据转化后在地图上验证边界数据:
3.数据获取
这个获取流程跟第二部分的数据查询没有关系,并非使用的爬虫,而是用的 api 实现的,使用爬虫获取的相关数据更多,但是需要的时间更多,整体流程如下:
- 通过地点名称获取地点的 UID
- 通过 UID 获取地点的 geo 数据
3.1 获取地点的 UID
3.1.1 百度官方接口
百度的地点检索 《官方 API 文档》V2 版,申请为企业开发者即可获取每天 2000 次的配额:
接口使用说明:
// GET请求
https://api.map.baidu.com/place/v2/search?query=ATM机&tag=银行®ion=北京&output=json&ak=您的ak
接口响应对象(这里只贴出 1 个):
{"status": 0,"message": "ok","result_type": "poi_type","query_type": "general","results": [{"name": "中国工商银行24小时自助银行(北京城关支行)","location": {"lat": 40.227538,"lng": 116.23973},"address": "北京市昌平区鼓楼南大街9号","province": "北京市","city": "北京市","area": "昌平区","street_id": "6113ef77a69c7e148e77270d","detail": 1,"uid": "6113ef77a69c7e148e77270d"}]
}
Java 调用举例:
- 依赖
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.0.0</version>
</dependency>
- 代码
OkHttpClient client = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder().url("http://api.map.baidu.com/place/v2/search?query=%E9%95%BF%E6%B1%9F%E4%B9%8B%E5%AE%B6®ion=%E5%8D%97%E4%BA%AC&output=json&ak=您的ak").method("GET", body).addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)").addHeader("Accept", "*/*").addHeader("Host", "api.map.baidu.com").addHeader("Connection", "keep-alive").build();
Response response = client.newCall(request).execute();
if (responseSearch != null && responseSearch.code() == 200) {return responseSearch.body().string();
}
3.1.2 其他接口
参考大佬转载的博文《调用百度地图接口获取城市住宅小区边界信息 (米制转经纬度)》抓包的接口:
// GET请求
http://map.baidu.com/su?wd=北京ATM机&cid=347&type=0&pc_ver=2
接口响应对象(全部)这个 UID 需要自行解析:
{"q": "北京atm机","p": false,"t": 0,"s": ["北京市$朝阳区$$中国银行24小时自助银行(北京安苑路支行)$131$7be0f0de5b2093d729fc4813$","北京市$海淀区$$中国建设银行24小时自助银行(北京田村路支行)$131$79d3c286b586357817c8f6d7$","北京市$西城区$$北京银行24小时自助银行(华安支行)$131$2495c4c7584e445289f15dfb$","北京市$东城区$$中国银行24小时自助银行(东安门支行)$131$5791e6d5155978c26d20b958$","北京市$延庆区$$中国工商银行(自动柜员机店)$131$5508504dfead2bcbc7f02526$","北京市$房山区$$北京汇豪国际酒店-自动取款机$131$99cd97c2f33c5819d7851f87$","北京市$朝阳区$$北京丽都皇冠假日酒店-自动取款机$131$4e731166a2b3410a35b06c43$","北京市$朝阳区$$中国银行ATM(王府井奥莱·香江小镇支行)$131$0957cbc8139001d4bd484269$","北京市$海淀区$$中国工商银行AMT机(北京双安商场)$131$a76c5ee8d65d8e2ffe0eb01e$","北京市$房山区$$北京中医药大学(良乡校区农业银行自助机)$131$248c71132de40c89cac3dba1$"]
}
3.2 通过 UID 获取边界
参考大佬原创博文《调用百度地图接口获取城市住宅小区边界信息》可使用以下接口获取边界数据:
// GET 请求
http://map.baidu.com/?reqflag=pcmap&from=webmap&qt=ext&uid=上一步获取的UID&ext_ver=new&l=18
接口响应数据:
{"bound_rank_params": {"nc": 1},"content": {"geo": "4|12935108.477291,4845039.334859;12935300.597983,4845247.317853|1-12935112.4564887,4845235.9949308,12935108.4772908,4845065.3159340,12935108.4800928,4845056.9743442,12935109.3782150,4845051.1604369,12935111.7093459,4845047.8615163,12935115.2947964,4845045.4598371,12935286.8196839,4845039.3348589,12935292.3756640,4845039.4361119,12935295.6012074,4845040.9823479,12935297.7511492,4845043.2489656,12935298.6464221,4845045.7767442,12935299.0034673,4845049.9391166,12935300.5979832,4845105.9755100,12935299.7006126,4845109.8198096,12935296.8320434,4845112.7835323,12935294.3225616,4845113.7692859,12935283.7811525,4845115.8125738,12935280.8790614,4845118.4874980,12935278.7272844,4845121.7820145,12935278.1878256,4845127.3557835,12935284.3375874,4845237.6236675,12935282.7231916,4845242.2959498,12935279.2271378,4845246.2014261,12935276.0903411,4845247.3178535,12935118.0103246,4845244.0898845,12935115.9940855,4845243.6740192,12935114.8293722,4845242.6587677,12935113.3514053,4845240.2605989,12935112.4564887,4845235.9949308;","uid": "上一步获取的UID"},"current_city": {"code": 1,"geo": "1|11590057.96,4489812.75;11590057.96,4489812.75|11590057.96,4489812.75;","level": 0,"name": "中国","sup": 0,"sup_bus": 0,"sup_business_area": 0,"sup_lukuang": 0,"sup_subway": 0,"type": 0,"up_province_name": "中国"},"err_msg": "","hot_city": ["北京市|131","上海市|289","广州市|257","深圳市|340","成都市|75","天津市|332","南京市|315","杭州市|179","武汉市|218","重庆市|132"],"result": {"data_security_filt_res": 0,"error": 0,"illegal": 0,"qid": "","type": 10,"uii_type": "china_main","region": "0","uii_qt": "poi_profile","login_debug": 0,"auth": null},"uii_err": 0,"anti_auth": "uxNHTzzBzxNtgz@2VJtyBxyBOSQ5QhJCF@ahZXMbfLwhb4P=2RbT2dv7uvxRYuVtvkGcuVtvvhguVtvyheuVtvCMGuVtvCQMuVtvIPcuVtvYvjuVtvZgMuVtv@vcuVtvc3CuVtvcPPuVtveGvuVtveh3uVtvh3CuVtvhgMuxVVtvrMhuVtGccZcuxtf0wd0v7"
}
4.数据处理
通过第三步获取的边界数据是百度米制坐标
转换为度可参考大佬原创博文《基于Java后台实现百度米制坐标转WGS84地理坐标实战》,转化为百度坐标系后就可以根据自己的需要进行其他坐标系的转换了。数据出来后用 QGIS 打开如下:
说明:浅蓝色的是不使用 ak 获取的 aoi 数据,粉色的是使用 ak 获取的 aoi 数据,在数据量上相差不大。
5.总结
大家可以看出来,我的这篇是一个方法整合,都是参考大佬的分享。如果使用爬虫的开发周期应该会比较久,但是获取的数据也会更多。