GeoPandas to_file 怎么写出文件并指定驱动

Python
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

GeoPandas 写出矢量文件用 GeoDataFrame.to_file(),通过 driver 参数指定 OGR 驱动;不写 driver 时按扩展名推断,没有扩展名则默认写成 ESRI Shapefile。常见写法是 gdf.to_file(‘out.shp’)、gdf.to_file(‘out.gpkg’, driver=’GPKG’, layer=’图层名’),或 gdf.to_file(‘out.geojson’, driver=’GeoJSON’)。截至 2026 年 11 月,稳定版 1.2.0 默认引擎为 pyogrio(安装后优先),写入通常比旧版 Fiona 更快,也可用 engine 显式切换。

GeoPandas to_file 写出 Shapefile、GPKG、GeoJSON 的概念示意

基本写出步骤怎么做

要解决的问题很直接:把内存里的 GeoDataFrame 落成磁盘文件,并指定目标格式,方便给 QGIS、其他脚本或同事使用。按下面步骤做,并做读回验收。

  1. 准备环境:确认已安装 GeoPandas(推荐 conda-forge 通道)。1.2.0 要求 Python ≥3.11、pandas ≥2.2、shapely ≥2.1、pyogrio ≥0.8、pyproj ≥3.7。不确定依赖时以本机 pip show geopandas 或 conda 列表为准。
  2. 得到要写出的 gdf:自己构造,或从已有文件读入。读入 Shapefile 时若遇编码或驱动问题,可先参考本站 GeoPandas 读取 Shapefile 报错与失败处理 排查。
  3. 调用 to_file 并指定驱动。例如写出 GeoPackage:gdf.to_file(‘result.gpkg’, driver=’GPKG’, layer=’roads’);写出 GeoJSON:gdf.to_file(‘result.geojson’, driver=’GeoJSON’);默认 Shapefile:gdf.to_file(‘result.shp’)。
  4. 中文属性或需固定编码时加上 encoding=’utf-8’(Shapefile 会生成 .cpg)。追加已有文件(部分驱动支持)用 mode=’a’,pyogrio 也可用 append=True。
  5. 验收:检查目标路径是否生成文件;用 geopandas.read_file 读回,对比行数、几何类型、CRS 与关键属性字段。地图预览可结合本站 GeoPandas 读取 Shapefile 与 GIS 地图可视化 里的画图方法快速核对。

路径支持 GDAL VSI 方案。多几何列时多数格式只认活动几何列,其余需先转成 WKT 或 WKB 再写。

常用驱动怎么选

驱动名必须是 OGR 格式名(如 GPKG),不是随便写的路径。未指定时由扩展名推断。可用 import pyogrio; pyogrio.list_drivers() 查看当前环境读写支持情况。Fiona 引擎下驱动列表见 fiona.supported_drivers,部分格式需手动启用。

驱动名 常见扩展名 适用场景 注意点
ESRI Shapefile .shp(实际多文件) 兼容老软件、教学交换 字段名最长约 10 字符,易截断;需配套 .shx、.dbf、.prj 等
GPKG .gpkg 日常推荐、单文件多图层 务必用 layer 指定图层名;支持 metadata(字符串字典)
GeoJSON .geojson / .json Web、轻量交换、文本可读 大文件体积大、读写相对慢

不确定选哪个时,优先 GPKG:单文件、少踩坑,适合后续继续用 GeoPandas 或 PostGIS 流转。需要入库而不是落盘文件时,可直接看本站 GeoPandas 写入 PostGIS(to_postgis / read_postgis)。

GeoPandas GitHub 版本标签页,可核对 1.2.0 等发布记录
GeoPandas GitHub 版本标签页,可核对 1.2.0 等发布记录(截图来源:github.com)

to_file 关键参数要注意什么

方法签名大致为 to_file(filename, driver=None, schema=None, index=None, **kwargs)。下面按实际使用频率说明。

  • driver:字符串,OGR 驱动名。为 None 时从扩展名推断,无扩展名则写成 Shapefile。
  • engine:pyogrio(默认,装了就优先)或 fiona。也可全局设置 geopandas.options.io_engine = ‘fiona’。pyogrio 更快,但不支持 schema;需要精细控制字段类型时切 Fiona。
  • mode:默认 w 表示覆盖;a 表示追加(并非所有驱动支持)。
  • layer:GPKG 等多图层格式必填或强烈建议填写。
  • encoding:属性表编码,中文场景常用 utf-8。
  • index:是否把索引写成一列(命名索引、MultiIndex 或非整数索引默认会写;0.7 及以后行为)。
  • schema:传给 Fiona 控制写入字段;基于 dtype 可自动推断。pyogrio 不支持,需要时必须 engine=’fiona’。
  • crs:覆盖写出 CRS(pyogrio 不支持该关键字,以 gdf.crs 为准)。
  • metadata:仅 GPKG 支持的字符串字典。
  • 其他关键字参数:透传给引擎,例如 use_arrow=True(需 pyarrow,可明显加速)、spatialite=True 等。

字段类型必须被目标驱动支持,否则会抛出 ValueError。几何类型也要匹配(例如某些驱动不接受 LinearRing,需先转成 LineString 或 Polygon)。版本与依赖可在 GeoPandas GitHub 版本标签 与 pyproject.toml 依赖声明 核对;最终以你本机安装版本为准。

写出后验收标准与出错怎么办

验收建议固定三条:文件(及 Shapefile 配套文件)存在且大小合理;read_file 能完整读回,几何与属性行数一致;CRS、字段名与关键属性值与写出前一致(尤其是中文)。不满足就按报错信息对号入座。

  • 列名被截断或重名警告:Shapefile 限制,缩短列名或改用 GPKG、GeoJSON。
  • 中文乱码或编码失败:加 encoding=’utf-8’;确认读端也用相同编码。
  • schema 相关错误:当前默认 pyogrio 不支持,改 engine=’fiona’。
  • unsupported driver,或 Geometry type not supported:查 pyogrio.list_drivers();转换几何类型或换驱动;Fiona 下部分驱动需手动设为可读写。
  • 多几何列或复杂 Python 对象(元组、列表):先简化列,或在业务允许时改用更适合表格加几何的格式。

性能上,大数据量可试 use_arrow=True(需安装 pyarrow)。引擎从 Fiona 迁到 pyogrio 后,EMPTY 几何等行为略有差异,写出前后用同一引擎读回对比更稳妥。

常见问题

不写 driver 会写成什么格式?

有扩展名就按扩展名推断(如 .gpkg 对应 GPKG);没有扩展名则写成 ESRI Shapefile 文件夹结构。想明确控制时请始终传入 driver。

为什么 schema 参数无效或报错?

默认引擎 pyogrio 不支持 schema。需要自定义字段类型时设置 engine=’fiona’,或全局把 io_engine 改成 fiona。

写出 Shapefile 后字段名变短了怎么办?

这是格式限制(通常最长约 10 字符),GeoPandas 会截断并可能警告。业务字段多时改用 GPKG,并在 layer 参数里起好图层名。

追加写入 mode=’a’ 失败是什么原因?

不是所有驱动都支持追加。先确认当前引擎与驱动是否支持;GPKG 等可优先试 pyogrio 的 append 相关参数,仍失败就改为读出合并后再覆盖写。

总结:用 geopandas to_file 时先定格式再定 driver,日常优先 GPKG 并指定 layer,中文加 encoding=’utf-8’,写出后立刻 read_file 验收。需要精细 schema 时切 Fiona;需要入库而不是文件时直接用 to_postgis。建议把“写出 → 读回对比 CRS、字段、行数”固化成固定检查清单,再按项目选择 Shapefile 兼容方案或 GPKG 现代方案。