关于 geopandas
GeoPandas 为 pandas 增加几何数据结构和空间操作,适用于 Python 地理空间分析。它涵盖常见格式、坐标参考系、空间分析与地图绘制。
主要功能
- 01支持 GeoSeries 和 GeoDataFrame
- 02读写地理空间格式
- 03管理坐标参考系
- 04执行空间连接与叠加分析
- 05创建静态和交互式地图
适用场景
- 01筛选并读取 GeoJSON 或 GeoPackage 数据
- 02空间分析前重新投影数据
- 03将点与多边形连接并汇总结果
- 04创建分级统计图或交互式地图
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ crazymsn/ academic-skills --skill geopandas安装后在 Claude Code 中输入/geopandas确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/crs-management.mddata-io.mddata-structures.mdgeometric-operations.mdspatial-analysis.mdvisualization.md详细介绍
GeoPandas
GeoPandas 扩展了 pandas,使其能够对几何类型执行空间操作。它结合了 pandas 和 shapely 的能力,用于地理空间数据分析。
安装
uv pip install geopandas
可选依赖项
# For interactive maps
uv pip install folium
# For classification schemes in mapping
uv pip install mapclassify
# For faster I/O operations (2-4x speedup)
uv pip install pyarrow
# For PostGIS database support
uv pip install psycopg2
uv pip install geoalchemy2
# For basemaps
uv pip install contextily
# For cartographic projections
uv pip install cartopy
快速开始
import geopandas as gpd
# Read spatial data
gdf = gpd.read_file("data.geojson")
# Basic exploration
print(gdf.head())
print(gdf.crs)
print(gdf.geometry.geom_type)
# Simple plot
gdf.plot()
# Reproject to different CRS
gdf_projected = gdf.to_crs("EPSG:3857")
# Calculate area (use projected CRS for accuracy)
gdf_projected['area'] = gdf_projected.geometry.area
# Save to file
gdf.to_file("output.gpkg")
核心概念
数据结构
- GeoSeries:具有空间操作的几何向量
- GeoDataFrame:带几何列的表格数据结构
读写数据
GeoPandas 可读写多种格式:Shapefile、GeoJSON、GeoPackage、PostGIS、Parquet。
# Read with filtering
gdf = gpd.read_file("data.gpkg", bbox=(xmin, ymin, xmax, ymax))
# Write with Arrow acceleration
gdf.to_file("output.gpkg", use_arrow=True)
全面的 I/O 操作详见 data-io.md。
坐标参考系统
始终检查和管理 CRS,以确保空间操作准确:
# Check CRS
print(gdf.crs)
# Reproject (transforms coordinates)
gdf_projected = gdf.to_crs("EPSG:3857")
# Set CRS (only when metadata missing)
gdf = gdf.set_crs("EPSG:4326")
CRS 操作详见 crs-management.md。
常见操作
几何操作
缓冲、简化、质心、凸包、仿射变换:
# Buffer by 10 units
buffered = gdf.geometry.buffer(10)
# Simplify with tolerance
simplified = gdf.geometry.simplify(tolerance=5, preserve_topology=True)
# Get centroids
centroids = gdf.geometry.centroid
所有操作详见 geometric-operations.md。
空间分析
空间连接、叠加操作、融合:
# Spatial join (intersects)
joined = gpd.sjoin(gdf1, gdf2, predicate='intersects')
# Nearest neighbor join
nearest = gpd.sjoin_nearest(gdf1, gdf2, max_distance=1000)
# Overlay intersection
intersection = gpd.overlay(gdf1, gdf2, how='intersection')
# Dissolve by attribute
dissolved = gdf.dissolve(by='region', aggfunc='sum')
分析操作详见 spatial-analysis.md。
可视化
创建静态和交互式地图:
# Choropleth map
gdf.plot(column='population', cmap='YlOrRd', legend=True)
# Interactive map
gdf.explore(column='population', legend=True).save('map.html')
# Multi-layer map
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
gdf1.plot(ax=ax, color='blue')
gdf2.plot(ax=ax, color='red')
制图技术详见 visualization.md。
详细文档
- 数据结构 - GeoSeries 和 GeoDataFrame 基础知识
- 数据 I/O - 读写文件、PostGIS、Parquet
- 几何操作 - 缓冲、简化、仿射变换
- 空间分析 - 连接、叠加、融合、裁剪
- 可视化 - 绘图、等值线图、交互式地图
- CRS 管理 - 坐标参考系统和投影
常见工作流
加载、转换、分析、导出
# 1. Load data
gdf = gpd.read_file("data.shp")
# 2. Check and transform CRS
print(gdf.crs)
gdf = gdf.to_crs("EPSG:3857")
# 3. Perform analysis
gdf['area'] = gdf.geometry.area
buffered = gdf.copy()
buffered['geometry'] = gdf.geometry.buffer(100)
# 4. Export results
gdf.to_file("results.gpkg", layer='original')
buffered.to_file("results.gpkg", layer='buffered')
空间连接与聚合
# Join points to polygons
points_in_polygons = gpd.sjoin(points_gdf, polygons_gdf, predicate='within')
# Aggregate by polygon
aggregated = points_in_polygons.groupby('index_right').agg({
'value': 'sum',
'count': 'size'
})
# Merge back to polygons
result = polygons_gdf.merge(aggregated, left_index=True, right_index=True)
多源数据集成
# Read from different sources
roads = gpd.read_file("roads.shp")
buildings = gpd.read_file("buildings.geojson")
parcels = gpd.read_postgis("SELECT * FROM parcels", con=engine, geom_col='geom')
# Ensure matching CRS
buildings = buildings.to_crs(roads.crs)
parcels = parcels.to_crs(roads.crs)
# Perform spatial operations
buildings_near_roads = buildings[buildings.geometry.distance(roads.union_all()) < 50]
性能提示
- 使用空间索引:GeoPandas 会为大多数操作自动创建空间索引
- 读取时过滤:使用
bbox、mask或where参数仅加载所需数据 - I/O 使用 Arrow:添加
use_arrow=True可将读写速度提升 2-4 倍 - 简化几何:当精度要求不高时,使用
.simplify()降低复杂度 - 批量操作:向量化操作比逐行迭代快得多
- 使用合适的 CRS:面积/距离计算使用投影 CRS,可视化使用地理 CRS
最佳实践
- 在空间操作之前始终检查 CRS
- 面积和距离计算使用投影 CRS
- 空间连接或叠加之前匹配 CRS
- 操作之前使用
.is_valid验证几何 - 修改几何列时使用
.copy()以避免副作用 - 为分析而简化时保留拓扑
- 现代工作流使用 GeoPackage 格式(优于 Shapefile)
- 在 sjoin_nearest 中设置 max_distance 以获得更好的性能
评论
支持 Markdown