GeoPandas读取与写出Shapefile
GeoPandas 用 geopandas.read_file() 读取 Shapefile(以及 ZIP、URL 等),返回 GeoDataFrame;用 GeoDataFrame.to_file() 写出,扩展名为 .shp 时默认保存为 ESRI Shapefile。底层走 GDAL/OGR,默认引擎是 Pyogrio(1.0 起取代 Fiona,常可加速 5~20 倍)。截至 2026 年 11 月,稳定版为 1.2.0,要求 Python ≥3.11。

安装环境与版本要求
先解决“能不能跑起来”。强烈建议用 conda-forge 单一通道建环境,避免 GEOS、GDAL、PROJ 二进制冲突。pip 也能装,但部分平台可能要自己编译依赖。
- 新建并激活环境:conda create -n geo_env,然后 conda activate geo_env。
- 锁定通道:conda config –env –add channels conda-forge,再 conda config –env –set channel_priority strict。
- 安装:conda install python=3 geopandas(或 conda install –channel conda-forge geopandas)。
- pip 备选:pip install geopandas,需要可选加速时用 pip install ‘geopandas[all]’。
1.2.0 的硬性依赖如下(以官方要求为准,可在 GeoPandas pyproject.toml 核对):
| 组件 | 最低版本 | 说明 |
|---|---|---|
| Python | ≥3.11 | 必需 |
| pandas | ≥2.2 | 必需 |
| numpy | ≥2.0 | 必需 |
| shapely | ≥2.1 | 几何引擎(GEOS) |
| pyproj | ≥3.7 | 坐标参考系(PROJ) |
| pyogrio | ≥0.8 | 默认 IO 引擎(GDAL) |
| pyarrow | ≥15.0(可选) | use_arrow 加速 |
| fiona | ≥1.8.21(可选) | 备用引擎 |
版本发布时间可在 GeoPandas GitHub tags 查看;1.2.0 发布于 2026 年 9 月 28 日。

用 read_file 读取 Shapefile
核心就一句:gdf = geopandas.read_file(“你的文件.shp”)。支持本地路径、pathlib.Path、ZIP(如 zip:///path/to/file.zip)、URL、file-like 对象。额外参数会传给底层 pyogrio.read_dataframe 或 fiona.open。
- 导入:import geopandas as gpd。
- 基本读取:gdf = gpd.read_file(“data/counties.shp”)。
- 指定引擎(可选):gpd.read_file(…, engine=”pyogrio”) 或 “fiona”;也可全局设 geopandas.options.io_engine。
- 过滤与加速:传 bbox=(边界框)、mask=(几何掩膜)、rows=(整数或 slice)、columns=、where=(SQL WHERE,需较新 Fiona/Pyogrio)、ignore_geometry=True、fid_as_index=True(Pyogrio)。需要更快时加 use_arrow=True(需已装 pyarrow),或设环境变量 PYOGRIO_USE_ARROW=1。
- 验收:看 gdf.head()、gdf.crs、gdf.geom_type 是否符合预期;图层能正常绘制则说明几何与属性都读进来了。读完后的地图可视化可参考本站 GeoPandas 读取 Shapefile 后如何做 GIS 地图可视化。
编码检测有时会失败,显式写 encoding=”utf-8″(或实际编码)更稳妥。若没有 .prj 或 CRS 不对,Pyogrio 下不要指望向 read_file 传 crs 参数(会警告),读完后用 gdf.set_crs(“EPSG:xxxx”, allow_override=True) 修正。
用 to_file 写出 Shapefile
写出同样简洁:gdf.to_file(“output.shp”)。无扩展名时会写成文件夹形式的 Shapefile。也可显式 driver=”ESRI Shapefile”;完整驱动列表用 import pyogrio; pyogrio.list_drivers() 查看。
- 常用参数:encoding=”utf-8″、index=(是否写出索引)、mode=”a”(部分驱动支持追加)、use_arrow=True(配合 pyarrow 加速)。
- 写出前确认 gdf.crs 正确,否则 .prj 可能空或错。
- Shapefile 只支持单一几何列、且几何类型要统一;不支持元组/列表等复杂字段,需先转成字符串或拆列。
- 字段名硬限制 10 个字符(ESRI 规范),超出会被截断并可能加后缀保证唯一,整数列名也不支持,需先改成字符串。
若列名、多几何列或复杂类型经常撞墙,更稳妥的做法是改用 GeoPackage 等格式,对比选型见本站 GeoPackage 对比 Shapefile:数据格式该怎么选。
读写时容易踩的坑与验收标准
问题通常出在编码、列名、CRS 和几何类型上,而不是 API 本身。
- 编码:读时可能报 CPLE_AppDefinedError,写时 Unicode 出错。指定 encoding,或用 QGIS/ogr2ogr 另存为 UTF-8,并确保有 .cpg 文件。
- 列名:超过 10 字符会被改名。写出后立刻 gpd.read_file 再核对列名是否还能对上业务字段。
- CRS:缺失或错误时图层对不齐底图。读后检查 gdf.crs,必要时 set_crs;写出前再确认一次。
- 几何:LINEARRING 等不被 Shapefile 识别、混合几何类型、空 GeoDataFrame 缺 schema,都会失败。先统一成 LINESTRING/POLYGON,或改用其他驱动。
验收建议:读入后 CRS、要素数量、geom_type、关键属性列齐全;写出后再读回,几何与属性一致、.prj 非空、中文不乱码。更多读取失败与报错排查见本站 GeoPandas 读取 SHP 报错与读取失败处理。
常见问题
为什么默认引擎从 Fiona 换成了 Pyogrio?
从 GeoPandas 1.0 起默认改用 Pyogrio,读写性能通常明显更好(常见 5~20 倍)。未安装时会回退到 Fiona;也可显式指定 engine 或改 geopandas.options.io_engine。
写出后列名变了怎么办?
Shapefile 字段名最长 10 字符,写出时会自动截断并保证唯一。解决办法是手动缩短列名,或改用 GeoPackage 等不受此限制的格式。
读取时指定 crs 参数报警告或无效?
Pyogrio 引擎下 read_file 不支持 crs 参数。先正常读取,再用 gdf.set_crs(…, allow_override=True) 设置或覆盖。
中文乱码或编码报错怎么处理?
在 read_file / to_file 里显式传 encoding(如 utf-8),确认有 .cpg;必要时用其他工具把源数据另存为 UTF-8 后再读。
总结:日常读写 Shapefile 记住 read_file 进、to_file 出,优先 Pyogrio 并按需加 use_arrow;同时盯紧编码、10 字符列名、CRS 和单一几何类型。建议用 conda-forge 装齐 1.2.0 依赖,写出后立刻读回做一轮验收;若业务列名或几何较复杂,优先考虑 GeoPackage。