本系列文章是根据GeoPandas
官方文档翻译整理,学习任何一个Python第三方库,其官方文档都是最好的学习资料。相比网络搜索得到的一些资料,官方文档是权威的一手资料,其内容全面、准确可靠。通过官方文档入手,能够保证学习认知不会有大偏差。在学习完官方文档后,可以在寻找其他资料进一步学习。
点击“阅读原文”或者直接访问下方链接,查看翻译整理的“GeoPandas 0.12.2 中文文档”。
https://www.mizhushare.com/docs
-
可以通过百度网盘获取,需要在本地配置代码运行环境:
链接:https://pan.baidu.com/s/185Qs6RpVhyP2nm9VV39Ehw?pwd=mnsj
提取码:mnsj
-
前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/geopandas
GeoPandas
中有两种组合数据集的方法——属性连接和空间连接。在属性连接中,一个GeoSeries
或GeoDataFrame
与一个普通的pandas.Series
或pandas.DataFrame
基于一个共同的变量进行组合。这类似于pandas中的普通合并或连接。
在空间连接中,来自两个GeoSeries
或GeoDataFrame
的数据根据它们之间的空间关系进行组合。
属性连接:
属性连接使用 merge()
方法完成。一般来说,建议使用通过空间数据集调用 merge()
方法。
如果 GeoDataFrame
在左侧参数中,则独立的 pandas.merge()
函数将起作用;如果 DataFrame
在左边的参数中, GeoDataFrame
在右边的位置,则结果将不再是 GeoDataFrame
。
以GeoPandas
自带的world
数据集为例。
1world = gpd.read_file('./datasets/naturalearth_lowres/naturalearth_lowres.shp')
2
3country_shapes = world[['geometry' , 'iso_a3']]
4country_names = world[['name', 'iso_a3']]
其中,`country_shapes`
是包含国家/地区的几何属性和ISO
代码的GeoDataFrame
:
1# `country_shapes` is GeoDataFrame with country shapes and iso codes
2country_shapes.head()
其中,`country_names`
是包含国家/地区名称和ISO
代码的DataFrame
:
1# `country_names` is DataFrame with country names and iso codes
2country_names.head()
两个数据基于iso_a3
列进行属性连接操作:
1# 基于 iso codes 进行属性连接操作:
2country_shapes = country_shapes.merge(country_names, on='iso_a3')
3country_shapes.head()
数据合并:
追加 GeoDataFrame
和 GeoSeries
使用 pandas.concat() 方法(从1.4.0版本开始pd.append()
方法被弃用,使用pd.concat()
代替)。需要注意的是,追加的几何列需要具有相同的 CRS。
1# Appending GeoSeries
2joined = pd.concat([world.geometry, cities.geometry])
3joined
1# Appending GeoDataFrames
2europe = world[world.continent == 'Europe']
3asia = world[world.continent == 'Asia']
4
5eurasia = pd.concat([europe, asia])
6eurasia
空间连接:
在空间连接中,两个几何对象根据它们之间的空间关系进行合并操作。
GeoPandas
提供了两个空间连接函数:
-
GeoDataFrame.sjoin()
:
基于二元谓词的连接(相交、包含等),该方法有两个核心参数:how
和 predicate
。
predicate
参数指定了geopandas
如何根据它们的几何关系将一个对象的属性连接到另一个对象。geopandas
中的默认空间索引目前支持以下预定值,这些预定值在Shapely文档中定义。
-
intersects
-
contains
-
within
-
touches
-
crosses
-
overlaps
how
参数指定将发生的连接类型,以及在结果的GeoDataFrame中保留哪些几何图形。它接受以下选项:-
left
: 使用提供给GeoDataFrame.sjoin()
的第一个(或left_df
)GeoDataFrame
的索引,只保留left_df
几何列。 -
right
:使用来自第二个(或right_df
)的索引,只保留right_df
的几何列。 -
inner
:使用两个GeoDataFrame
的索引值的交集,只保留left_df
的几何列。
-
GeoDataFrame.sjoin_nearest()
:
根据距离的远近进行连接,并能设置最大搜索半径。
GeoDataFrame.sjoin_nearest()
与 GeoDataFrame.sjoin()
共享 how
参数,并包含两个附加参数:max_distance
和 distance_col
。
max_distance
:用于指定匹配几何图形的最大搜索半径。在某些情况下,这会对性能产生相当大的影响。
distance_col
:如果设置该参数,生成的 GeoDataFrame 将包含一个具有此名称的列,其中包含输入几何和最近的几何之间的计算距离。
1# For spatial join
2>>> countries = world[['geometry', 'name']]
3
4>>> countries = countries.rename(columns={'name':'country'}) # 重命名列
5
6# One GeoDataFrame of countries, one of Cities.
7# Want to merge so we can get each city's country.
8>>> countries
9 geometry country
100 MULTIPOLYGON (((180.00000 -16.06713, 180.00000... Fiji
111 POLYGON ((33.90371 -0.95000, 34.07262 -1.05982... Tanzania
122 POLYGON ((-8.66559 27.65643, -8.66512 27.58948... W. Sahara
133 MULTIPOLYGON (((-122.84000 49.00000, -122.9742... Canada
144 MULTIPOLYGON (((-122.84000 49.00000, -120.0000... United States of America
15.. ... ...
16171 POLYGON ((18.82982 45.90887, 18.82984 45.90888... Serbia
17172 POLYGON ((20.07070 42.58863, 19.80161 42.50009... Montenegro
18173 POLYGON ((20.59025 41.85541, 20.52295 42.21787... Kosovo
19174 POLYGON ((-61.68000 10.76000, -61.10500 10.890... Trinidad and Tobago
20175 POLYGON ((30.83385 3.50917, 29.95350 4.17370, ... S. Sudan
21
22[176 rows x 2 columns]
23
24>>> cities
25 name geometry
260 Vatican City POINT (12.45339 41.90328)
271 San Marino POINT (12.44177 43.93610)
282 Vaduz POINT (9.51667 47.13372)
293 Lobamba POINT (31.20000 -26.46667)
304 Luxembourg POINT (6.13000 49.61166)
31.. ... ...
32238 Rio de Janeiro POINT (-43.21212 -22.90731)
33239 São Paulo POINT (-46.62697 -23.55673)
34240 Sydney POINT (151.21255 -33.87137)
35241 Singapore POINT (103.85387 1.29498)
36242 Hong Kong POINT (114.18306 22.30693)
37
38[243 rows x 2 columns]
将predicate="intersects"
,得到每个城市所属的国家/地区信息。
1# Execute spatial join
2>>> cities_with_country = cities.sjoin(countries , how="inner" , predicate="intersects")
3>>> cities_with_country
4 name geometry index_right country
50 Vatican City POINT (12.45339 41.90328) 140 Italy
61 San Marino POINT (12.44177 43.93610) 140 Italy
7226 Rome POINT (12.48131 41.89790) 140 Italy
82 Vaduz POINT (9.51667 47.13372) 114 Austria
9212 Vienna POINT (16.36469 48.20196) 114 Austria
10.. ... ... ... ...
11223 Moscow POINT (37.61358 55.75411) 18 Russia
12228 Nairobi POINT (36.81471 -1.28140) 13 Kenya
13229 Jakarta POINT (106.82749 -6.17247) 8 Indonesia
14230 Bogota POINT (-74.08529 4.59837) 32 Colombia
15231 Cairo POINT (31.24802 30.05191) 162 Egypt
16
17[213 rows x 4 columns]
本篇文章来源于微信公众号: 码农设计师