日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python安装poi第三方库_使用Python获取城市POI数据

發布時間:2024/9/27 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python安装poi第三方库_使用Python获取城市POI数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.數據接口:

本次使用百度地圖開放平臺中的地點檢索API來獲取城市POI數據,此次以矩形區域檢索為例。

2.獲取思路:

因為百度出于數據保護目的,單次訪問服務最多同時返回400條數據,不過官方也給出了解決方案,即通過添加分類、設置范圍等方式,從而縮小檢索范圍,滿足數據獲取要求。

要想獲取一個大的矩形區域內的數據,就需要先將大區域劃分成一個個的小區域,然后通過小區域范圍去訪問接口獲取數據。

3.代碼示例:

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))

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的python安装poi第三方库_使用Python获取城市POI数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。