日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

用Python编写小工具下载OSM路网数据

發(fā)布時(shí)間:2025/3/8 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Python编写小工具下载OSM路网数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章來(lái)源于Python大數(shù)據(jù)分析,作者費(fèi)弗里

本文對(duì)應(yīng)腳本已上傳至Github倉(cāng)庫(kù):
https://github.com/CNFeffery/DataScienceStudyNotes[1]

1 簡(jiǎn)介

我們平時(shí)在數(shù)據(jù)可視化或空間數(shù)據(jù)分析的過(guò)程中,經(jīng)常會(huì)需要某個(gè)地區(qū)的道路網(wǎng)絡(luò)及節(jié)點(diǎn)數(shù)據(jù),而OpenStreetMap就是一個(gè)很好的數(shù)據(jù)來(lái)源(譬如圖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] 中提供了各大洲、國(guó)家等大范圍的數(shù)據(jù)整合包,可以花費(fèi)一定時(shí)間將其下載下來(lái),再在需要哪些小區(qū)域時(shí)在本地GIS軟件或編程工具中裁剪下所需的范圍路網(wǎng)。

但這種方式一是對(duì)電腦資源要求較高,譬如中國(guó)范圍路網(wǎng)信息shapefile文件大小達(dá)到了800多兆,二是OSM的路網(wǎng)信息不定期更新之后,要想及時(shí)跟上最新數(shù)據(jù),就需要人工持續(xù)下載數(shù)據(jù)。

為了更加靈活自由,且即時(shí)地獲取最新版本的OSM路網(wǎng),我們可以利用Python來(lái)編寫腳本工具,方便快捷地檢索或下載OSM可以識(shí)別出的各個(gè)級(jí)別行政區(qū)對(duì)應(yīng)的矢量格式數(shù)據(jù)。

2 基于Python的OSM路網(wǎng)下載

2.1 工作流程

編寫這個(gè)工具靈感來(lái)源于anvaka[4]網(wǎng)站:

圖2

用戶通過(guò)輸入指定城市的名稱并檢索,等待數(shù)據(jù)資源加載完成之后就可以在網(wǎng)頁(yè)中看到渲染好的城市路網(wǎng)。

以重慶為例:

圖3

通過(guò)對(duì)該網(wǎng)站進(jìn)行抓包和源碼分析,我弄明白了其工作流程大致如下:

  • Step1:

根據(jù)用戶輸入的城市名稱,利用OSM官方的API進(jìn)行模糊匹配,獲取可能的對(duì)象列表:

圖4
  • Step2:

用戶點(diǎn)擊選擇正確的區(qū)域,后臺(tái)js對(duì)其所對(duì)應(yīng)的id信息進(jìn)行變換。

再通過(guò)網(wǎng)站自帶的API獲取對(duì)應(yīng)的.pbf格式數(shù)據(jù),或overpass的API獲取JSON格式的矢量數(shù)據(jù)。

圖5
  • Step3:

渲染路網(wǎng):

圖6

了解了上述步驟之后,我們利用requests、geopandas等庫(kù)僅用不到100行代碼就可以參考上述過(guò)程,提取所需的shapefile或GeoJSON文件保存到本地。

具體的代碼部分本文不做詳細(xì)說(shuō)明,我將這部分功能封裝到文章開頭對(duì)應(yīng)Github倉(cāng)庫(kù)下的OsmDownloader.py[5]中,可以自行去下載并使用。

下面我們來(lái)學(xué)習(xí)如何在Python中使用它。

2.2 使用方式

提示:請(qǐng)?zhí)崆鞍惭b完成requests、geopandas、pandas以及tqdm這幾個(gè)三方庫(kù)。

按照上文所述的地址下載對(duì)應(yīng)腳本之后,記住其所在路徑,接著在其他腳本開頭導(dǎo)入模塊部分添加:

import sys sys.path.append(r'所在路徑') from OsmDownloader import OsmDownloader

這樣才能成功導(dǎo)入沒有在Python中注冊(cè)過(guò)的獨(dú)立模塊。

接下來(lái)我們來(lái)下載數(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

保存下來(lái)的數(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ī)制來(lái)進(jìn)行相對(duì)應(yīng)的處理,比較簡(jiǎn)單這里就不再贅述。

以上就是本文全部?jī)?nèi)容,對(duì)腳本獲取或使用有疑問(wèn)的可以留言告訴我。

參考資料

[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)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。