geopandas 是一个用于处理地理空间数据的 Python 库,扩展了 pandas 的功能,使得处理地理数据变得更加方便。geopandas 的核心数据结构是 GeoDataFrame,是一个类似于 pandas 的 DataFrame,但包含一个特殊的 geometry 列,用于存储地理几何对象(如点、线、多边形等)。

安装

首先,需要安装 geopandas。可以使用 pip 来安装:

pip install geopandas

核心数据结构

GeoDataFrame

GeoDataFrame 是 geopandas 的核心数据结构,类似于 pandas 的 DataFrame,但包含一个特殊的 geometry 列,用于存储地理几何对象。

import geopandas as gpd

# 创建一个 GeoDataFrame
gdf = gpd.GeoDataFrame({
    'name': ['A', 'B', 'C'],
    'geometry': [Point(0, 0), Point(1, 1), Point(2, 2)]
})

print(gdf)
GeoSeries

GeoSeries 是 geopandas 的另一个核心数据结构,类似于 pandas 的 Series,但专门用于存储地理几何对象。

from shapely.geometry import Point

# 创建一个 GeoSeries
gs = gpd.GeoSeries([Point(0, 0), Point(1, 1), Point(2, 2)])

print(gs)

常用函数

read_file()

read_file() 函数用于从文件中读取地理数据,支持多种格式,如 Shapefile、GeoJSON、KML 等。

# 读取 Shapefile
gdf = gpd.read_file('path/to/shapefile.shp')

# 读取 GeoJSON
gdf = gpd.read_file('path/to/file.geojson')

参数:

  • filename:文件路径。
  • driver:指定文件格式(可选)。
  • encoding:指定文件编码(可选)。
to_file()

to_file() 函数用于将 GeoDataFrame 或 GeoSeries 写入文件。

# 将 GeoDataFrame 写入 Shapefile
gdf.to_file('path/to/output.shp')

# 将 GeoDataFrame 写入 GeoJSON
gdf.to_file('path/to/output.geojson', driver='GeoJSON')

参数:

  • filename:输出文件路径。
  • driver:指定输出文件格式(可选)。
  • encoding:指定输出文件编码(可选)。
plot()

plot() 函数用于绘制地理数据。

# 绘制 GeoDataFrame
gdf.plot()

# 绘制 GeoSeries
gs.plot()

参数:

  • column:指定用于绘制的列(可选)。
  • cmap:指定颜色映射(可选)。
  • ax:指定绘图轴(可选)。
  • figsize:指定图形大小(可选)。
sjoin()

sjoin() 函数用于空间连接(Spatial Join),即将两个 GeoDataFrame 根据空间关系进行连接。

# 空间连接
result = gpd.sjoin(gdf1, gdf2, how='inner', op='intersects')

参数:

  • left_df:左边的 GeoDataFrame。
  • right_df:右边的 GeoDataFrame。
  • how:连接方式('inner', 'left', 'right')。
  • op:空间关系操作符('intersects', 'contains', 'within' 等)。
overlay()

overlay() 函数用于执行空间叠加操作(Overlay),如交集、并集、差异等。

# 计算两个 GeoDataFrame 的交集
result = gpd.overlay(gdf1, gdf2, how='intersection')

参数:

  • df1:第一个 GeoDataFrame。
  • df2:第二个 GeoDataFrame。
  • how:叠加方式('intersection', 'union', 'difference', 'symmetric_difference')。
buffer()

buffer() 函数用于计算几何对象的缓冲区。

# 计算缓冲区
buffered = gdf.buffer(distance=100)

参数:

  • distance:缓冲区距离。
  • resolution:缓冲区分辨率(可选)。
centroid()

centroid() 函数用于计算几何对象的质心。

# 计算质心
centroids = gdf.centroid
dissolve()

dissolve() 函数用于根据某一列的值对 GeoDataFrame 进行聚合。

# 根据 'name' 列进行聚合
dissolved = gdf.dissolve(by='name')

参数:

  • by:指定用于聚合的列。
  • aggfunc:指定聚合函数(可选)。
cx 属性

cx 属性用于根据坐标范围筛选 GeoDataFrame 或 GeoSeries。

# 筛选经度在 [0, 10] 之间,纬度在 [0, 10] 之间的几何对象
filtered = gdf.cx[0:10, 0:10]

示例代码

以下是一个完整的示例,展示了如何使用 geopandas 进行地理数据处理和可视化:

import geopandas as gpd
from shapely.geometry import Point
import matplotlib.pyplot as plt

# 创建一个 GeoDataFrame
gdf = gpd.GeoDataFrame({
    'name': ['A', 'B', 'C'],
    'geometry': [Point(0, 0), Point(1, 1), Point(2, 2)]
})

# 绘制 GeoDataFrame
gdf.plot()
plt.show()

# 读取 Shapefile
gdf_shapefile = gpd.read_file('path/to/shapefile.shp')

# 绘制 Shapefile
gdf_shapefile.plot()
plt.show()

# 空间连接
gdf1 = gpd.GeoDataFrame({
    'name': ['A', 'B'],
    'geometry': [Point(0, 0), Point(1, 1)]
})

gdf2 = gpd.GeoDataFrame({
    'name': ['C', 'D'],
    'geometry': [Point(0.5, 0.5), Point(1.5, 1.5)]
})

result = gpd.sjoin(gdf1, gdf2, how='inner', op='intersects')
print(result)

总结

geopandas 是一个功能强大的库,用于处理和分析地理空间数据。提供了丰富的函数和方法,使得地理数据的读取、处理、分析和可视化变得更加简单和高效。通过掌握这些函数和方法,可以轻松地进行地理数据分析和地理信息系统(GIS)相关的任务。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐