GDAL格式转换怎么做?命令行参数有哪些?

GIS基础理论
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

“GDAL格式转换怎么做?命令行参数有哪些?”是很多 GIS 初学者在处理 Shapefile、GeoJSON、GeoPackage、TIFF、DEM、投影坐标转换时都会遇到的问题。GDAL 不是一个单独的转换按钮,而是一组命令行工具,其中矢量数据常用 ogr2ogr,栅格数据常用 gdal_translategdalwarp。只要理解“输入格式、输出格式、坐标系、字段编码、空间范围、像元大小”这几个参数,绝大多数格式转换都可以稳定完成。

GDAL格式转换与GDAL命令行参数工作流示意图
GDAL 格式转换的基本思路:先判断矢量或栅格,再选择 ogr2ogr、gdal_translate 或 gdalwarp,并配置输出格式、坐标系和裁剪参数。

引言:先判断你要转换的是矢量还是栅格

做 GDAL格式转换 前,第一步不是直接复制命令,而是判断数据类型。矢量数据包括 Shapefile、GeoJSON、GeoPackage、KML、CSV 点位等;栅格数据包括 GeoTIFF、DEM、影像、土地覆盖栅格等。

不同数据类型对应不同命令:

  • 矢量格式转换:使用 ogr2ogr,例如 Shapefile 转 GeoJSON、GeoJSON 转 GeoPackage。
  • 栅格格式转换:使用 gdal_translate,例如 TIFF 转 COG、IMG 转 GeoTIFF。
  • 栅格重投影、裁剪、重采样:使用 gdalwarp,例如 WGS84 转 Web Mercator、按行政区边界裁剪影像。
  • 查看数据基本信息:矢量用 ogrinfo,栅格用 gdalinfo

经验判断:如果数据是点、线、面和属性表,优先看 ogr2ogr;如果数据是像元、影像、DEM,优先看 gdal_translategdalwarp

背景:为什么 GDAL格式转换 经常失败

GDAL格式转换失败,通常不是 GDAL “不能转”,而是输入数据、坐标系、编码、驱动名称或路径写法有问题。尤其在 Windows 环境中,中文路径、空格路径、Shapefile 编码和坐标系缺失会导致很多看似随机的报错。

常见场景包括:

  • Shapefile 转 GeoJSON 后中文属性乱码。
  • GeoJSON 转 Shapefile 后字段名被截断。
  • GeoTIFF 转换后坐标位置偏移。
  • 栅格重投影后分辨率变粗或文件变大。
  • 命令执行提示 Unable to open datasourcenot recognized as a supported file format
  • 输出文件已存在,命令没有覆盖成功。

解决这些问题,需要把 GDAL 命令行参数分为几类理解:格式参数、坐标系参数、范围参数、字段参数、编码参数、压缩参数和覆盖参数。

原理:GDAL 命令行格式转换的基本结构

GDAL格式转换的命令结构可以简单理解为:指定输出格式、指定输出文件、指定输入文件,再按需要补充坐标系、筛选、裁剪或压缩参数。

矢量转换基本结构

ogr2ogr -f "输出格式名称" 输出文件 输入文件 [其他参数]

例如 Shapefile 转 GeoJSON:

ogr2ogr -f "GeoJSON" output.geojson input.shp

栅格转换基本结构

gdal_translate -of 输出格式 输入文件 输出文件 [其他参数]

例如普通 TIFF 转 GeoTIFF:

gdal_translate -of GTiff input.tif output.tif

栅格重投影基本结构

gdalwarp -s_srs 源坐标系 -t_srs 目标坐标系 输入文件 输出文件 [其他参数]

例如将栅格转换到 WGS84:

gdalwarp -s_srs EPSG:3857 -t_srs EPSG:4326 input.tif output_wgs84.tif

这里的 EPSG:4326 是 WGS84 经纬度坐标系,EPSG:3857 是 WebGIS 常见的 Web Mercator 投影坐标系。

步骤:常用 GDAL格式转换 命令示例

步骤 1:先检查输入数据是否能被 GDAL 识别

转换前先看数据基本信息,可以快速确认驱动、坐标系、字段、范围和图层名称。

查看矢量数据:

ogrinfo input.shp -so -al

查看栅格数据:

gdalinfo input.tif

重点检查以下信息:

  • 数据是否能正常打开。
  • 坐标系是否存在。
  • 图层名称是否正确。
  • 矢量字段是否有中文或超长字段名。
  • 栅格是否有 NoData 值、分辨率和波段信息。

步骤 2:Shapefile 转 GeoJSON

这是最常见的 GDAL格式转换 场景,适合 WebGIS、前端调试和轻量数据交换。

ogr2ogr -f "GeoJSON" output.geojson input.shp

如果需要指定输出为 WGS84,经常用于 Leaflet、OpenLayers、Mapbox GL 等 WebGIS:

ogr2ogr -f "GeoJSON" -t_srs EPSG:4326 output.geojson input.shp

如果 Shapefile 中文属性乱码,可以尝试指定源数据编码:

ogr2ogr -f "GeoJSON" -oo ENCODING=GBK output.geojson input.shp

如果数据源实际是 UTF-8:

ogr2ogr -f "GeoJSON" -oo ENCODING=UTF-8 output.geojson input.shp

步骤 3:GeoJSON 转 GeoPackage

GeoPackage 比 GeoJSON 更适合存储较大的矢量数据,也更适合 QGIS 日常编辑。

ogr2ogr -f "GPKG" output.gpkg input.geojson

如果要指定图层名称:

ogr2ogr -f "GPKG" output.gpkg input.geojson -nln roads

如果输出文件已经存在,需要覆盖整个数据源:

ogr2ogr -f "GPKG" output.gpkg input.geojson -overwrite

如果只想覆盖同名图层,通常使用:

ogr2ogr -f "GPKG" output.gpkg input.geojson -nln roads -overwrite

步骤 4:Shapefile 转 GeoPackage 并保留常用设置

Shapefile 有字段名长度、文件数量、编码等限制。实际项目中,建议把多个 Shapefile 转为 GeoPackage 统一管理。

ogr2ogr -f "GPKG" output.gpkg input.shp -nln parcels

如果需要转换坐标系:

ogr2ogr -f "GPKG" -t_srs EPSG:4490 output.gpkg input.shp -nln parcels

EPSG:4490 是 CGCS2000 地理坐标系,在国内基础地理数据中较常见。使用前应确认项目要求,不要盲目替换坐标系。

步骤 5:只转换指定范围内的矢量数据

如果源数据很大,可以用 -spat 按矩形范围筛选。参数顺序为最小 X、最小 Y、最大 X、最大 Y。

ogr2ogr -f "GeoJSON" output_clip.geojson input.shp -spat 116.1 39.7 116.7 40.2

注意:-spat 的坐标值必须与输入数据坐标系一致。如果输入数据是投影坐标,不能直接写经纬度范围。

步骤 6:按 SQL 条件筛选矢量数据

可以使用 -where 按属性条件筛选。例如只导出类型为高速公路的数据:

ogr2ogr -f "GeoJSON" highway.geojson roads.shp -where "type='highway'"

也可以使用 -sql 执行查询:

ogr2ogr -f "GPKG" selected.gpkg input.gpkg -sql "SELECT * FROM roads WHERE type='highway'"

如果字段名包含中文、空格或特殊字符,建议先用 ogrinfo 查看字段真实名称,再写查询条件。

步骤 7:普通 TIFF 转压缩 GeoTIFF

栅格数据转换常用 gdal_translate。如果要输出压缩 GeoTIFF,可以使用创建选项 -co

gdal_translate -of GTiff -co COMPRESS=LZW input.tif output_lzw.tif

如果希望生成瓦片化 TIFF,适合大影像读取:

gdal_translate -of GTiff -co TILED=YES -co COMPRESS=LZW input.tif output_tiled.tif

-co 是 creation option,即输出格式的创建选项。不同格式支持的 -co 不完全相同。

步骤 8:GeoTIFF 转 Cloud Optimized GeoTIFF

Cloud Optimized GeoTIFF 常简称 COG,适合云端对象存储和 WebGIS 按需读取。

gdal_translate input.tif output_cog.tif -of COG

也可以增加压缩参数:

gdal_translate input.tif output_cog.tif -of COG -co COMPRESS=LZW

如果影像是连续色调航片或遥感影像,也可能使用 JPEG 压缩,但这通常是有损压缩,需要确认业务是否允许。

步骤 9:栅格重投影

栅格坐标系转换应使用 gdalwarp,而不是单纯的 gdal_translate。因为重投影需要重新计算像元位置和重采样。

gdalwarp -s_srs EPSG:4326 -t_srs EPSG:3857 input.tif output_3857.tif

指定重采样方法:

gdalwarp -s_srs EPSG:4326 -t_srs EPSG:3857 -r bilinear input.tif output_3857.tif

常见重采样方法:

  • near:最近邻,适合分类栅格、土地利用、行政编码栅格。
  • bilinear:双线性,适合 DEM、连续型数值栅格。
  • cubic:三次卷积,适合影像显示,但计算成本更高。

步骤 10:按矢量边界裁剪栅格

按行政区、项目范围或研究区裁剪影像时,常用 -cutline

gdalwarp -cutline boundary.shp -crop_to_cutline input.tif output_clip.tif

如果需要指定裁剪边界图层名称:

gdalwarp -cutline boundary.gpkg -cl boundary_layer -crop_to_cutline input.tif output_clip.tif

如果边界和影像坐标系不同,GDAL 通常可以根据坐标系信息处理,但前提是两者都正确带有坐标系。若其中一个缺失坐标系,应先修正元数据。

步骤 11:设置 NoData 值

NoData 是栅格中的无效值。裁剪、重投影、镶嵌时如果 NoData 设置不正确,可能出现黑边、白边或统计结果异常。

gdalwarp -srcnodata 0 -dstnodata 0 input.tif output.tif

如果源数据无效值是 255,输出希望也使用 255:

gdalwarp -srcnodata 255 -dstnodata 255 input.tif output.tif

步骤 12:指定输出分辨率

使用 -tr 可以指定输出像元大小。两个值分别表示 X 方向和 Y 方向分辨率。

gdalwarp -t_srs EPSG:3857 -tr 10 10 input.tif output_10m.tif

注意:不要随意把低分辨率数据转换成很高分辨率。这样不会增加真实信息,只会让文件变大,并可能误导后续分析。

常见坑:GDAL命令行参数容易出错的地方

坑 1:把“定义坐标系”和“转换坐标系”混为一谈

-s_srs 表示源坐标系,-t_srs 表示目标坐标系。它们用于坐标转换流程。但如果数据本身缺失坐标系,只是想写入坐标系元数据,矢量和栅格的处理方式不同,不能随便用重投影命令代替。

如果 Shapefile 没有 prj 文件,应先确认它真实使用的坐标系,再补充定义。错误定义坐标系会导致数据整体偏移。

坑 2:路径中有空格但没有加引号

Windows 中路径经常包含空格,例如 D:GIS Datainput.shp。这时必须加引号:

ogr2ogr -f "GeoJSON" "D:GIS Dataoutput.geojson" "D:GIS Datainput.shp"

坑 3:Shapefile 字段名被截断

Shapefile 的字段名长度有限,转出或转入时可能出现字段名截断。若项目中字段较多、字段名较长,建议优先使用 GeoPackage。

坑 4:中文乱码只改输出格式没有用

中文乱码通常与源数据编码有关。转换为 GeoJSON 或 GeoPackage 之前,应先确认 Shapefile 的编码。如果数据来自老系统,常见编码可能是 GBK;如果来自现代工具,可能是 UTF-8。

坑 5:栅格重投影后像元大小不合理

从经纬度坐标系转换到投影坐标系后,像元单位会从“度”变成“米”。如果不指定合理分辨率,输出结果可能不符合制图或分析要求。此时应结合 -tr 设置像元大小。

坑 6:分类栅格用了双线性重采样

土地利用、分类结果、编码栅格应使用 -r near。如果使用 bilinearcubic,可能产生不存在的分类值。

坑 7:输出文件已存在导致转换失败

矢量数据可根据情况使用 -overwrite。栅格转换中,如果输出文件已存在,建议先删除旧文件,或改用新的输出文件名,避免混淆结果。

方法比较:ogr2ogr、gdal_translate、gdalwarp 怎么选

工具 主要用途 典型输入 典型输出 常用参数
ogr2ogr 矢量格式转换、属性筛选、图层转换、矢量重投影 SHP、GeoJSON、GPKG、KML、CSV GeoJSON、GPKG、SHP、PostGIS -f-t_srs-where-sql-nln
gdal_translate 栅格格式转换、压缩、波段选择、COG 输出 TIFF、IMG、JP2、DEM GTiff、COG、PNG、JPEG -of-co-b-projwin
gdalwarp 栅格重投影、裁剪、重采样、按边界裁剪 GeoTIFF、DEM、遥感影像 重投影或裁剪后的栅格 -s_srs-t_srs-r-tr-cutline
gdalinfo 查看栅格信息 栅格数据 文本信息 -stats-json
ogrinfo 查看矢量信息 矢量数据 文本信息 -so-al-sql

简单记法:矢量找 OGR,栅格找 GDAL;只是改栅格格式用 gdal_translate,涉及栅格坐标变化和裁剪就用 gdalwarp

检查清单:执行 GDAL格式转换 前后要检查什么

转换前检查

  • 输入文件路径是否正确,路径中有空格时是否加了引号。
  • 数据是矢量还是栅格,是否选对命令。
  • 输入数据是否能被 ogrinfogdalinfo 正常读取。
  • 坐标系是否存在,EPSG 编码是否符合项目要求。
  • Shapefile 是否存在 .shp.shx.dbf.prj 等配套文件。
  • 中文属性是否需要指定编码。
  • 输出文件是否已存在,是否需要覆盖或改名。

转换后检查

  • 在 QGIS 或 ArcGIS Pro 中打开输出结果,检查位置是否正确。
  • 检查属性字段是否丢失、乱码或被截断。
  • 检查矢量要素数量是否符合预期。
  • 检查栅格范围、分辨率、波段数和 NoData 值。
  • 检查输出文件大小是否异常变大。
  • 如果用于 WebGIS,检查坐标系是否为前端地图需要的坐标系。

FAQ:GDAL格式转换常见问题

1. GDAL格式转换中 -f-of 有什么区别?

-f 常用于 ogr2ogr,表示矢量输出格式,例如 -f "GeoJSON"-of 常用于 gdal_translate,表示栅格输出格式,例如 -of GTiff。两者作用类似,但对应的工具不同。

2. Shapefile 转 GeoJSON 后为什么位置不对?

常见原因是源 Shapefile 坐标系缺失或定义错误。先用 ogrinfo input.shp -so -al 查看坐标系,再在 QGIS 中叠加底图检查位置。不要在不确定源坐标系的情况下随意使用 -s_srs

3. GeoJSON 文件太大,GDAL 能优化吗?

可以先转为 GeoPackage 存储和编辑,Web 发布前再进行简化、切片或转换为矢量瓦片。单纯用 GeoJSON 承载大量面要素,WebGIS 加载通常会变慢。

4. 栅格坐标系转换应该用 gdal_translate 还是 gdalwarp?

如果只是格式转换,用 gdal_translate。如果涉及坐标系转换、像元重采样、按边界裁剪,应使用 gdalwarp

5. GDAL命令行参数中的 -co 是什么意思?

-co 是创建选项,用于控制输出文件的创建方式。例如 GeoTIFF 常用 -co COMPRESS=LZW 开启压缩,-co TILED=YES 创建瓦片化 TIFF。

6. 为什么转换后的 Shapefile 字段名变短了?

这是 Shapefile 格式本身的限制,不是 GDAL 单独造成的。若需要保留较长字段名,建议输出为 GeoPackage。

7. GDAL 能把数据直接导入 PostGIS 吗?

可以。矢量数据可以使用 ogr2ogr 写入 PostgreSQL/PostGIS,但需要正确配置连接字符串、数据库权限和目标表名。初学者建议先完成本地格式转换,再处理数据库导入。

结论:掌握三类命令就能解决大多数 GDAL格式转换问题

GDAL格式转换的核心不是死记所有参数,而是先区分矢量和栅格,再选择正确工具。矢量转换用 ogr2ogr,栅格格式转换用 gdal_translate,栅格重投影和裁剪用 gdalwarp

实际项目中,建议先用 ogrinfogdalinfo 检查数据,再逐步添加坐标系、编码、筛选、压缩和裁剪参数。转换完成后,一定要在 GIS 软件中检查位置、字段、范围、分辨率和 NoData 值。这样处理 GDAL命令行参数,既能减少报错,也能避免生成看似成功但空间结果错误的数据。