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

歡迎訪問 生活随笔!

生活随笔

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

python

python高德地图poi点_python3爬虫-高德地图POI数据的爬取

發布時間:2023/12/18 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python高德地图poi点_python3爬虫-高德地图POI数据的爬取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

目的:本文試圖爬取全北京市不同類別POI的所有數據。

大致流程:爬取北京市邊界坐標

坐標映射到網格,得到北京市的邊界網格

廣度優先遍歷,將整個北京市網格化

對每一個網格進行poi獲取,當獲取的數量過多時,對網格再次劃分,遞歸查詢

第一步,爬取北京市邊界坐標

這里可以利用api來爬取,但為了方便,可以直接用高德地圖的示例操作

1.2 更改參數并運行

1.3 在示例下的"districts"-->"0"-->"polyline";得到邊界坐標值,復制保存到本地 border.csv,可以在mapinfo下可視化。需要說明的是,爬取的邊界有一個缺口,我將缺口的最近兩個點途徑的三個位置添加了上去。在border.csv中添加的三行數據如下:

115.805,40.415

115.815,40.405

115.825,40.395

第二步,映射邊界網格,北京市網格化

2.1 首先需要設置幾個參數

網格大小:0.1 * 0.1 ,這里直接將經緯度的0.1作為網格大小,這意味著網格精確度為0.1

北京市左下角和右上角坐標 : (115.42,39.44)(117.52,41.07)

jmin = 115.42

jmax = 117.52

wmin = 39.44

wmax = 41.07

div = 0.1 #設置間隔

2.2 然后,將邊界坐標映射到網格。

def to_n(rows):

j = rows.iloc[0]

w = rows.iloc[1]

x = int((j-jmin)//div)

y = int((w-wmin)//div)

if x >= num_j: #防止落在邊界上的點越界

x = num_j - 1

if y >= num_w:

y = num_w - 1

re[x][y] += 1

border = pd.read_csv('border.csv',header=None)

num_j = int((jmax-jmin)//div)

num_w = int((wmax-wmin)//div)

re = np.zeros([num_j,num_w]) #re存放落在每一個網格內的邊界坐標個數

border = pd.read('border.csv',header=None) #border.csv存儲邊界坐標,有經緯度兩列。

border.apply(to_n,axis=1,result_type='expand')

網格后的數據在mapinfo中可視化如下,下面是一個個的小方格。

2.3 從內部一個點出發,廣度優先搜索,得到全市的網格數據

其實還有其他方法來實現網格化,但為了方(tou)便(lan),這里直接從一個網格出發,我選擇 的是中心點,廣度優先搜索,并在搜索過程中將走過的網格標記。

def BFS(x,y):

list1.append([x,y])

while len(list1)>0:

top = list1.pop()

xnow = top[0]

ynow = top[1]

if xnow<0:

return

re[xnow][ynow] = 1

#print(xnow,ynow)

if re[xnow+1][ynow]==0:

list1.append([xnow+1,ynow])

if re[xnow][ynow+1]==0:

list1.append([xnow,ynow+1])

if re[xnow-1][ynow]==0:

list1.append([xnow-1,ynow])

if re[xnow][ynow-1]==0:

list1.append([xnow,ynow-1])

list1 = []

BFS(int(num_j//2),int(num_w//2))

然后將網格映射到坐標,可以直接拿網格左小角作為映射結果。

for i in range(num_j):

for j in range(num_w):

if re[i][j]>0:

ix = round(i*div+jmin,2)

iy = round(j*div+wmin,2)

print(ix,',',iy)

得到的結果如下,圖中的方格只是網格左小角坐標,大家懂意思就好:

第三步,對每一個網格爬取POI

這里需要介紹一下這一API的限制。高德地圖規定每一個KEY每天只能調用2000次,經過測試,每一個賬號可以申請10個KEY;在每一次調用“多邊形搜索”API時,每一頁最多返回25條數據,這意味著每天一個賬號最多可獲取50萬條POI,這是最理想的情況,因為一頁不可能總是滿的。

同時,“多邊形搜索”API最多只能返回一個多邊形小于900的數據量;保險起見,當遇到某一個網格的POI數據量大于850的時候,需要再次劃分網格進行遞歸查詢。這一部分需要簡單的調用requests和json庫,構建URL參考請參考高德地圖API文檔-搜索POI中的“多邊形搜索”,不多解釋,完整代碼如下。

import numpy as np

import pandas as pd

import requests

import json

def search_poi(x,y,divt,poi_type,page):

global keyi

global api_count

#構建URL

polygon = str(x)+','+str(y)+'|'+str(x+divt)+','+str(y+divt)

u= "https://restapi.amap.com/v3/place/polygon?key="+keys[keyi]+'&polygon='+polygon +'&types='+poi_type+'&extensions=all&output=json&offset=25&page='+str(page)

api_count += 1 #記錄一次調用

#單個key超出2000次限額,更換key

if api_count>=2000:

keyi += 1

print("change key!now key is",keys[keyi])

api_count=0

#解析數據

data=requests.get(u)

s=data.json()

#查詢錯誤

if s['status']!='1':

print('eror!')

return

#如果網格太大,遞歸查詢

if int(s['count'])>800:

print("too much!count is"+s['count'])

search_poi(x,y,divt/2,poi_type,1)

search_poi(x+divt/2,y,divt/2,poi_type,1)

search_poi(x,y+divt/2,divt/2,poi_type,1)

search_poi(x+divt/2,y+divt/2,divt/2,poi_type,1)

return

#這里可以按照需求,修改成存儲結果,我這里只做了輸出

print('now location:',x,y,divt,';now page:',page,'now api count:',api_count)

if len(s['pois'])>0:

for i in range(len(s['pois'])):

print(s['pois'][i]['name'],s['pois'][i]['typecode'],s['pois'][i]['location'])

#若不止一頁,查詢下一頁

if len(s['pois'])==25:

search_poi(x,y,divt,poi_type,page+1)

#main

keys = ['A','B','C','D','E','F','G','H','I','J']#自己申請的10個key

global keyi#當前使用的key編號

global api_count#每一個key調用api的次數

keyi = 0

api_count=0

div = 0.1 #設置網格大小

poi_type='150700'#當前搜索的POI類,具體參考

grid_jw = pd.read_csv('beijing_grid.csv',header=None) #保存的北京市網格數據

#對所有網格循環搜索POI

for index,rows in grid_jw.iterrows():

search_poi(rows[0],rows[1],div,poi_type,1)

(beijing_grid.csv存儲之前得到的所有網格的左小角的經緯度)

每次只需要改變POI類,關于這一編碼可以參考高德地圖POI分類編碼表;以及改變keyi,這個需要查看自己高德地圖控制臺的應用管理內的每一個KEY的額度。比如:

總結

以上是生活随笔為你收集整理的python高德地图poi点_python3爬虫-高德地图POI数据的爬取的全部內容,希望文章能夠幫你解決所遇到的問題。

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