geopandas 0.10版本重磅新特性一覽

添加微信號"CNFeffery"加入技術交流群
?本文示例代碼及文件已上傳至我的
?Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
就在前不久,我們非常熟悉的Python地理空間分析庫geopandas更新到了0.10.0版本,而伴隨最近一段時間其針對新版本的一些潛在bug進行的修復,寫作本文時最新的正式版本為0.10.2。此次0.10.x版本為我們帶來了諸多令人興奮的新功能新特性,本文就將帶大家一睹其中一些比較重要的內(nèi)容??。

2 geopandas 0.10版本重要新特性一覽
如果你已經(jīng)安裝了舊版本的geopandas,那么推薦執(zhí)行下列命令進行geopandas的更新:
conda?update?geopandas?-c?https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge?-y
而如果你還沒有安裝geopandas,那么下面的安裝方式是最穩(wěn)妥的:
conda?install?geopandas=0.10.2?-c?https://mirrors.sjtug.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中,通常可以左右兩邊分別做「緩沖區(qū)」后進行「常規(guī)空間連接」來實現(xiàn)。
而這次新增的sjoin_nearest()就可以支持我們開展上述分析計算功能,它的主要參數(shù)有:
「left_df」:連接對應的左 GeoDataFrame「right_df」:連接對應的右 GeoDataFrame「how」:設置連接方式,可選的有 'left'、'right'及'inner',默認為'inner'「max_distance」:重要參數(shù),用于設置最大搜索距離閾值,當矢量間的距離小于此閾值時才會進行連接 「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');

顏色即用來區(qū)分我們的左右表對應矢量點位置,下面直接運用sjoin_nearest()進行空間最近連接,設置的距離閾值為0.35:
(
????gpd
????.sjoin_nearest(gdf1,?gdf2,?max_distance=0.35,?distance_col='對應距離')
)
非常的方便快捷:

2.2 新增交互地圖式數(shù)據(jù)探索方法explore()
很多人都知道著名的在線地圖可視化組件leaflet在Python中有對應的庫folium,而在這次新版本中,geopandas為GeoDataFrame及GeoSeries對象新增交互式地圖可視化方法explore(),你可以理解為交互式版本的plot()方法。
其參數(shù)設置較為豐富,我之后會單獨寫一篇文章來為大家介紹,下面展示一個簡單易懂的例子(注意,如果你的矢量數(shù)據(jù)非常大,請「不要」用此方法繪圖,在線地圖方式適合較小的矢量數(shù)據(jù)):
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轉(zhuǎn)點方法from_xy()
新版本中為GeoSeries對象新增了from_xy()方法來快速實現(xiàn)坐標轉(zhuǎn)點,下面與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參數(shù)缺省時可自動識別導出文件類型
在新版本中,若未在to_file()中指定driver參數(shù),geopandas會自動根據(jù)文件后綴名來自動推斷要導出的矢量文件類型:
import?os
gdf1.to_file('test.shp')
gdf1.to_file('test.geojson')
[file?for?file?in?os.listdir()?if?'test.'?in?file]


2.6 支持對矢量數(shù)據(jù)自動推斷合適的橫軸墨卡托坐標參考系
其實這個特性在0.9版本中就已加入,但是還有一些小問題,而新版本中這個功能更加完善,效果如下:

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


大家在了解到這些新功能和變動后,在使用新版geopandas時,如果遇到未知bug,歡迎在https://github.com/geopandas/geopandas/issues及時提交說明,一起幫助geopandas變得更加好用和完善??。
以上就是本文的全部內(nèi)容,歡迎在評論區(qū)與我進行討論~

加入知識星球【我們談論數(shù)據(jù)科學】
400+小伙伴一起學習!
· 推薦閱讀?·
新一代數(shù)據(jù)科學ide平臺DataSpell提前發(fā)行版體驗
教你使用Python連接Wind金融數(shù)據(jù)接口
