GeoPandas 十大实用技巧

Google Colab

地理空间数据主要分成栅格矢量两大类。今天我们先聊矢量数据,它用点、线、多边形这些坐标集合来描述真实世界。点适合标记具体位置,比如城市或景点;线用来表示道路、河流;多边形则描绘区域边界,如省份或湖泊。这种数据特别适合处理那些位置和形状都很重要的离散特征,在农业、城市规划、交通、环境监测等领域到处都能用到。

在 Python 生态里,处理矢量数据的王牌工具就是 GeoPandas。它基于 Pandas 扩展而来,又融入了 Shapely 的几何运算能力,让你既能像用 Pandas 那样轻松操作表格数据,又能顺手做各种空间计算,简直是空间分析的利器。

下面分享我平时最常用的 10 个 GeoPandas 操作技巧,帮助你快速处理、合并和转换矢量数据。

1. 从外部加载中国地图数据

image-20260105005311576

GeoPandas 早期版本有内置数据集,但现在(2026 年)已经移到独立的 geodatasets 包里。我们直接用公开的 GeoJSON 数据加载省份边界,非常方便。

import geopandas as gpd

# 从阿里云 DataV 公开接口加载中国省份边界(包含香港、澳门、台湾)
gdf_china = gpd.read_file("https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json")

# 查看前几行
gdf_china.head()

这个数据包含省份名称、行政代码等属性,以及 geometry 列(多边形)。

2.读取地理文件到 GeoDataFrame

GeoPandas 支持直接读取 Shapefile、GeoJSON 等常见格式,转成 GeoDataFrame 后就能进行空间操作。

继续用上面的省份数据:

import geopandas as gpd

gdf_provinces = gpd.read_file("https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json")

print(gdf_provinces.crs)  # 查看坐标系
gdf_provinces.head(3)

geometry 列就是让普通 DataFrame 变成 GeoDataFrame 的关键,它存储了每个省份的多边形。

image-20260105005627621

3.从普通 DataFrame 创建 GeoDataFrame

很多时候位置数据只是经纬度表格,我们可以用 Shapely 把它们转成点几何。

这里用几个城市举例:

import pandas as pd
import geopandas as gpd
from shapely.geometry import Point

df_cities = pd.DataFrame([
    {'name': '北京', 'longitude': 116.4074, 'latitude': 39.9042},
    {'name': '上海', 'longitude': 121.4737, 'latitude': 31.2304},
    {'name': '广州', 'longitude': 113.2644, 'latitude': 23.1291},
    {'name': '深圳', 'longitude': 114.0579, 'latitude': 22.5431},
    {'name': '成都', 'longitude': 104.0665, 'latitude': 30.5723},
    {'name': '重庆', 'longitude': 106.5516, 'latitude': 29.5630},
    {'name': '杭州', 'longitude': 120.1551, 'latitude': 30.2741},
    {'name': '武汉', 'longitude': 114.3054, 'latitude': 30.5931},
    {'name': '西安', 'longitude': 108.9398, 'latitude': 34.3416},
    {'name': '天津', 'longitude': 117.2008, 'latitude': 39.0842}
])

geometry = [Point(xy) for xy in zip(df_cities['longitude'], df_cities['latitude'])]
gdf_cities = gpd.GeoDataFrame(df_cities, geometry=geometry, crs="EPSG:4326")

gdf_cities.head()

image-20260105005744222

4.把 GeoDataFrame 导出为文件

处理完数据后,可以轻松导出为 Shapefile 或 GeoJSON,方便在 QGIS、ArcGIS 等工具里继续用。

# 导出为 Shapefile
gdf_cities.to_file('china_major_cities.shp')

# 导出为 GeoJSON
gdf_cities.to_file('china_major_cities.geojson', driver='GeoJSON')

print("已导出城市点数据!")

5.计算面积和周长

GeoPandas 可以直接算多边形的面积和周长(单位取决于坐标系,建议先投影到米单位)。

import geopandas as gpd

gdf_provinces = gpd.read_file("https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json")

# 计算周长(单位:度,需要投影后才有实际意义)
gdf_provinces['perimeter'] = gdf_provinces.length

# 计算面积
gdf_provinces['area'] = gdf_provinces.area

gdf_provinces[['name', 'perimeter', 'area']].head(10)

image-20260105010110147

6.快速可视化

GeoPandas 自带 plot 方法,几行代码就能出图。

import geopandas as gpd
import matplotlib.pyplot as plt
gdf_provinces = gpd.read_file("https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json")
ax = gdf_provinces.plot(figsize=(10, 10), edgecolor='black', facecolor='lightblue')
plt.show()  

image-20260105011323631

7. 缓冲区操作(Buffer)

对点做缓冲可以生成圆形区域,比如模拟城市影响范围。

gdf_cities_buffered = gdf_cities.copy()

# 缓冲 1 度(实际项目建议投影后用公里或米单位)
gdf_cities_buffered['geometry'] = gdf_cities_buffered.buffer(1)

# 对比原图和缓冲图
ax = gdf_cities.plot(color='red', markersize=50, figsize=(10, 8))
gdf_cities_buffered.plot(ax=ax, alpha=0.3, color='blue')

8. 空间叠置(Overlay)

用 overlay 可以求交集、并集等,这里演示城市缓冲区与省份的交集。

gdf_provinces_simple = gdf_provinces[['name', 'geometry']].rename(columns={'name': 'province'})

gdf_overlay = gpd.overlay(gdf_provinces_simple, gdf_cities_buffered, how='intersection')

gdf_overlay.plot(figsize=(10, 8), cmap='Set3')

9.按属性融合多边形(Dissolve)

把同一个大区域的多个多边形合并,比如按大区合并省份。

# 简单示范:假设我们有大区字段,这里手动加一个示例
gdf_provinces['region'] = ['华北', '华东', '华南', '华南', '西南', '西南', '华东', '华中', '西北', '华北'] * 3 + ['其他']

gdf_regions = gdf_provinces.dissolve(by='region')

print(f"融合前:{len(gdf_provinces)} 个省份")
print(f"融合后:{len(gdf_regions)} 个大区")

gdf_regions.plot(edgecolor='red', figsize=(10, 8))

10.拆分复合几何(Explode)

有些省份包含离岛,是 MultiPolygon,用 explode 可以拆成单个 Polygon。

gdf_provinces = gpd.read_file("https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json")

print(f"拆分前记录数:{len(gdf_provinces)}")

gdf_exploded = gdf_provinces.explode(index_parts=True)

print(f"拆分后记录数:{len(gdf_exploded)}")

gdf_exploded.head()

拆分后每个独立岛屿或陆地块都会单独成行,便于更精细分析。

结语

这 10 个技巧基本覆盖了日常矢量数据处理的绝大部分场景。GeoPandas 把 Pandas 的简洁和 Shapely 的几何能力完美结合,让我们在 Python 里就能高效完成复杂的空间分析。熟练掌握后,你会发现地理空间分析其实没那么神秘——多练多用,就能像高手一样玩转它!如果有疑问,欢迎留言交流~