高德地图巡航异步加载数据_python3爬虫-高德地图POI数据的爬取

930a36bb7844dbfa60dcc7ce0aa20ba6.png

前言

目的:本文试图爬取全北京市不同类别POI的所有数据。

大致流程

  1. 爬取北京市边界坐标
  2. 坐标映射到网格,得到北京市的边界网格
  3. 广度优先遍历,将整个北京市网格化
  4. 对每一个网格进行poi获取,当获取的数量过多时,对网格再次划分,递归查询

第一步,爬取北京市边界坐标

这里可以利用api来爬取,但为了方便,可以直接用高德地图的示例操作

1.1 打开网址:https://lbs.amap.com/api/webservice/guide/api/district

1.2 更改参数并运行

154fb20d04fef0d7d65e88a13ff26afe.png

1.3 在示例下的"districts"-->"0"-->"polyline";得到边界坐标值,复制保存到本地 border.csv,可以在mapinfo下可视化。需要说明的是,爬取的边界有一个缺口,我将缺口的最近两个点途径的三个位置添加了上去。在border.csv中添加的三行数据如下:

115.805,40.415
115.815,40.405
115.825,40.395

fec057580d1556806f099b92522d2e19.png

第二步,映射边界网格,北京市网格化

2.1 首先需要设置几个参数

网格大小:0.1 * 0.1 ,这里直接将经纬度的0.1作为网格大小,这意味着网格精确度为0.1

北京市左下角右上角坐标 : (115.42,39.44)(117.52,41.07)

jmin = 115.42
jmax = 117.52
wmin = 39.44
wmax = 41.07
div = 0.1 #设置间隔

2.2 然后,将边界坐标映射到网格。

def 

网格后的数据在mapinfo中可视化如下,下面是一个个的小方格。

dc9872f1dd382d7dfac0a0a5511dd662.png

2.3 从内部一个点出发,广度优先搜索,得到全市的网格数据

其实还有其他方法来实现网格化,但为了方(tou)便(lan),这里直接从一个网格出发,我选择 的是中心点,广度优先搜索,并在搜索过程中将走过的网格标记。

def BFS(x,y):
	list1.append([x,y])
	while len(list1)>0:
		top = list1.pop()
		xnow = top[0]
		ynow = top[1]
		if xnow<0:
			return
		re[xnow][ynow] = 1
		#print(xnow,ynow)
		if re[xnow+1][ynow]==0:
			list1.append([xnow+1,ynow])
		if re[xnow][ynow+1]==0:
			list1.append([xnow,ynow+1])
		if re[xnow-1][ynow]==0:
			list1.append([xnow-1,ynow])
		if re[xnow][ynow-1]==0:
			list1.append([xnow,ynow-1])
list1 = []
BFS(int(num_j//2),int(num_w//2))

然后将网格映射到坐标,可以直接拿网格左小角作为映射结果。

for i in range(num_j):
	for j in range(num_w):
		if re[i][j]>0:
			ix = round(i*div+jmin,2)
			iy = round(j*div+wmin,2)
			print(ix,',',iy)

得到的结果如下,图中的方格只是网格左小角坐标,大家懂意思就好:

80aa5f64331d88cc6ca670eaaee9da1b.png

第三步,对每一个网格爬取POI

这里使用高德地图的多边形搜索API,具体参数可以查看https://lbs.amap.com/api/webservice/guide/api/search

这里需要介绍一下这一API的限制。高德地图规定每一个KEY每天只能调用2000次,经过测试,每一个账号可以申请10个KEY;在每一次调用“多边形搜索”API时,每一页最多返回25条数据,这意味着每天一个账号最多可获取50万条POI,这是最理想的情况,因为一页不可能总是满的。

同时,“多边形搜索”API最多只能返回一个多边形小于900的数据量;保险起见,当遇到某一个网格的POI数据量大于850的时候,需要再次划分网格进行递归查询。这一部分需要简单的调用requests和json库,构建URL参考请参考高德地图API文档-搜索POI中的“多边形搜索”,不多解释,完整代码如下。

import numpy as np
import pandas as pd
import requests
import json

def search_poi(x,y,divt,poi_type,page):
	global keyi
	global api_count

	#构建URL
	polygon = str(x)+','+str(y)+'|'+str(x+divt)+','+str(y+divt)
	u= "https://restapi.amap.com/v3/place/polygon?key="+keys[keyi]+'&polygon='+polygon +'&types='+poi_type+'&extensions=all&output=json&offset=25&page='+str(page)
	api_count += 1 #记录一次调用

	#单个key超出2000次限额,更换key
	if api_count>=2000:
		keyi += 1
		print("change key!now key is",keys[keyi])
		api_count=0

	#解析数据
	data=requests.get(u)
	s=data.json()

	#查询错误
	if s['status']!='1':
		print('eror!') 
		return

	#如果网格太大,递归查询
	if int(s['count'])>800:
		print("too much!count is"+s['count'])
		search_poi(x,y,divt/2,poi_type,1)
		search_poi(x+divt/2,y,divt/2,poi_type,1)
		search_poi(x,y+divt/2,divt/2,poi_type,1)
		search_poi(x+divt/2,y+divt/2,divt/2,poi_type,1)
		return

	#这里可以按照需求,修改成存储结果,我这里只做了输出
	print('now location:',x,y,divt,';now page:',page,'now api count:',api_count)
	if len(s['pois'])>0:
		for i in range(len(s['pois'])):
			print(s['pois'][i]['name'],s['pois'][i]['typecode'],s['pois'][i]['location'])

	#若不止一页,查询下一页
	if len(s['pois'])==25:
		search_poi(x,y,divt,poi_type,page+1)
	
#main	
keys = ['A','B','C','D','E','F','G','H','I','J']	#自己申请的10个key
global keyi						#当前使用的key编号
global api_count					#每一个key调用api的次数
keyi = 0
api_count=0
div = 0.1 						#设置网格大小
poi_type='150700'					#当前搜索的POI类,具体参考
grid_jw = pd.read_csv('beijing_grid.csv',header=None)   #保存的北京市网格数据

#对所有网格循环搜索POI
for index,rows in grid_jw.iterrows():				
	search_poi(rows[0],rows[1],div,poi_type,1)

 

(beijing_grid.csv存储之前得到的所有网格的左小角的经纬度)

每次只需要改变POI类,关于这一编码可以参考高德地图POI分类编码表;以及改变keyi,这个需要查看自己高德地图控制台的应用管理内的每一个KEY的额度。比如:

551f1dca8df22d460a65b6f26bae7dc9.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值