python抓取某城市全部道路名稱信息
引子
這兩天碰到一個需求,要獲取某個城市所有道路的車輛通行速度。首先自然是想到用高德或百度的Web服務(wù) API 來請求交通路況信息,結(jié)果一看高德的交通態(tài)勢服務(wù)API從2020年12月31日起就下線了,遂轉(zhuǎn)而奔向百度,百度的實時路況查詢服務(wù)倒是還能用,但是在使用上確有許多限制,主要是檢索限定范圍太小,無法通過直接設(shè)置矩形范圍查詢區(qū)域內(nèi)所有道路路況信息,最終想到如果能獲取該城市的所有道路名稱信息,直接根據(jù)道路名去請求接口,就能又準(zhǔn)又全的采集所有道路通行狀況數(shù)據(jù)。所以,就有了本次標(biāo)題的目標(biāo):怎么獲取城市全部道路名稱信息?
思路
在網(wǎng)上一番檢索,并未直接找到有收錄城市所有道路名的網(wǎng)站,還是太天真了。最終還是選擇了從百度自身下手,百度Web服務(wù)是提供POI檢索的,道路也算是POI的一種,所以可以通過這種曲線救國的方式,來實現(xiàn)道路名稱信息的抓取,具體步驟如下:
1.確定檢索范圍,也就是待查詢區(qū)域的經(jīng)緯度邊界,這個可以網(wǎng)上搜。如果有對應(yīng)區(qū)域的地理空間數(shù)據(jù),也可以在ArcGIS內(nèi)以查看坐標(biāo)信息的形式獲取經(jīng)緯度。
2.確定檢索形式,百度提供行政區(qū)劃區(qū)域檢索、圓形區(qū)域檢索、矩形區(qū)域檢索、地點詳情檢索四種POI檢索形式,最理想的是矩形區(qū)域檢索,但該檢索功能已不再免費(fèi)對外開放,所以退而求其次,選擇圓形區(qū)域檢索,盡可能多的獲取道路相關(guān)POI信息。
3.確定檢索步長,圓形檢索是通過設(shè)定好中心坐標(biāo)點,并按設(shè)定半徑來請求該圓形區(qū)域內(nèi)的所有道路名稱,由于半徑不可能無限延伸,所以要把第一步確定的矩形范圍分解成多個小圓形范圍,來分批次請求檢索結(jié)果。
4.編寫實現(xiàn)代碼,代碼實現(xiàn)過程比較簡單,需要主要是獲取道路信息后逐一保存。
實現(xiàn)
實現(xiàn)代碼如下,寫的比較糙,不過能用。
f = open('F:\\路名信息.json', 'w+') #經(jīng)緯度范圍設(shè)置,按每次偏移兩公里來移動檢索圓心 for lat in np.arange(30.895038,31.424064,0.02): ? ? ? ? for long in np.arange(107.183609,107.800848,0.02): ? ? ? ? ? ? latstr=str(lat) ? ? ? ? ? ? longstr=str(long) ? ? ? ? ? ? bounds=latstr+','+longstr ? ? ? ? ? ? #query的參數(shù)值設(shè)為道路,檢索半徑設(shè)置為2公里 ? ? ? ? ? ? api= "http://api.map.baidu.com/place/v2/search?query=道路&location={0}&radius=2000&output=json&ak={你的開發(fā)者秘鑰}".format(bounds) ? ? ? ? ? ? r = requests.get(api, headers={'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)','Connection': 'close'}, timeout=(5, 5)) ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? result=r.json() ? ? ? ? ? ? ? ? #是否成功返回結(jié)果 ? ? ? ? ? ? ? ? if result['status'] == 0: ? ? ? ? ? ? ? ? ? ? #是否包含路況信息 ? ? ? ? ? ? ? ? ? ? results = result['results'] ? ? ? ? ? ? ? ? ? ? if len(results) != 0: ? ? ? ? ? ? ? ? ? ? ? ? for road in results: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #每條路的json文件單獨保存 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print(json.dumps(road, ensure_ascii=False)) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? f.write(json.dumps(road, ensure_ascii=False,indent=4)) ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? print('哇塞,出錯了') ? ? ? ? ? ? ? ? continue f.close()
結(jié)果
最后請求得到的道路信息類似如下格式,可以看到當(dāng)我們以道路作為檢索關(guān)鍵字來請求POI時,確實能夠獲取道路的詳細(xì)信息,但是也有一些非標(biāo)準(zhǔn)道路名稱結(jié)果被檢索到,比如某某路口這種。所以,如果再對數(shù)據(jù)做一遍清洗修正,應(yīng)該能得到更多道路名稱信息??傊ㄟ^POI這種形式來獲取城市所有道路名是有一定可操作性的,但在數(shù)據(jù)的全量性上還沒法完全保證,需要進(jìn)一步優(yōu)化該方法,以后有時間再研究研究。
{ "name": "踏水橋", "location": { "lat": 30.908352, "lng": 107.244304 }, "address": "四川省達(dá)州市大竹縣", "province": "四川省", "city": "達(dá)州市", "area": "大竹縣", "detail": 0, "uid": "ce658bf70958ecccda13183b" }, { "name": "華農(nóng)街/將軍西街(路口)", "location": { "lat": 30.90876, "lng": 107.241049 }, "address": "達(dá)州市大竹縣X168", "province": "四川省", "city": "達(dá)州市", "area": "大竹縣", "detail": 1, "uid": "2355baab46ba127551e5c541" }, { "name": "將軍西街", "location": { "lat": 30.911387, "lng": 107.243157 }, "address": "四川省達(dá)州市大竹縣", "province": "四川省", "city": "達(dá)州市", "area": "大竹縣", "detail": 0, "uid": "09979f7c1c1aa5cb09f5eb47" }, ......
到此這篇關(guān)于python抓取某城市全部道路名稱信息的文章就介紹到這了,更多相關(guān)python抓取道路信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Numpy創(chuàng)建數(shù)組和隨機(jī)數(shù)組的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了Numpy創(chuàng)建數(shù)組和隨機(jī)數(shù)組的方法小結(jié),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,具有一定的參考價值,需要的可以參考一下2023-11-11使用實現(xiàn)python連接hive數(shù)倉的示例代碼
這篇文章主要為大家詳細(xì)介紹了使用實現(xiàn)python連接hive數(shù)倉的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03Python字典常見操作實例小結(jié)【定義、添加、刪除、遍歷】
這篇文章主要介紹了Python字典常見操作,結(jié)合實例形式總結(jié)分析了Python字典的定義、添加、刪除、遍歷等常見使用技巧與操作注意事項,需要的朋友可以參考下2019-10-10python使用Plotly創(chuàng)建交互式數(shù)據(jù)可視化的操作步驟
Python 的 Plotly 庫是創(chuàng)建這種交互式可視化的強(qiáng)大工具,它提供了豐富的圖表類型和易于使用的接口,本文將探討如何使用 Plotly 創(chuàng)建交互式數(shù)據(jù)可視化,包括代碼實例和深入的解釋,需要的朋友可以參考下2024-08-08