前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高德地图API获取兰州所有小区的POI

高德地图API获取兰州所有小区的POI

作者头像
Baige
发布2022-03-22 15:07:24
3.9K1
发布2022-03-22 15:07:24
举报
文章被收录于专栏:世荣的博客

前言: 我们使用高德开放平台高德开放平台上的WebAPI服务,获取POI数据,严格说来不算爬虫,就是调数据接口获取数据而已。

1.获取兰州的范围。

2.将兰州范围拆分成设定步长的网格,用每个网格矩形搜索小区数据,如果搜索到的数据量大于阈值,则将网格拆分成四个,如此递归,直到矩形搜索到的数据量小于阈值。

3.用获取的网格调用接口,获取小区数据,把所有网格的数据汇总到一起就可以了。

总的思路:网格拆分的递归

1.获取兰州的范围 高德地图开放平台——开发指南——行政区划查询。 行政区划查询 根据请求参数说明,拼接出如下一个url,就可以获取北京范围的数据了,当然,用户key自己申请一个。

使用说明:
代码语言:javascript
复制
第一步,申请”Web服务API”密钥(Key);
第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。
如无特殊声明,接口的输入参数和输出数据编码全部统一为UTF-8。

行政区域查询:

代码语言:javascript
复制
行政区域查询API服务地址:
URL     https://restapi.amap.com/v3/config/district?parameters
请求方式 GET
parameters代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。

请求参数

返回结果参数说明 服务示例:

代码语言:javascript
复制
https://restapi.amap.com/v3/config/district?keywords=兰州&subdistrict=0&extensions=all&key=<用户的key>
回显
回显

polyline就是北京边界坐标点串,拷贝下来,留着备用,把polyline:后面跟着那一串,复制保存在polyline.txt文件中,双引号不用留。

polyine
polyine

2.递归拆分网格 为了便于理解,我们把拆分网格和获取数据分开写。

先看说明: 高德地图开放平台——开发指南——搜索POI——多边形搜索:多边形搜索示例

代码语言:javascript
复制
https://restapi.amap.com/v3/place/polygon?
polygon=116.460988,40.006919|116.48231,40.007381|116.47516,
39.99713|116.472596,39.985227|116.45669,39.984989|116.460988,
40.006919&keywords=kfc&output=xml&key=<用户的key>

根据多边形搜索条目下的请求参数说明,可以知道,在URL中,我们需要拼接几个参数,才能获取数据。

代码语言:javascript
复制
1.key,需要在高德地图开放平台上申请,既key=用户的key

2.polygon,图简单,我们使用矩形,传左下右上两个顶点坐标对,既polygon=minlng,minlat|maxlng,maxlat

3.types,查询的POI类型,这个查《POI分类编码》,能看到(大类)商务住宅——(中类)住宅区——
(小类)住宅小区的NEW-TYPE是120302,中类住宅区的NEW-TYPE是120300,既types=12302。

4.offset,每页记录数据,offset=20。

5.page,当前页数,这个需要根据返回的POI总量算,从1开始。

6.extensions,返回结果控制,多多益善,extensions=all。

7.output,返回数据格式类型,output=json。

根据offset和page的说明,offset是强烈建议不超过25,若超过25可能造成访问报错,page是最大翻页数100,这表明,每次矩形搜索最多返回2500条记录。

offset和page说明
offset和page说明

我们继续看返回参数说明,count,搜索方案数目(最大值为1000)。

搜索方案数目
搜索方案数目

按照官方文档,矩形搜索,最多返回1000条数据,为了获取足够的数据,我们只能把搜索的矩形不断细分变小。理论上,在同一个地方,范围越小,内含的数据就越少。

假设说,一个矩形覆盖整个兰州,通过这个矩形调接口,返回count=1000,那我们就要把这个矩形拆分一下,横一刀,竖一刀,变成0、1、2、3四个小矩形,再通过这四个小矩形调接口,如果0返回的count小于1000,那它不用再拆分了,如果1返回的count=1000,那它需要继续拆分,如此递归下去,直到所有的矩形调接口,返回的count都小于1000。 虽然按官方说明,阈值选1000是正确的,但按照实践来看,这个阈值选800正好,因为我发现,挺大个矩形,返回的count是800多,拆成4个,每个小矩形也返回count是800多,这就有点不太合理了,实践出真知,那就用800做阈值吧。

示例: 1.先根据北京范围拆分基础的矩形网格。 2.根据这个基础的矩形网格,去调用高德多边形搜索服务,如果搜索出的小区小于800个,则保留矩形,否则拆分矩形,直到矩形搜索出的小区小于800个。 3.将处理好的矩形写入文件备用。

需要的包是requests和shapely,其实基础的矩形网格拆分得足够小,就都不用递归了,如果想看看递归效果,可以把步长d设置得大一些。也可以把代码改一改,获取其他类型的POI等。

三.获取小区数据 一个很简单的脚本,获取所有小区的name、id、address、location,保存在xiaoqu.txt中。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021 年 11 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档