python在市政设计行业的应用_使用Python获取城市POI数据

import requests

import json

import time

import pandas as pd

# 构建URL访问API部分

class BaiduPoi(object):

def __init__(self, query, loc, ak): # query:行业分类,loc:检索的位置坐标,ak:服务秘钥

self.query = query

self.loc = loc

self.ak = ak

# 构建访问URL

def urls(self):

urls = []

for i in range(0, 20):

url = 'http://api.map.baidu.com/place/v2/search?query=' + self.query + '&bounds=' + self.loc + '&page_size=20&page_num=' + str(

i) + '&output=json&ak=' + self.ak

urls.append(url)

return urls

# 访问APIP获取数据

def get_data(self):

for i, url in enumerate(self.urls()):

try:

# print(i,url)

js = requests.get(url).text

data = json.loads(js)

if data['total'] != 0:

for item in data['results']:

js = {}

js['一级行业'] = h1

js['二级行业'] = h2

js['name'] = item['name']

js['lat'] = item['location']['lat']

js['lng'] = item['location']['lng']

yield js

else:

print(url)

print('本页及以后无数据!')

break

except:

print('出现错误!')

with open('./log.txt', 'a') as fl:

fl.write(url+'\n')

# 大网格划分成小网格部分

class LocalDiv(object):

def __init__(self, loc_all,

divd): # loc_all:为构建访问url中的左下角(西南)坐标和右上角(东北)坐标(bounds=39.915,116.404,39.975,116.414);divd:分割网格大小

self.loc_all = loc_all

self.divd = divd

# 划分纬度

def lat_all(self):

lat_sw = float(self.loc_all.split(',')[0]) # 西南方向纬度

lat_ne = float(self.loc_all.split(',')[2]) # 东北方向纬度

lat_list = [str(lat_ne)]

while lat_ne - lat_sw > 0:

m = lat_ne - self.divd

lat_ne = lat_ne - self.divd

lat_list.append("{:.2f}".format(m))

return sorted(lat_list)

# 划分经度

def lng_all(self):

lng_sw = float(self.loc_all.split(',')[1]) # 西南方向经度

lng_ne = float(self.loc_all.split(',')[3]) # 东北方向经度

lng_list = [str(lng_ne)]

while lng_ne - lng_sw > 0:

m = lng_ne - self.divd

lng_ne = lng_ne - self.divd

lng_list.append("{:.2f}".format(m))

return sorted(lng_list)

# 将划分的经纬度进行组合

def ls_com(self):

lat = self.lat_all()

lng = self.lng_all()

latlng_list = []

for i in range(0, len(lat)):

a = lat[i]

for i2 in range(0, len(lng)):

b = lng[i2]

ab = a + ',' + b

latlng_list.append(ab)

return latlng_list

# 构建每个小网格的西南和东北点的坐标对

def ls_row(self):

lat = self.lat_all()

lng = self.lng_all()

latlng_list = self.ls_com()

ls = []

for n in range(0, len(lat) - 1):

for i in range(len(lng) * n, len(lng) * (n + 1) - 1):

coor_a = latlng_list[i]

coor_b = latlng_list[i + len(lng) + 1]

coor = coor_a + ',' + coor_b

ls.append(coor)

return ls

if __name__ == '__main__':

# 行业划分,根据需要可以自己构建行业划分标准

pois = {'商业': ['酒店', '购物'....],

'教育': ['高等院校', '中学', '小学', '幼儿园', ......],

。。。。。。

}

print('----------开始爬取数据!----------')

start_time = time.time()

loc = LocalDiv('填写要查询的坐标范围(例:31.131387,121.413508,31.343321,121.540564)', 0.01) # 查询范围坐标,网格大小,现在采取0.01度进行分割

locs_to_use = loc.ls_row()

for h1, v in pois.items():

print('爬取:', h1)

file_name = './baidu_poi_{}.csv'.format(h1)

for loc in locs_to_use:

for h2 in v: # 获取二级行业

par = BaiduPoi(h2, loc, ak='ak值')

dt = par.get_data()

df = pd.DataFrame(dt)

if len(df) != 0:

print(df)

df.to_csv(file_name,header=0,index=False,encoding='utf_8_sig',mode='a+')

time.sleep(1)

else:

pass

end_time = time.time()

print('所有poi数据已经爬取完毕,共耗时{:.2f}秒'.format(end_time - start_time))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值