首页软件基础教程GeoPandas【GeoPandas空间数...

【GeoPandas空间数据分析】15.合并数据(Merging Data)——属性连接


本系列文章是根据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中有两种组合数据集的方法——属性连接和空间连接。

在属性连接中,一个GeoSeriesGeoDataFrame与一个普通的pandas.Seriespandas.DataFrame基于一个共同的变量进行组合。这类似于pandas中的普通合并或连接。

在空间连接中,来自两个GeoSeriesGeoDataFrame的数据根据它们之间的空间关系进行组合。

01

属性连接


属性连接使用 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()

02

数据合并


追加 GeoDataFrameGeoSeries 使用 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

03

空间连接


在空间连接中,两个几何对象根据它们之间的空间关系进行合并操作。

GeoPandas 提供了两个空间连接函数:

  • GeoDataFrame.sjoin():

基于二元谓词的连接(相交、包含等),该方法有两个核心参数:howpredicate

predicate参数指定了geopandas如何根据它们的几何关系将一个对象的属性连接到另一个对象。geopandas中的默认空间索引目前支持以下预定值,这些预定值在Shapely文档中定义。

  • intersects

  • contains

  • within

  • touches

  • crosses

  • overlaps

how参数指定将发生的连接类型,以及在结果的GeoDataFrame中保留哪些几何图形。它接受以下选项:
  • left: 使用提供给GeoDataFrame.sjoin() 的第一个(或 left_dfGeoDataFrame 的索引,只保留 left_df 几何列。

  • right:使用来自第二个(或right_df)的索引,只保留right_df的几何列。

  • inner:使用两个GeoDataFrame的索引值的交集,只保留left_df的几何列。
  • GeoDataFrame.sjoin_nearest():

根据距离的远近进行连接,并能设置最大搜索半径。

GeoDataFrame.sjoin_nearest()GeoDataFrame.sjoin() 共享 how 参数,并包含两个附加参数:max_distancedistance_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.06713180.00000...                      Fiji
111    POLYGON ((33.90371 -0.9500034.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.9088718.82984 45.90888...                    Serbia
17172  POLYGON ((20.07070 42.5886319.80161 42.50009...                Montenegro
18173  POLYGON ((20.59025 41.8554120.52295 42.21787...                    Kosovo
19174  POLYGON ((-61.68000 10.76000, -61.10500 10.890...       Trinidad and Tobago
20175  POLYGON ((30.83385 3.5091729.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]

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments