當前位置: 妍妍網 > 碼農

Python GIS神器geopandas 1.0版本來了

2024-06-25碼農

添加微訊號 " CNFeffery "

備註 " 數據分析 " 入技術交流群

本文完整程式碼及附件已上傳至我的 Github 倉庫https://github.com/CNFeffery/DataScienceStudyNotes

1 簡介

大家好我是費老師,就在昨天, Python 生態中著名的 GIS 分析庫 geopandas 釋出了其 1.0.0 正式版本。

歷經10年叠代升級, geopandas 充分完善了其在 GIS 數據分析上的功能,使得我們可以使用類似 pandas 的操作方式,便捷且高效能的開展各種常用的 GIS 分析運算,極大增強了 Python GIS 分析領域的能力。

今天的文章,費老師我就將帶大家一起快速了解在全新的 1.0 版本中,新的功能特性、最佳化提升以及相關API的變動情況🚀~

2 geopandas 1.0版本介紹

如果你還未曾安裝使用過 geopandas ,我最推薦的方式是新建虛擬環境,並在虛擬環境中透過 conda-forge 源進行穩定安裝,以當下非常流行的開源環境管理工具 mamba (可參考我所寫的教程

mamba使用教程

公眾號:Python大數據分析

)為例,在終端執行下列命令(目前推薦 Python 版本為3.9),靜靜等待,即可一步到位完成最新版 geopandas 的安裝:

mamba create -n geopandas-env python=3.9 -y && mamba activate geopandas-env && mamba install geopandas -y

而如果你已經安裝了先前版本的 geopandas ,那麽在你的對應環境下,終端執行下列命令即可進行版本升級:

mamba update geopandas -y

新安裝或升級完成後,檢查一下版本變化,成功升級到 1.0.0 版本🥳:

2.1 新增API介紹

首先我們來了解一下新版本 geopandas 中新增的部份主要的API:

2.1.1 新增count_geometries()方法

新增方法 count_geometries() ,用於針對多部件要素計算單體要質數量:

2.1.2 新增count_interior_rings()方法

新增方法 count_interior_rings() ,用於針對多邊形要素計算內環數量:

2.1.3 新增relate_pattern()方法

新增方法 relate_pattern() ,用於計算要素之間是否滿足特定的 DE-9IM (一種分別計算成對要素在內部、邊界、外部兩兩之間相交相離狀態的復雜空間模型)空間關系,具體的原理細節較多,我會在之後單獨撰文介紹,下面僅演示 relate_pattern() 的使用範例:

2.1.4 新增interp_all()方法

新增方法 interp_all() ,用於計算向量列中全體要素的公共相交部份:

2.1.5 新增line_merge()方法

新增方法 line_merge() ,用於快速合並一系列端點相交的線要素:

2.1.6 新增set_precision()、get_precision()方法

新增方法 set_precision() get_precision() ,用於設定及獲取向量列的座標精度大小:

2.1.7 新增count_coordinates()方法

新增方法 count_coordinates() ,用於快速計算向量列各要素座標點數量:

2.1.8 新增is_ccw內容方法

新增內容方法 is_ccw ,用於針對座標點數量大於等於4個的線要素,判斷其座標串方向是否符合逆時針方向:

2.1.9 新增is_closed內容方法

新增內容方法 is_closed ,用於判斷線要素是否起點終點相同:

2.1.10 新增force_2d()、force_3d()方法

新增方法 force_2d() force_3d() ,用於將向量列強制去除z軸座標、強制添加z軸座標:

2.1.11 新增voronoi_polygons()方法

新增方法 voronoi_polygons() ,用於基於整體向量列的所有頂點,快速生成泰森多邊形:

2.1.12 新增contains_properly()方法

新增方法 contains_properly() ,用於快捷判斷向量A是否嚴格包含向量B,與 contains() 方法的區別是, contains_properly() 不允許作比較的向量間有任何公共點:

2.1.13 新增build_area()方法

新增方法 build_area() ,用於基於一系列可以構成閉合面要素的線要素,整體生成合法的若幹多邊形:

2.1.14 新增snap()方法

新增方法 snap() ,用於將滿足距離閾值要求的要素A掛靠到對應的要素B之上:

2.1.15 新增transform()方法

新增方法 transform() ,用於基於自訂座標偏移函式,實作對向量要素的座標轉換,其中自訂函式的輸入為N行2列後N行3列的 numpy 陣列,輸出形狀與輸入一致即可,我們可以配合 numpy 中的 apply_along_axis() 實作自由的座標點級別轉換計算,而無需關心輸入的要素是點線面中的哪種:

2.1.16 新增get_geometry()方法

新增方法 get_geometry() ,用於將向量列各要素視作多部件要素,進行快捷位序索引:

2.1.17 新增dwithin()方法

新增方法 dwithin() ,用於快速判斷向量A是否在向量B目標的指定距離內:

2.1.18 新增to_geo_dict()方法

新增方法 to_geo_dict() ,用於將 GeoDataFrame 快捷轉化為 GeoJSON 格式字典數據結構:

2.2 功能增強

接下來我們來了解新版本中獲得功能增強的一些主要API:

2.2.1 空間連線新增dwithin型空間關系判斷

針對 sjoin() 方法,新增了 dwithin 型空間關系判斷,使得我們可以在 geopandas 中真正意義上直接實作「匹配與目標要素距離在XXX以內的紀錄行」:

2.2.2 配合pd.read_csv指定向量列型別

在新版本中,我們可以將 GeoDataFrame 寫出為 csv 格式,並在使用 pd.read_csv() 讀取時,透過 dtype 參數將對應列指定解析為向量型別:

2.2.3 to_json()新增參數show_bbox、drop_id、to_wgs84

針對 GeoDataFrame.to_json() ,新增參數 show_bbox drop_id to_wgs84 ,實作更為客製化的 GeoJSON 轉化:

demo_gdf = gpd.GeoDataFrame(
{
'name': ['範例要素'],
'geometry': [Point(10629)]
},
crs='EPSG:4524'
)
print(demo_gdf.to_json(
ensure_ascii=False,
indent=4,
show_bbox=True,
drop_id=True,
to_wgs84=False
))

2.2.4 空間連線新增參數on_attribute

針對 GeoDataFrame.sjoin() ,新增參數 on_attribute ,用於額外施加常規表連線中的指定欄位相等條件,相當於設定有效的 on_attribute 參數後,空間連線的結果將既滿足空間關系,又滿足欄位匹配關系:

2.3 標記為廢棄的API

新版本中也新增了一系列標記為廢棄的API,將會在未來某個版本正式移除,請註意及時調整你的相關程式碼邏輯,其中主要的有:

  • unary_union 將廢棄,更換為 union_all()

  • use_pygeos 將廢棄並在 1.1 版本中正式移除

  • 由於 pygeos 已經合並入 geopandas 底層向量計算所依賴的新版 shapely 中,因此對應的 use_pygeos 設定項也將結束歷史舞台:

  • crs 內容賦值以修改座標系的方式將在未來版本被禁用,請統一使用 set_crs() 代替

  • 篇幅有限,未能詳盡介紹全部新版本內容,完整的更新日誌請移步: https://github.com/geopandas/geopandas/releases/tag/v1.0.0

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

    加入知識星球 【我們談論數據科學】

    600+ 小夥伴一起學習!

    · 推薦閱讀 ·