用Python编写小工具下载OSM路网数据
文章來源于Python大數(shù)據(jù)分析,作者費(fèi)弗里
本文對(duì)應(yīng)腳本已上傳至Github倉庫:
https://github.com/CNFeffery/DataScienceStudyNotes[1]
1 簡(jiǎn)介
我們平時(shí)在數(shù)據(jù)可視化或空間數(shù)據(jù)分析的過程中,經(jīng)常會(huì)需要某個(gè)地區(qū)的道路網(wǎng)絡(luò)及節(jié)點(diǎn)數(shù)據(jù),而OpenStreetMap就是一個(gè)很好的數(shù)據(jù)來源(譬如圖1柏林路網(wǎng)):
圖1通常我們可以在openstreetmap[2]中選擇矩形區(qū)域內(nèi)的路網(wǎng)矢量數(shù)據(jù)進(jìn)行下載。
但這種方式對(duì)選擇區(qū)域的大小有一定限制,想獲取較大范圍區(qū)域的路網(wǎng)數(shù)據(jù)并下載比較費(fèi)事;
而另一種方式是事先下載已經(jīng)整合好的大區(qū)域的文件。
譬如在geofabrik[3] 中提供了各大洲、國家等大范圍的數(shù)據(jù)整合包,可以花費(fèi)一定時(shí)間將其下載下來,再在需要哪些小區(qū)域時(shí)在本地GIS軟件或編程工具中裁剪下所需的范圍路網(wǎng)。
但這種方式一是對(duì)電腦資源要求較高,譬如中國范圍路網(wǎng)信息shapefile文件大小達(dá)到了800多兆,二是OSM的路網(wǎng)信息不定期更新之后,要想及時(shí)跟上最新數(shù)據(jù),就需要人工持續(xù)下載數(shù)據(jù)。
為了更加靈活自由,且即時(shí)地獲取最新版本的OSM路網(wǎng),我們可以利用Python來編寫腳本工具,方便快捷地檢索或下載OSM可以識(shí)別出的各個(gè)級(jí)別行政區(qū)對(duì)應(yīng)的矢量格式數(shù)據(jù)。
2 基于Python的OSM路網(wǎng)下載
2.1 工作流程
編寫這個(gè)工具靈感來源于anvaka[4]網(wǎng)站:
圖2用戶通過輸入指定城市的名稱并檢索,等待數(shù)據(jù)資源加載完成之后就可以在網(wǎng)頁中看到渲染好的城市路網(wǎng)。
以重慶為例:
圖3通過對(duì)該網(wǎng)站進(jìn)行抓包和源碼分析,我弄明白了其工作流程大致如下:
Step1:
根據(jù)用戶輸入的城市名稱,利用OSM官方的API進(jìn)行模糊匹配,獲取可能的對(duì)象列表:
圖4Step2:
用戶點(diǎn)擊選擇正確的區(qū)域,后臺(tái)js對(duì)其所對(duì)應(yīng)的id信息進(jìn)行變換。
再通過網(wǎng)站自帶的API獲取對(duì)應(yīng)的.pbf格式數(shù)據(jù),或overpass的API獲取JSON格式的矢量數(shù)據(jù)。
圖5Step3:
渲染路網(wǎng):
圖6了解了上述步驟之后,我們利用requests、geopandas等庫僅用不到100行代碼就可以參考上述過程,提取所需的shapefile或GeoJSON文件保存到本地。
具體的代碼部分本文不做詳細(xì)說明,我將這部分功能封裝到文章開頭對(duì)應(yīng)Github倉庫下的OsmDownloader.py[5]中,可以自行去下載并使用。
下面我們來學(xué)習(xí)如何在Python中使用它。
2.2 使用方式
提示:請(qǐng)?zhí)崆鞍惭b完成requests、geopandas、pandas以及tqdm這幾個(gè)三方庫。
按照上文所述的地址下載對(duì)應(yīng)腳本之后,記住其所在路徑,接著在其他腳本開頭導(dǎo)入模塊部分添加:
import sys sys.path.append(r'所在路徑') from OsmDownloader import OsmDownloader這樣才能成功導(dǎo)入沒有在Python中注冊(cè)過的獨(dú)立模塊。
接下來我們來下載數(shù)據(jù),只需要兩行代碼即可完成對(duì)單個(gè)行政區(qū)路網(wǎng)數(shù)據(jù)的下載。
以成都市為例:
# 單個(gè)地區(qū)路網(wǎng)下載 downloader = OsmDownloader(area='成都市') # area參數(shù)控制檢索的行政區(qū),請(qǐng)盡量準(zhǔn)確填寫 downloader.download_shapefile(path='保存路徑') # path參數(shù)控制文件保存的路徑程序運(yùn)行后稍等片刻即可完成下載(具體的耗時(shí)取決于你的網(wǎng)絡(luò)狀況)。
譬如這里我花了不到20秒就完成成都市路網(wǎng)數(shù)據(jù)的下載:
圖7保存下來的數(shù)據(jù)線圖層與點(diǎn)圖層分開保存:
圖8圖9如果你想要下載保存JSON格式的數(shù)據(jù),換成downloader.download_geojson(path)即可。
而如果你想要批量下載多個(gè)地區(qū)的數(shù)據(jù),結(jié)合for循環(huán)即可,如下例:
# 多個(gè)地區(qū)路網(wǎng)下載 area_list = ['北京市', '重慶市江北區(qū)', 'Tokyo', 'Boston', '臺(tái)灣省'] for area in area_list:downloader = OsmDownloader(area=area)downloader.download_shapefile(path='保存路徑')等待一段時(shí)間后,我們area_list里多個(gè)不同級(jí)別行政區(qū)的路網(wǎng)數(shù)據(jù)便下載完成:
圖10如果擔(dān)心中途網(wǎng)絡(luò)連接原因?qū)е轮袛?#xff0c;可以結(jié)合Python中的錯(cuò)誤捕捉機(jī)制來進(jìn)行相對(duì)應(yīng)的處理,比較簡(jiǎn)單這里就不再贅述。
以上就是本文全部?jī)?nèi)容,對(duì)腳本獲取或使用有疑問的可以留言告訴我。
參考資料
[1]
https://github.com/CNFeffery/DataScienceStudyNotes: https://github.com/CNFeffery/DataScienceStudyNotes
[2]openstreetmap: https://www.openstreetmap.org/export
[3]geofabrik: http://download.geofabrik.de/
[4]anvaka: https://anvaka.github.io/city-roads/?q=
[5]OsmDownloader.py: https://github.com/CNFeffery/DataScienceStudyNotes/blob/master/(數(shù)據(jù)科學(xué)學(xué)習(xí)手札80)用Python編寫小工具下載OSM路網(wǎng)數(shù)據(jù)/OsmDownloader.py
-END-
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)在線手冊(cè)AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請(qǐng)回復(fù)“加群”獲取一折本站知識(shí)星球優(yōu)惠券,請(qǐng)回復(fù)“知識(shí)星球”喜歡文章,點(diǎn)個(gè)在看
總結(jié)
以上是生活随笔為你收集整理的用Python编写小工具下载OSM路网数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面试锦囊】14种模式搞定面试算法编程题
- 下一篇: 这三篇论文开源了!何恺明等人的Point