高德开放平台地址:http://lbs.amap.com/api/webservice/guide/api/search
里面有好多关于交通的接口,在使用这些接口前需要注册一下账号
本次任务主要是为了获得城市的POI数据用来做功能区的划分,同时通过一些模拟地图请求获得POI的边界
首先要获得某个城市的所有POI数据,高德提供了多种POI查询接口,在这里我使用的是多边形搜索接口
由于接口每次返回的数据存在上线,要想获得更多的POI数据只有多次请求,在这里我们首先获得想要爬取区域的左上角和右下角的坐标,然后将其分成多个矩形网格,按网格和类别对POI进行多次查询,需要注意的是坐标小数点后不能超过6位
网格划分的代码如下
# -*- coding: utf-8 -*-
import requests
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
# 拼接发送请求
def getUrlToGaoDe(left_lng, left_lat, right_lng, right_lat, keyword, pagenum):
url = "http://restapi.amap.com/v3/place/polygon?key=自己申请的KEY&polygon="
url += str(round(left_lng, 6)) + "," + str(round(left_lat, 6)) + "|" + str(round(right_lng, 6)) + "," + str(
round(right_lat)) + "&keywords=" + keyword + "&children=1&types=&offset=20&page=" + str(pagenum) + "&extensions=all"
response = requests.get(url)
g_json = json.loads(response.content)
if 'status' in g_json and int(g_json['status']) == 1:
return g_json
left_bottom = [114.093528,31.963774]; # 设置区域左上角坐标(高德坐标)
right_top = [114.502769,31.638143]; # 设置区域右下角坐标(高德坐标)
part_n = 64 # 设置区域网格
x_item = (right_top[0] - left_bottom[0]) / part_n;
y_item = (right_top[1] - left_bottom[1]) / part_n;
query = ['餐饮服务','风景名胜', '公共设施', '公司企业', '购物服务', '金融保险服务', '科教文化服务',
'商务住宅', '生活服务','体育休闲服务','医疗保健服务', '政府机构及社会团体', '住宿服务'
]
wo = open("E:/poi/hefei_poi_from_gaode_1101_four.txt", "ab")
for i in range(part_n):
for j in range(part_n):
for keyword in query:
left_lng = left_bottom[0] + i * x_item
left_lat = left_bottom[1] + j * y_item
right_lng = left_bottom[0] + (i + 1) * x_item
right_lat = left_bottom[1] + (j + 1) * y_item
res_json = getUrlToGaoDe(left_lng, left_lat, right_lng, right_lat, keyword, 1)
if res_json:
total_page = total_page = int(res_json['count']) / 20 + 1
print "%s行业数据在%f,%f,%f,%f区域,共有%d页" % (keyword,left_lng,left_lat,right_lng,right_lat,total_page)
if int(res_json['count'])!=0:
for pagenum in range(1,total_page + 1):
print "开始翻页查询,当前第%d页" % pagenum
sucess_json = getUrlToGaoDe(left_lng, left_lat, right_lng, right_lat, keyword, pagenum)
if sucess_json and 'pois' in sucess_json and sucess_json['pois']:
for ss in sucess_json['pois']:
# print "~".join([ss['name'], ss['id'], ss['type'], ss['location'], ss['pname'], ss['cityname'],
# ss['adname']])
wo.write("~".join(
[ss['name'], ss['id'], ss['type'], ss['location'], ss['pname'], ss['cityname'],
ss['adname']]) + "\n")
wo.flush()
wo.close()
# for ss in res_json['pois']:
# print ss['name']
上面的代码会获得相关POI的一些信息,在这里我们只需要POI的ID,然后通过ID去模拟高德的地图请求,就会得到相关POI的详细信息,包括POI的边界信息
response = requests.get(url_two)
if 'too fast' in response:
pass
else:
if response.status_code==200:
res_json = json.loads(response.content,encoding="utf-8")
if 'data' in res_json and 'poi_list' in res_json['data']:
for rating in res_json['data']['poi_list']:
for ty in rating['domain_list']:
if 'value' in ty and 'name' in ty:
if '_11' in ty['value'] and ty['name'].encode('utf-8') == 'aoi':
arr = ty['value'].encode('utf8').split('_')
res_arr = []
name = rating['name']
for ss in arr:
p1 = ss.split(",")
res_arr.append(tr.coordinates_transfer('gcj02ll', 'bd09ll', float(p1[0]), float(p1[1])))
wo.write(("{\"name\":\""+name+"\",\"geo\":"+str(res_arr)+"},").encode("utf-8").replace("\'","")+"\n")
wo.flush()
print "{\"name\":\""+name+"\",\"geo\":"+str(res_arr)+"},".replace("\'","")
wo.close()