mcpField
G
geopandas

geopandas

github.com/davila7数据与数据库33.0k404 次安装今天更新
代码仓库

关于 geopandas

面向 Python 地理空间数据分析的 GeoPandas 技能,介绍 GeoDataFrame、空间操作、格式读写与地图可视化。

主要功能

  1. 01读取和写入多种空间格式
  2. 02管理坐标参考系
  3. 03几何变换与空间分析
  4. 04空间连接和叠加
  5. 05绘制静态与交互地图

适用场景

  1. 01筛选并转换地理数据
  2. 02将点数据关联到多边形
  3. 03整合不同来源的空间数据
  4. 04制作专题地图

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/davila7/claude-code-templates --skill geopandas

安装后在 Claude Code 中输入/geopandas确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
crs-management.md
data-io.md
data-structures.md
geometric-operations.md
spatial-analysis.md
visualization.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:带几何列的表格数据结构

详见 data-structures.md。

读写数据

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。

详细文档

常见工作流

加载、转换、分析、导出
# 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]

性能提示

  1. 使用空间索引:GeoPandas 会为大多数操作自动创建空间索引
  2. 读取时过滤:使用 bbox、mask 或 where 参数仅加载所需数据
  3. I/O 使用 Arrow:添加 use_arrow=True 可将读写速度提升 2-4 倍
  4. 简化几何:当精度要求不高时,使用 .simplify() 降低复杂度
  5. 批量操作:向量化操作比逐行迭代快得多
  6. 使用合适的 CRS:面积/距离计算使用投影 CRS,可视化使用地理 CRS

最佳实践

  1. 在空间操作之前始终检查 CRS
  2. 面积和距离计算使用投影 CRS
  3. 空间连接或叠加之前匹配 CRS
  4. 操作之前使用 .is_valid 验证几何
  5. 修改几何列时使用 .copy() 以避免副作用
  6. 为分析而简化时保留拓扑
  7. 现代工作流使用 GeoPackage 格式(优于 Shapefile)
  8. 在 sjoin_nearest 中设置 max_distance 以获得更好的性能

评论

支持 Markdown