Press "Enter" to skip to content

使用GeoPandas在Python中利用地理空间数据

空间数据由与位置相关联的记录组成。这些数据可以来自GPS轨迹、地球观测影像和地图。每个空间数据点可以使用坐标参考系统(如纬度/经度对)在地图上精确定位,从而使我们能够研究它们之间的关系。

空间数据的真正潜力在于它连接数据点及其相应位置的能力,为高级分析创造了无限的可能性。地理空间数据科学是数据科学中的一个新兴领域,旨在利用地理空间信息,并通过空间算法和高级技术(如机器学习或深度学习)提取有价值的洞察,从而得出有意义的结论,了解事件发生的原因。地理空间数据科学使我们了解事件发生的地点以及为什么会发生。

GeoPandas是一个专门用于处理地理信息的开源Python包。它通过在几何对象上提供空间操作,扩展了pandas的数据类型数组,从而使用pandas的数据处理工具在Python中进行空间分析。由于GeoPandas是建立在Pandas之上的,它为熟悉Python语法的专业人士提供了一个快速熟悉GeoPandas语法的简单路径。

使用GeoPandas在Python中利用地理空间数据 四海 第1张

1. 安装GeoPandas

我们必须安装GeoPandas包才能使用它。然而,需要注意的是,GeoPandas依赖于其他必须安装的库才能无问题地使用它。这些依赖项包括shapelyFionapyprojrtree

有两种方法可以下载GeoPandas包。首先,您可以使用conda安装GeoPandas conda包。此方法推荐使用,因为它将提供GeoPandas的依赖项,无需自行安装它们。您可以运行以下命令安装GeoPandas:

conda install geopandas

第二种方法是使用pip,这是Python中的标准软件包安装程序。然而,使用此方法将需要安装其他提到的依赖项。

pip install geopandas

安装GeoPandas包后,您可以使用以下命令将其导入到您的Python代码中:

import geopandas as gpd

2. 读取和写入空间数据

GeoPandas用于读取空间数据并将其转换为GeoDataFrame。然而,需要注意的是,空间数据主要有两种类型:

  • 矢量数据:矢量数据使用点、线和多边形等离散几何描述地理位置的特征。
  • 栅格数据:栅格数据将世界编码为由网格表示的表面。该网格的每个像素由连续值或分类类别表示。

GeoPandas主要处理矢量数据。然而,它可以与其他Python包一起用于处理栅格数据,例如rasterio。您可以使用强大的geopandas.read_file()函数来读取大多数基于矢量的空间数据。主要有两种矢量数据类型:

  • Shapefile:Shapefile是最常见的数据格式,被认为是行业级别的数据类型。它包含三个文件,经过压缩通常以zip文件的形式提供:

    .shp文件:此文件包含形状几何。

    .dbf文件:此文件保存每个几何的属性。

    .shx文件:这是形状索引文件,有助于将属性链接到形状。

  • GeoJSON:这是一个在2016年发布的新的地理空间数据文件格式。由于它只包含一个文件,因此与Shapefile相比更容易使用。

在本文中,我们将使用geopandas.read_file()函数来读取托管在GitHub上的包含有关巴塞罗那市不同区域的地理空间数据的GeoJSON文件。

首先,我们通过以下代码加载数据并打印其前五列:

url = 'https://raw.githubusercontent.com/jcanalesluna/bcn-geodata/master/districtes/districtes.geojson'
districts = gpd.read_file(url)
districts.head()

 

使用GeoPandas在Python中利用地理空间数据 四海 第2张   接下来,要将数据写入文件,我们可以使用GeoDataFrame.to_file()函数将数据写入默认的Shapefile文件中,但您也可以使用driver参数将其转换为GeoJSON。

districts.to_file("districts.geojson", driver="GeoJSON")

 

3. GeoDataFrames 属性

 

由于GeoDataFrames是pandas DataFrame的子类,它继承了许多属性。然而,有一些区别,主要区别是它可以存储几何列(也称为GeoSeries)并执行空间操作。GeoDataFrame中的几何列可以包含各种类型的矢量数据,包括点、线和多边形。但是,只有一列被视为活动几何列,并且所有空间操作都将基于该列。

它的另一个关键特点是每列都带有其关联的CRS信息,告诉我们候选人在地球上的位置。这个特性之所以很重要,是因为如果您需要组合两个空间数据集,您需要确保它们以相同的CRS表示,否则您将得到错误的结果。CRS信息存储在GeoPandas的crs属性中:

districts.crs

 

使用GeoPandas在Python中利用地理空间数据 四海 第3张  

现在我们已经设置了正确的投影CRS,我们准备好探索GeoDataFrames的属性了。

 

4. 探索 GeoDataFrames

 

GeoPandas有四个有用的方法和属性,可用于探索数据。我们将探索以下四种方法:

  • 面积
  • 质心
  • 边界
  • 距离

 

4.1. 面积

 

面积属性返回几何图形的计算面积。在下面的示例中,我们将计算每个区域的面积(以平方千米为单位)。

districts['area'] = districts.area / 1000000
districts['area']

  使用GeoPandas在Python中利用地理空间数据 四海 第4张

 

4.2. 质心

 

第二个属性是质心,它返回几何图形的中心点。在下面的代码片段中,我们将添加一个新列并保存每个区域的质心:

districts['centroid']=districts.centroid
districts['centroid']

  使用GeoPandas在Python中利用地理空间数据 四海 第5张

 

4.3. 边界

 

第三个方法是边界属性,它计算每个区域的多边形边界。下面的代码返回边界并将其保存到一个单独的列中:

districts['boundary']=districts.boundary

  使用GeoPandas在Python中利用地理空间数据 四海 第6张

 

4.4. 距离

 

distance方法计算从某个几何体到特定位置的最小距离。所以例如在下面的代码中,我们将计算从圣家堂到巴塞罗那每个市区的质心的距离。之后,我们将将距离以km2为单位添加到一个新的列中保存。

from shapely.geometry import Point

sagrada_fam = Point(2.1743680500855005, 41.403656946781304)
sagrada_fam = gpd.GeoSeries(sagrada_fam, crs=4326)
sagrada_fam= sagrada_fam.to_crs(epsg=2062)
districts['sagrada_fam_dist'] = [float(sagrada_fam.distance(centroid)) / 1000 for centroid in districts.centroid]

  使用GeoPandas在Python中利用地理空间数据 四海 第7张

 

5. 使用GeoPandas绘制数据

 

绘制和可视化数据是更好地了解数据的关键步骤。使用GeoPandas绘制与使用Pandas绘制完全相同,非常简单和直观。这是通过GeoDataFrame.plot()函数完成的,该函数是基于matplotlib Python包构建的。

让我们从绘制巴塞罗那的市区的基本图开始探索:

ax= districts.plot(figsize=(10,6))

 

使用GeoPandas在Python中利用地理空间数据 四海 第8张  

这是一个非常基本的图,没有给我们提供太多信息。然而,我们可以通过为每个市区着不同的颜色来使其更加信息丰富。

ax= districts.plot(column='DISTRICTE', figsize=(10,6), edgecolor='black', legend=True)

 

使用GeoPandas在Python中利用地理空间数据 四海 第9张  

最后,我们可以通过添加市区的质心来为我们的图添加更多信息。

import contextily
import matplotlib.pyplot as plt

ax= districts.plot(column='DISTRICTE', figsize=(12,6), alpha=0.5, legend=True)
districts["centroid"].plot(ax=ax, color="green")
contextily.add_basemap(ax, crs=districts.crs.to_string())
plt.title('带有巴塞罗那质心的彩色地图')
plt.axis('off')
plt.show()

 

使用GeoPandas在Python中利用地理空间数据 四海 第10张  

接下来,我们将探索GeoPandas的一个非常重要的功能,即空间关系及其如何相互关联。

 

6. 定义空间关系

 

地理空间数据在空间中相互关联。GeoPandas使用pandas和shapely包进行空间关系。本节介绍常见的操作。有两种主要的合并GeoPandas数据框的方式,即属性连接和空间连接。在本节中,我们将探索这两种方式。

 

6.1. 属性连接

 

属性连接允许您使用非几何变量将两个GeoPandas数据框连接起来,这使其类似于Pandas中的常规连接操作。连接操作使用pandas.merge()方法完成,如下面的示例所示。在此示例中,我们将巴塞罗那人口数据与我们的地理空间数据进行连接,以添加更多信息。

import pandas as pd
pop =pd.read_csv('2022_padro_sexe.csv', usecols=['Nom_Districte','Nombre'])
pop = pd.DataFrame(pop.groupby('Nom_Districte')['Nombre'].sum()).reset_index()
pop.columns=['NOM','population_22']
districts = districts.merge(pop)
districts

  使用GeoPandas在Python中利用地理空间数据 四海 第11张

 

6.2. 空间连接

 

另一方面,空间连接是基于空间关系合并数据框。在下面的示例中,我们将识别具有自行车道的区域。我们首先使用下面的代码加载数据:

url = 'https://opendata-ajuntament.barcelona.cat/resources/bcn/CarrilsBici/CARRIL_BICI.geojson'
bike_lane = gpd.read_file(url)
bike_lane = bike_lane.loc[:,['ID','geometry']]
bike_lane.to_crs(epsg=2062, inplace=True)

 

使用GeoPandas在Python中利用地理空间数据 四海 第12张  

要进行空间连接,我们可以使用sjoin()函数。sjoin()函数有四个主要参数:第一个是GeoDataFrame,第二个参数是要添加到第一个GeoDataFrame的GeoDataFrame,第三个参数是连接的类型,最后一个参数是谓词,它定义了我们希望用来匹配两个GeoDataFrame的空间关系。最常见的部分关系是相交包含在内部。在这个例子中,我们将使用相交参数。

lanes_districts = gpd.sjoin(districts, bike_lane, how='inner', predicate='intersects')
lanes_districts

 

使用GeoPandas在Python中利用地理空间数据 四海 第13张  

在本文中,我向您介绍了使用开源GeoPandas库进行地理空间数据分析。我们从下载GeoPandas包开始,然后讨论了不同类型的地理空间数据以及如何加载它们。最后,我们将探索基本操作,以便您能够处理地理空间数据集。尽管地理空间数据分析还有很多可以探索的内容,但这篇博客作为您学习之旅的起点。  Youssef Rafaat是一位计算机视觉研究员和数据科学家。他的研究重点是为医疗应用开发实时计算机视觉算法。他还在市场营销、金融和医疗领域担任数据科学家超过3年。  

Leave a Reply

Your email address will not be published. Required fields are marked *