高德POI抓取

高德开放平台地址: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()

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值