(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

費弗裡發表於2022-12-17

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

1 簡介

  大家好我是費老師,我寫過很多篇介紹geopandas相關技術的文章,而geopandas之所以如此高效易用,成為Python GIS生態中的翹楚,離不開其底層依賴庫shapely對其向量計算功能的支援。

  不僅是作為geopandas的基石,直接使用shapely中極其豐富的各種向量操作API,也可以幫助我們輕鬆實現各種細緻入微的向量操作。而就在幾天前,shapely釋出了其頗具里程碑意義的2.0正式版本,為我們帶來了更加澎湃的運算效能提升,以及更穩定更豐富的新功能,今天的文章費老師我就來帶大家一覽shapely 2.0版本中的主要新特性?。

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

2 shapely 2.0重要新特性一覽

  通常我們不會專門去安裝shapely,在安裝geopandas的過程中它就順帶被安裝上了,在我的本地示例虛擬環境中shapely原先的版本為1.8.5,透過執行conda update shapely -c conda-forge -y可將其穩定升級到2.0.0以上的正式版本:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

  接下來我們來看看本次大的版本更新中帶來了哪些重要內容:

2.1 向量化向量操作帶來高達百倍的效能提升

  新版shapely重寫了底層對C++庫GEOS的封裝方式,大幅度降低了冗餘計算成本,並且吸收了pygeos中的底層邏輯,對各種常用介面進行ufunc向量化運算支援,使得我們可以配合numpy快速實現,以contains()為例,基於shapely的頂級API介面:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

  在上面的例子中,相較於標量一對一運算列表批次運算,新的向量化運算分別取得了500多倍和70多倍的運算加速?。

  目前shapely的所有頂級API,以及shapely.ops等子模組下的頂級API均已支援向量化運算特性,具體見shapely中的API文件是否如下圖所示提及ufunc

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

2.2 向量物件不可變

  在以前的版本中,shapely中的向量要素物件是可變的,譬如對於LineString要素,可以在被建立後,透過為其coords屬性賦值新的座標串資訊以改變其向量資訊:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

  而從2.0.0開始,shapely中所有的向量要素變為不可變物件,這意味著它們可hash,譬如可以作為字典的鍵,或pandas分組運算的分組依據等:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

2.3 向量要素類可作為頂級API使用

  從上面的幾個例子中你也可以發現,新版shapely中我們可以直接從shapely匯入常用的各種向量要素類,這將作為from shapely.geometry import XXX方式的備選方式:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

2.4 多部件要素不再可視作序列型物件

  在以前的版本中,多部件要素譬如MultiPoint可以直接視作陣列物件來直接按位置索引或迭代,而從2.0.0開始,原有的方式會引發錯誤,請注意更換為使用其geoms屬性實現相關操作:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

2.5 向量要素支援精度控制

  從2.0.0開始,shapely新增API介面set_precision()get_precision()用於針對向量要素進行座標精度設定和精度查詢,非常的方便:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

2.6 基於GEOS新增大量新功能函式

  隨著對底層GEOS依賴庫的版本更新(當前依賴版本:3.11.1),一大批新的實用功能函式得以被新增到shapely中,由於數量非常眾多,下面我僅對其中的部分典型新功能函式做介紹:

  • extract_unique_points()

  透過新增的函式extract_unique_points(),我們可以從指定要素中快速提取去重後的折點要素:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽
  • node()

  透過新增的函式node(),我們可以輕鬆地從線要素中提取出彼此不交叉的片段:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽
  • minimum_bounding_circle()與minimum_bounding_radius()

  透過minimum_bounding_circle()minimum_bounding_radius()我們可以快速得到目標要素的最小外接圓及其對應半徑:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽
  • dwithin()

  透過dwithin(),我們可以快速判斷要素之間的距離是否小於所給定的閾值:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

2.7 新增force_2d()、force_3d()函式

  透過新增的快捷函式force_2d()force_3d(),我們可以直接為指定要素移除/新增z軸資訊:

(資料科學學習手札147)Python GIS利器shapely全新2.0版本一覽

  篇幅有限,本文只針對shapely 2.0中一些比較重要的內容進行介紹,更多新特性請移步其更新說明文件頁:https://shapely.readthedocs.io/en/stable/release/2.x.html


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

相關文章