<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Python編寫小工具下載OSM路網(wǎng)數(shù)據(jù)

          共 2435字,需瀏覽 5分鐘

           ·

          2020-04-04 23:25


          1 簡介

          我們平時(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)):

          80bb20ea759d1c94c4b3fe3096fedc85.webp圖1

          通常我們可以在openstreetmap[2]中選擇矩形區(qū)域內(nèi)的路網(wǎng)矢量數(shù)據(jù)進(jìn)行下載。

          但這種方式對選擇區(qū)域的大小有一定限制,想獲取較大范圍區(qū)域的路網(wǎng)數(shù)據(jù)并下載比較費(fèi)事;

          而另一種方式是事先下載已經(jīng)整合好的大區(qū)域的文件。

          譬如在geofabrik[3] 中提供了各大洲、國家等大范圍的數(shù)據(jù)整合包,可以花費(fèi)一定時(shí)間將其下載下來,再在需要哪些小區(qū)域時(shí)在本地GIS軟件或編程工具中裁剪下所需的范圍路網(wǎng)。

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

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

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

          2.1 工作流程

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

          50984d73841b4741704fc98a3e234b18.webp圖2

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

          以重慶為例:

          59f59fec48c0133c6810f152df19fe54.webp圖3

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

          • Step1:

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

          0ea86ba3fcb857f863486d46c2f45259.webp圖4
          • Step2:

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

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

          7e18c48efc735ec48644d776115c58e6.webp圖5
          • Step3:

          渲染路網(wǎng):

          59f59fec48c0133c6810f152df19fe54.webp圖6

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

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

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

          2.2 使用方式

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

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

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

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

          接下來我們來下載數(shù)據(jù),只需要兩行代碼即可完成對單個(gè)行政區(qū)路網(wǎng)數(shù)據(jù)的下載。

          以成都市為例:

          # 單個(gè)地區(qū)路網(wǎng)下載
          downloader = OsmDownloader(area='成都市') # area參數(shù)控制檢索的行政區(qū),請盡量準(zhǔn)確填寫
          downloader.download_shapefile(path='保存路徑') # path參數(shù)控制文件保存的路徑

          程序運(yùn)行后稍等片刻即可完成下載(具體的耗時(shí)取決于你的網(wǎng)絡(luò)狀況)。

          譬如這里我花了不到20秒就完成成都市路網(wǎng)數(shù)據(jù)的下載:

          c1606dc16cfd7c7cd19241899ef7001f.webp圖7

          保存下來的數(shù)據(jù)線圖層與點(diǎn)圖層分開保存:

          052b4bff99e9e5a076333fbaf048118c.webp圖8c0a9dc350233ba775e1cd75b8a1f074d.webp圖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ù)便下載完成:

          a8ad91d0220d55add0fd4eb52a06eecc.webp圖10

          如果擔(dān)心中途網(wǎng)絡(luò)連接原因?qū)е轮袛?,可以結(jié)合Python中的錯(cuò)誤捕捉機(jī)制來進(jìn)行相對應(yīng)的處理,比較簡單這里就不再贅述。

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

          參考資料

          [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

          本文對應(yīng)腳本已上傳至我的Github倉庫:
          https://github.com/CNFeffery/DataScienceStudyNotes

          -END-


          往期精彩

          Python 四大主流 Web 編程框架

          為什么你現(xiàn)在必須遷移到Python 3?

          推薦一些能提高生產(chǎn)力的 Python 庫

          Excel VS Python 誰更適合數(shù)據(jù)分析?

          硬核!30 張圖解 HTTP 常見的面試題

          10個(gè)省時(shí)間的 PyCharm 技巧

          python每日更換“必應(yīng)圖片”為“桌面壁紙”


          END

          關(guān)注【程序IT圈】,更多的Python好文輸出

          瀏覽 97
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲无码免费视频在线观看 | 亚欧洲精品视频 | 国产精品豆花视频www | 1区2区综合 | 曰本大香蕉视频 |