(數據科學學習手札129)geopandas 0.10版本重要新特性一覽


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

1 簡介

  就在前不久,我們非常熟悉的Python地理空間分析庫geopandas更新到了0.10.0版本,而伴隨最近一段時間其針對新版本的一些潛在bug進行的修復,寫作本文時最新的正式版本為0.10.2。此次0.10.x版本為我們帶來了諸多令人興奮的新功能新特性,本文就將帶大家一睹其中一些比較重要的內容😋。

2 geopandas 0.10版本重要新特性一覽

  如果你已經安裝了舊版本的geopandas,那么推薦執行下列命令進行geopandas的更新:

conda update geopandas -c https://mirror.sjtu.edu.cn/anaconda/cloud/conda-forge -y

  而如果你還沒有安裝geopandas,那么下面的安裝方式是最穩妥的:

conda install geopandas=0.10.2 -c https://mirror.sjtu.edu.cn/anaconda/cloud/conda-forge -y
pip uninstall rtree -y
pip install rtree -i https://pypi.douban.com/simple/
pip install pygeos -i https://pypi.douban.com/simple/

  安裝/更新完成后,檢驗一下geopandas是否被正確安裝:

  下面我們就來看看這次版本更新中有哪些重要新變動吧~

2.1 新增空間最近連接方法sjoin_nearest()

  我們都知道利用geopandas中的sjoin(),可以完成基於多種空間拓撲關系的空間連接操作。

  但有些時候我們需要判斷的並不是左右兩表中矢量列相交、包含等直接的拓撲關系,而是左右兩表矢量列之間距離至多xx米內,彼此距離最近的成對匹配結果,像這樣的空間距離關系判斷,這在舊版本的geopandas中,通常可以左右兩邊分別做緩沖區后進行常規空間連接,再分組進行距離計算,最后才能篩選出所需的結果,頗為麻煩。

  而這次新增的sjoin_nearest()就可以支持我們一步到位開展上述分析計算功能,它的主要參數有:

  • left_df:連接對應的左GeoDataFrame
  • right_df:連接對應的右GeoDataFrame
  • how:設置連接方式,可選的有'left''right''inner',默認為'inner'
  • max_distance:重要參數,用於設置最大搜索距離閾值,當矢量間的距離小於此閾值時才會進行連接
  • lsuffix:設置左表重名字段后綴文字,默認為'left'
  • rsuffix:設置右表重名字段后綴文字,默認為'right'
  • distance_col:設置連接結果表中記錄對應矢量間距離的字段名稱,默認不設置時不會在結果表中添加距離信息

  下面我們來通過一個簡單的例子來體驗這個功能:

import geopandas as gpd
from shapely.geometry import Point

# 構造示例點要素表1
gdf1 = gpd.GeoDataFrame(
    {
        'id1': list('abc'),
        'geometry': [
            Point(0, 0),
            Point(1, 0),
            Point(-1, 0)
        ]
    }
)

# 構造示例點要素表2
gdf2 = gpd.GeoDataFrame(
    {
        'id2': list('def'),
        'geometry': [
            Point(0.4, 0),
            Point(1.2, 0),
            Point(-1.3, 0)
        ]
    }
)

ax = gdf1.plot(color='red')
ax = gdf2.plot(color='green', ax=ax)
ax.axis('equal');

  顏色即用來區分我們的左右表對應矢量點位置,下面直接運用sjoin_nearest()進行空間最近連接,設置的距離閾值為0.35:

(
    gpd
    .sjoin_nearest(gdf1, gdf2, max_distance=0.35, distance_col='對應距離')
)

  非常的方便快捷:

2.2 新增交互地圖式數據探索方法explore()

  很多人都知道著名的在線地圖可視化組件leafletPython中有對應的庫folium,而在這次新版本中,geopandasGeoDataFrameGeoSeries對象新增交互式地圖可視化方法explore(),你可以理解為交互式版本的plot()方法。

  其參數設置較為豐富,我之后會單獨寫一篇文章來為大家介紹,下面展示一個簡單易懂的例子(注意,如果你的矢量數據非常大,請不要用此方法繪圖,在線地圖方式適合較小的矢量數據):

provinces = gpd.read_file('省.shp')
provinces.head(3)
...
provinces.explore(
    column='類型', 
    zoom_start=4
)

2.3 sjoin()、sjoin_nearest()、overlay()和clip()亦可作為GeoDataFrame的方法來使用

  在以前的版本中,我們只能使用gpd.XXX()的方式來使用sjoin()overlay()clip()等方法,而在這次新版本更新中,我們可以像pandas里的merge()join()那樣作為方法使用,好處就是可以更好的書寫鏈式運算過程啦🥳!以上文介紹的sjoin_nearest()為例,只需向sjoin_nearest()方法中傳入右表即可:

(
    gdf1
    .sjoin_nearest(gdf2, 
                   max_distance=0.35, 
                   distance_col='對應距離')
)

2.4 GeoSeries新增批量XY轉點方法from_xy()

  新版本中為GeoSeries對象新增了from_xy()方法來快速實現坐標轉點,下面與gpd.points_from_xy()的效果進行對比:

gpd.points_from_xy(x=range(10), y=range(10))
...
gpd.GeoSeries.from_xy(x=range(10), y=range(10))

2.5 to_file()方法在driver參數缺省時可自動識別導出文件類型

  在新版本中,若未在to_file()中指定driver參數,geopandas會自動根據文件后綴名來自動推斷要導出的矢量文件類型:

import os

gdf1.to_file('test.shp')

gdf1.to_file('test.geojson')

[file for file in os.listdir() if 'test.' in file]

2.6 支持對矢量數據自動推斷合適的橫軸墨卡托坐標參考系

  其實這個特性在0.9版本中就已加入,但是還有一些小問題,而新版本中這個功能更加完善,效果如下:

2.7 sjoin()中的op參數改名為predicate

  為了讓參數名更加的貼切,在以前版本sjoin()中用於設置拓撲關系的參數op在這次新版本中被改名為predicate,大家在使用時要留意:


  大家在了解到這些新功能和變動后,在使用新版geopandas時,如果遇到未知bug,歡迎在https://github.com/geopandas/geopandas/issues及時提交說明,一起幫助geopandas變得更加好用和完善😇。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM