本文示例代碼及文件已上傳至我的
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()
很多人都知道著名的在線地圖可視化組件leaflet
在Python
中有對應的庫folium
,而在這次新版本中,geopandas
為GeoDataFrame
及GeoSeries
對象新增交互式地圖可視化方法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
變得更加好用和完善😇。
以上就是本文的全部內容,歡迎在評論區與我進行討論~