python获取区域内地图POI数据,并将结果写入csv文件

地图用的高德地图,首先先获取高德API的key。

搜索范围内获取的数据在800条之内较为准确,所以先要判断返回的数据量是否大于800。若大于800条,则对区域进行划分,划分成四个小格,对这四个小格进行搜索,判断小格数据量是否大于800,如此循环。若请求url的次数过多,要读准备几个key,循环取。

1. 先定义获取url的函数

def get_url(x1,y1,x2,y2,types,n,my_key):
    url =  'https://restapi.amap.com/v3/place/polygon?polygon='+str(x1)+','+str(y1)+'|'+str(x2)+','+str(y2)+'&types='+str(types)+'&output=json&key='+str(my_key)+'&page='+str(n)
    return url

2.获取数据

高德坐标拾取器:https://lbs.amap.com/tools/picker

import requests
import pandas

x1 = 121.483259
y1 = 31.271943
x2 = 121.516389
y2 = 31.299962
types = '140000'
my_key = 'XXXXXXX'

x_list = [x1,x2]
y_list = [y1,y2]
while (len(x_list) != 0) & (len(y_list) != 0):
    for n in range(1,100):
        # 获取第一对坐标的数据
        x1 = x_list[0]
        y1 = y_list[0]
        x2 = x_list[1]
        y2 = y_list[1]
        url = get_url(x1,y1,x2,y2,types,n,my_key)
        html = requests.get(url)
        html.close()
        data = html.json()
        count = int(data['count'])
        page = int(count/20)

        
        if count > 800:
            print('数据量大于800,需要进行拆分操作')
            # 将坐标进行拆分
            # 在坐标池中去掉本对坐标
            x0 = (x1+x2)/2
            y0 = (y1+y2)/2
            x_list.remove(x1)
            x_list.remove(x2)
            y_list.remove(y1)
            y_list.remove(y2)
            # 在坐标池中增加新的四个小方格坐标
            x_list.append(x1)
            x_list.append(x0)
            x_list.append(x1)
            x_list.append(x0)
            x_list.append(x0)
            x_list.append(x2)
            x_list.append(x0)
            x_list.append(x2)
            y_list.append(y1)
            y_list.append(y0)
            y_list.append(y0)
            y_list.append(y2)
            y_list.append(y0)
            y_list.append(y2)
            y_list.append(y1)
            y_list.append(y0)
            break
            
        elif count > 0 & count<=800:
            print('数据量小于800,且该页有数据,进行读取并存储')
            try:   # 当某一页内的数据量不足20条时会报错,用try函数避免报错。
                for i in range(20):
                    # 按条读取数据
                    info = []
                    info.append(data['pois'][i]['name'])
                    info.append(data['pois'][i]['address'])
                    info.append(data['pois'][i]['type'].split(';')[0])
                    info.append(data['pois'][i]['type'].split(';')[1])
                    info.append(data['pois'][i]['type'].split(';')[2])
                    info.append(data['pois'][i]['location'].split(',')[0])
                    info.append(data['pois'][i]['location'].split(',')[1])
                    
                    # 将获取到的一条一条信息保存到csv文件中
                    info = [info]
                    info = pandas.DataFrame(info)
                    info.to_csv(r'文件路径\XXX.csv',header=None,index=None,mode='a',encoding='gbk')
            except:
                print('该页数据不到20个')
                x_list.pop(0)
                x_list.pop(0)
                y_list.pop(0)
                y_list.pop(0)
                break
                

 

 结果:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值