GDAL格式转换怎么做?命令行参数有哪些?
“GDAL格式转换怎么做?命令行参数有哪些?”是很多 GIS 初学者在处理 Shapefile、GeoJSON、GeoPackage、TIFF、DEM、投影坐标转换时都会遇到的问题。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_translate或gdalwarp。
背景:为什么 GDAL格式转换 经常失败
GDAL格式转换失败,通常不是 GDAL “不能转”,而是输入数据、坐标系、编码、驱动名称或路径写法有问题。尤其在 Windows 环境中,中文路径、空格路径、Shapefile 编码和坐标系缺失会导致很多看似随机的报错。
常见场景包括:
- Shapefile 转 GeoJSON 后中文属性乱码。
- GeoJSON 转 Shapefile 后字段名被截断。
- GeoTIFF 转换后坐标位置偏移。
- 栅格重投影后分辨率变粗或文件变大。
- 命令执行提示
Unable to open datasource或not 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。如果使用 bilinear 或 cubic,可能产生不存在的分类值。
坑 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格式转换 前后要检查什么
转换前检查
- 输入文件路径是否正确,路径中有空格时是否加了引号。
- 数据是矢量还是栅格,是否选对命令。
- 输入数据是否能被
ogrinfo或gdalinfo正常读取。 - 坐标系是否存在,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。
实际项目中,建议先用 ogrinfo 或 gdalinfo 检查数据,再逐步添加坐标系、编码、筛选、压缩和裁剪参数。转换完成后,一定要在 GIS 软件中检查位置、字段、范围、分辨率和 NoData 值。这样处理 GDAL命令行参数,既能减少报错,也能避免生成看似成功但空间结果错误的数据。