(數據科學學習手札140)詳解geopandas中基於pyogrio的矢量讀寫引擎

本文示例代碼已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes

1 簡介

  大家好我是費老師,前不久我在一篇文章中給大家分享過geopandas在其0.11版本中爲我們帶來的一些重要新特性,其中提到過新的矢量讀寫後端,使得我們在read_file()以及to_file()中添加參數engine='pyogrio'即可獲得500%的性能提升。

  而新引擎帶來的不僅是性能上的大幅提升,還帶來了諸多實用功能以方便我們讀寫常見矢量文件,今天我就來給大家詳細介紹這些新功能。

2 詳解geopandas中的pyogrio讀寫引擎

  geopandas0.11版本之後新增的pyogrio引擎,基於geopandas團隊開發的同名Python庫,其基於OGR,而OGR則是著名的開源柵格空間數據轉換框架GDAL的重要分支庫,專注於矢量數據的高性能轉換。

2.1 基於pyogrio的矢量文件讀取

  對於0.11及以後版本的geopandas,向read_file()中傳入engine='pyogrio'後,即可切換至底層基於pyogrio.read_dataframe()的讀取引擎,獲取大幅度性能提升的同時也擁有了衆多的新功能參數,其中比較實用的有:

2.1.1 利用columns參數指定需要讀入的字段

  開啓pyogrio引擎後,我們可以通過設置參數columns來讀入指定的若干字段,當你的矢量文件有很多無關緊要的字段時,可以利用此特性來整潔數據以及減少讀入數據的內存消耗:

2.1.2 利用read_geometry參數設置是否忽略矢量列

  如果你不需要矢量文件中的矢量信息,只需要將其當作普通表格數據進行讀入,開啓pyogrio引擎後,設置read_geometry=False即可,所形成對象的類型也會變爲普通的DataFrame

2.1.3 利用force_2d參數強制忽略z軸信息

  有些情況下,矢量數據中的座標信息帶有z軸高度信息,如果分析過程中用不上該維度信息,可以在開啓pyogrio引擎後設置force_2d=True強制轉換爲2D矢量,非常方便:

2.1.4 利用skip_features與max_features參數控制讀入數據規模

  在開啓pyogrio引擎後,通過設置參數skip_features可以控制從數據第0行開始需要跳過的要素記錄數量:

  而通過設置參數max_features則可以控制最多讀取多少行要素記錄,當我們的矢量文件記錄行很多,而我們又只想簡單查看幾行看看數據長什麼樣時,這個參數就很實用了:

2.1.5 利用參數where對矢量文件進行條件過濾

  這個新特性非常實用,我們可以像寫SQL查詢語句那樣傳入我們的過濾條件,從而幫助我們在讀取數據時就實現比較豐富自由的條件過濾效果,值得注意的是,針對中文等由unicode字符構成的字段名,需要將其包裹在""中進行定義,參考下圖中我的做法:

2.1.6 利用sql參數在原數據上直接進行sql查詢

  前面我們介紹了多種用於過濾原數據的實用參數,而在在開啓pyogrio引擎後還有個非常實用的參數sql,可以幫助我們直接書寫SQL語句對原數據進行提取(注意,其執行順序先於上述其他過濾類參數):

  但要注意的是,目前pyogrio引擎的sql參數,在讀取諸如含有中文等unicode字符信息的shapefile文件時,不能正常的解析內容,而針對GeoJSONgpkg等其他格式矢量文件時則一切正常:

  • GeoJSON文件正常
  • gpkg文件正常
  • shapefile文件亂碼,親測即使指定encoding也無效

  所以現階段建議讀取shapefile文件時,可以使用columns+where的組合方式代替sql以實現同樣的效果。

2.2 基於pyogrio的矢量文件寫出

  相較於文件的讀取,新引擎中涉及文件寫出的功能參數就寡淡很多,只發現一個比較特別的promote_to_multi參數,用於強制將單部件要素轉換爲多部件要素:

2.3 pyogrio引擎支持的所有矢量文件類型

  你可以通過pyogrio.list_drivers()查看新引擎所支持的全部矢量文件格式,基本上只有你想不到沒有它覆蓋不到😂:

  更多相關內容,可以前往https://pyogrio.readthedocs.io/en/latest/api.html?#geopandas-integration閱讀了解更多。


  以上就是本文的全部內容,歡迎在評論區與我進行討論~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章