本文示例程式碼已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
大家好我是費老師,我寫過很多篇介紹geopandas
相關技術的文章,而geopandas
之所以如此高效易用,成為Python GIS生態中的翹楚,離不開其底層依賴庫shapely
對其向量計算功能的支援。
不僅是作為geopandas
的基石,直接使用shapely
中極其豐富的各種向量操作API,也可以幫助我們輕鬆實現各種細緻入微的向量操作。而就在幾天前,shapely
釋出了其頗具里程碑意義的2.0
正式版本,為我們帶來了更加澎湃的運算效能提升,以及更穩定更豐富的新功能,今天的文章費老師我就來帶大家一覽shapely 2.0
版本中的主要新特性?。
2 shapely 2.0重要新特性一覽
通常我們不會專門去安裝shapely
,在安裝geopandas
的過程中它就順帶被安裝上了,在我的本地示例虛擬環境中shapely
原先的版本為1.8.5
,透過執行conda update shapely -c conda-forge -y
可將其穩定升級到2.0.0
以上的正式版本:
接下來我們來看看本次大的版本更新中帶來了哪些重要內容:
2.1 向量化向量操作帶來高達百倍的效能提升
新版shapely
重寫了底層對C++庫GEOS
的封裝方式,大幅度降低了冗餘計算成本,並且吸收了pygeos
中的底層邏輯,對各種常用介面進行ufunc向量化運算支援,使得我們可以配合numpy
快速實現,以contains()
為例,基於shapely
的頂級API介面:
在上面的例子中,相較於標量一對一運算和列表批次運算,新的向量化運算分別取得了500多倍和70多倍的運算加速?。
目前shapely
的所有頂級API,以及shapely.ops
等子模組下的頂級API均已支援向量化運算特性,具體見shapely
中的API文件是否如下圖所示提及ufunc
:
2.2 向量物件不可變
在以前的版本中,shapely
中的向量要素物件是可變的,譬如對於LineString
要素,可以在被建立後,透過為其coords
屬性賦值新的座標串資訊以改變其向量資訊:
而從2.0.0
開始,shapely
中所有的向量要素變為不可變物件,這意味著它們可hash,譬如可以作為字典的鍵,或pandas
分組運算的分組依據等:
2.3 向量要素類可作為頂級API使用
從上面的幾個例子中你也可以發現,新版shapely
中我們可以直接從shapely
匯入常用的各種向量要素類,這將作為from shapely.geometry import XXX
方式的備選方式:
2.4 多部件要素不再可視作序列型物件
在以前的版本中,多部件要素譬如MultiPoint
可以直接視作陣列物件來直接按位置索引或迭代,而從2.0.0
開始,原有的方式會引發錯誤,請注意更換為使用其geoms
屬性實現相關操作:
2.5 向量要素支援精度控制
從2.0.0
開始,shapely
新增API介面set_precision()
和get_precision()
用於針對向量要素進行座標精度設定和精度查詢,非常的方便:
2.6 基於GEOS新增大量新功能函式
隨著對底層GEOS
依賴庫的版本更新(當前依賴版本:3.11.1
),一大批新的實用功能函式得以被新增到shapely
中,由於數量非常眾多,下面我僅對其中的部分典型新功能函式做介紹:
- extract_unique_points()
透過新增的函式extract_unique_points()
,我們可以從指定要素中快速提取去重後的折點要素:
- node()
透過新增的函式node()
,我們可以輕鬆地從線要素中提取出彼此不交叉的片段:
- minimum_bounding_circle()與minimum_bounding_radius()
透過minimum_bounding_circle()
和minimum_bounding_radius()
我們可以快速得到目標要素的最小外接圓及其對應半徑:
- dwithin()
透過dwithin()
,我們可以快速判斷要素之間的距離是否小於所給定的閾值:
2.7 新增force_2d()、force_3d()函式
透過新增的快捷函式force_2d()
和force_3d()
,我們可以直接為指定要素移除/新增z軸資訊:
篇幅有限,本文只針對shapely 2.0
中一些比較重要的內容進行介紹,更多新特性請移步其更新說明文件頁:https://shapely.readthedocs.io/en/stable/release/2.x.html
以上就是本文的全部內容,歡迎在評論區與我進行討論~