☰
GDAL 2.3.1 Windows 64位预编译包使用指南:环境配置、影像处理与VS2022开发
2026/9/29 16:43:30 网站建设 项目流程

简介:本资源为自行编译的 GDAL 2.3.1 Windows 64 位版本压缩包,面向从事 GIS、遥感影像处理与空间数据转换的开发者及研究人员。GDAL 是开源栅格与矢量地理空间数据读写库,支持 GeoTIFF、JPEG、SQLite 及 HDF4、HDF5、ECW、MrSID 等专业遥感格式,自行编译便于按需选择编译选项与依赖配置。包内共 451 个文件,以 147 个 h 与 56 个 hpp 头文件、50 个 cmake 构建脚本、49 个 exe 可执行程序、19 个 dll 动态库、18 个 lib 库文件及 pdb 调试符号为主,另含 pc 配置、json、版权与说明文档,整体约 54.57MB,结构完整,便于二次开发与集成。目前已有 137 人学习下载,适合需要稳定 GDAL 运行环境、进行格式转换、投影处理或将其嵌入自有 GIS 框架的读者参考使用。

1. 拿到 gdal-2.3.1-x64-windows.zip 之后:这个包到底解决什么问题

如果你在 Windows 上做遥感影像处理、GIS 数据转换或者地图切片,大概率绕不开 GDAL。而gdal-2.3.1-x64-windows.zip这个文件名本身就说明了很多事:2.3.1 是版本号,x64 是 64 位架构,windows 是目标平台。它解决的核心问题只有一个——让你在 Windows 上不用自己编译源码,直接拿到一套能跑的命令行工具和动态库。很多人第一次接触 GDAL 是在 Python 里pip install gdal翻车之后,才回头找这种预编译包。这个包适合谁?适合需要gdal_translate、gdalwarp、ogr2ogr这些命令做批量处理的人,适合要把 GDAL 集成进 C++ 或 C# 项目的人,也适合被 VS2022 配置 GDAL 环境变量折磨过的开发者。它不是一个安装程序,解压之后你得自己配环境变量、自己确认依赖,这一点后面会细说。

2. 解压之后先别急着配环境变量:目录结构和依赖关系

2.1 压缩包里通常有什么

拿到gdal-2.3.1-x64-windows.zip之后,先解压到一个没有中文、没有空格的路径,比如D:\dev\gdal231。常见做法是解压后看到这样的结构:

gdal231/ ├── bin/ │ ├── gdal_translate.exe │ ├── gdalwarp.exe │ ├── ogr2ogr.exe │ ├── gdalinfo.exe │ └── *.dll ├── data/ │ ├── gcs.csv │ ├── pcs.csv │ └── ... ├── include/ │ ├── gdal.h │ ├── gdal_priv.h │ └── ... └── lib/ ├── gdal_i.lib └── gdal.lib

bin目录放的是可执行文件和运行时 DLL,data目录放的是坐标系统、投影参数等字典文件,include和lib是给 C++ 开发用的头文件和导入库。如果你只用命令行工具,重点在bin和data;如果你要在 VS2022 里写代码调用 GDAL,四个目录都要用到。

2.2 三个必须设置的环境变量

GDAL 在 Windows 上能不能跑起来,八成取决于环境变量有没有配对。我一般会设这三个:

变量名示例值作用
PATHD:\dev\gdal231\bin让系统找到 gdal*.exe 和依赖 DLL
GDAL_DATAD:\dev\gdal231\data让 GDAL 找到投影、坐标系字典
GDAL_DRIVER_PATHD:\dev\gdal231\bin\gdalplugins可选,指定额外驱动插件目录

设置方式用系统属性图形界面或者 PowerShell 都行。用 PowerShell 设置当前会话的临时变量可以这样写:

$env:PATH = "D:\dev\gdal231\bin;" + $env:PATH $env:GDAL_DATA = "D:\dev\gdal231\data"

逻辑说明:PATH必须把bin目录加进去,否则你在任意目录敲gdalinfo会提示找不到命令。GDAL_DATA不设的话,执行投影转换时会报Unable to open gcs.csv之类的错误,因为 GDAL 不知道去哪找坐标系统定义文件。参数上注意路径结尾不要带反斜杠,带反斜杠在某些版本上会解析异常。

2.3 验证是否真的可用

配完之后开一个新的命令行窗口,执行:

gdalinfo --version

正常输出应该是GDAL 2.3.1, released 2018/09/27这样的格式。如果提示不是内部或外部命令,说明PATH没生效,检查是不是开的新窗口、路径有没有写错。如果版本号出来了但执行gdalwarp报缺 DLL,那就是bin目录下的依赖库没被正确加载,常见的是缺msvcp140.dll或vcruntime140.dll,需要装对应的 Visual C++ Redistributable。

3. 用 gdal_translate 和 gdalwarp 跑通第一次影像处理

3.1 格式转换:把 GeoTIFF 转成 JPEG 并保留坐标信息

假设你手头有一个input.tif,想转成带世界文件的 JPEG。命令是这样:

gdal_translate -of JPEG -co WORLDFILE=YES -co QUALITY=90 input.tif output.jpg

逻辑说明:-of JPEG指定输出格式,-co是 creation option,WORLDFILE=YES会额外生成一个.jgw世界文件来保留地理坐标,QUALITY=90控制 JPEG 压缩质量。参数上注意,JPEG 不支持浮点型像素,如果原图是 Float32,需要先加-ot Byte做类型转换,否则会报错或者输出全黑。这一步做完,你会得到output.jpg和output.jgw两个文件,GIS 软件靠后者来定位。

3.2 投影转换:用 gdalwarp 做 UTM 重投影

正射校正后的影像经常需要从地理坐标系转到 UTM 投影。命令示例:

gdalwarp -t_srs EPSG:32650 -r bilinear -tr 30 30 input.tif output_utm.tif

逻辑说明:-t_srs EPSG:32650指定目标坐标系为 WGS84 / UTM zone 50N,-r bilinear指定重采样方法为双线性插值,-tr 30 30指定输出像元大小为 30 米。参数上,-r可选near、bilinear、cubic、cubicspline、lanczos,分类图用near,连续影像用bilinear或cubic。-tr不指定的话 GDAL 会自动计算,但自动算出来的分辨率可能不是你想要的。如果源数据有 NoData 值,记得加-srcnodata和-dstnodata,否则边缘会出现黑边。

3.3 批量处理:用 for 循环跑一个目录

Windows 命令行下批量转换可以这样写:

for %f in (*.tif) do gdal_translate -of GTiff -co COMPRESS=LZW "%f" "converted_%f"

逻辑说明:for %f in (*.tif)遍历当前目录所有 tif 文件,%f是文件名变量。注意在批处理文件里要写成%%f,在命令行直接执行写%f。-co COMPRESS=LZW启用 LZW 无损压缩,能显著减小文件体积。参数上,如果文件名带空格,变量要加双引号,否则会被截断。这个循环不会处理子目录,需要递归的话得用for /r。

4. 在 VS2022 里配置 GDAL 2.3.1 的 C++ 开发环境

4.1 项目属性里必须改的四个地方

VS2022 新建一个空 C++ 项目,右键项目 → 属性,按下面改:

配置项路径说明
C/C++ → 常规 → 附加包含目录D:\dev\gdal231\include找到 gdal.h
链接器 → 常规 → 附加库目录D:\dev\gdal231\lib找到 gdal_i.lib
链接器 → 输入 → 附加依赖项gdal_i.lib链接导入库
调试 → 环境PATH=D:\dev\gdal231\bin;%PATH%调试时能找到 DLL

注意平台要选 x64,因为包是 64 位的,选 Win32 会链接失败。gdal_i.lib是导入库,对应的动态库是gdal2031.dll之类的名字,运行时必须在PATH里能找到。

4.2 一段最小可运行的 C++ 代码

#include "gdal_priv.h" #include <iostream> int main() { GDALAllRegister(); // 注册所有驱动 GDALDataset* ds = (GDALDataset*)GDALOpen("input.tif", GA_ReadOnly); if (ds == nullptr) { std::cerr << "打开失败" << std::endl; return 1; } std::cout << "宽: " << ds->GetRasterXSize() << " 高: " << ds->GetRasterYSize() << " 波段数: " << ds->GetRasterCount() << std::endl; GDALClose(ds); return 0; }

逻辑说明:GDALAllRegister()必须在任何 GDAL 操作之前调用,否则驱动没注册,GDALOpen会返回空。GDALOpen第二个参数GA_ReadOnly表示只读,写操作要用GA_Update。GetRasterXSize和GetRasterYSize返回影像宽高,GetRasterCount返回波段数。参数上注意,GDALDataset是 C++ 接口,需要强制转换,C 接口用的是GDALDatasetH。

4.3 编译报错 LNK2019 的排查顺序

如果链接时报LNK2019 unresolved external symbol,按这个顺序查:第一,确认附加依赖项里写了gdal_i.lib;第二,确认库目录指向lib文件夹;第三,确认平台是 x64;第四,确认gdal_i.lib和你的 VS 版本 ABI 兼容。2.3.1 这个包通常是用 VS2015 或 VS2017 工具集编译的,VS2022 用 v143 工具集一般能兼容,但如果报错持续,可以试试把平台工具集改成 v141。

5. 避坑:GDAL 2.3.1 在 Windows 上最容易翻车的五个地方

5.1 现象:gdalinfo 能跑,但 gdalwarp 报 “Unable to open EPSG support file”

原因:GDAL_DATA没设或者指向了错误的目录。GDAL 做投影转换时需要读data目录下的gcs.csv、pcs.csv等文件,找不到就报这个错。

解决:确认GDAL_DATA指向解压后的data目录,并且该目录下确实有gcs.csv。如果是从别的机器拷贝的包,检查data目录是否完整。

5.2 现象:Python 里from osgeo import gdal报 ImportError

原因:Python 的 GDAL 绑定和这个二进制包的版本不匹配,或者PATH里没有bin目录导致找不到gdal2031.dll。

解决:先确认gdalinfo --version能跑,然后把bin目录加到PATH。Python 绑定的版本号必须和二进制包一致,2.3.1 的包就装 2.3.1 的 Python 绑定,不要混用 3.x 的绑定。

5.3 现象:gdal_translate 输出文件大小为 0 或全黑

原因:源数据类型和输出格式不兼容。比如 Float32 转 JPEG,或者源数据有 NoData 值但没指定。

解决:加-ot Byte做类型转换,加-srcnodata和-dstnodata处理无效值。如果源数据是 16 位无符号整型,转 Byte 之前要先做拉伸,否则高值会被截断。

5.4 现象:VS2022 调试时提示 “找不到 gdal2031.dll”

原因:调试环境变量没配,或者配了但路径写错。

解决:在项目属性 → 调试 → 环境中加PATH=D:\dev\gdal231\bin;%PATH%。注意这里的环境变量只影响调试会话,不影响系统全局。如果还是找不到,把bin目录下的所有 DLL 拷贝到 exe 同级目录也能临时解决。

5.5 现象:处理中文路径下的文件时报错或输出异常

原因:GDAL 2.3.1 对 UTF-8 路径的支持不完善,Windows 中文路径可能被错误解析。

解决:把文件放到纯英文路径下处理,或者用短路径名(8.3 格式)绕过。常见做法是在C:\temp下建工作目录,处理完再移走。这个坑在批量脚本里尤其隐蔽,因为单个文件测试可能正常,批量跑就翻车。

6. 进阶:用 VRT 做虚拟拼接和按需读取

VRT 是 GDAL 里最被低估的功能之一。它不实际复制像素,只记录一个 XML 描述文件,读的时候才按需从源文件取数据。对于大范围影像拼接,用 VRT 比物理拼接省时间和磁盘。

生成 VRT 的命令:

gdalbuildvrt mosaic.vrt tile1.tif tile2.tif tile3.tif

逻辑说明:gdalbuildvrt把多个 tif 的元信息写进mosaic.vrt,不复制像素。之后你可以直接用gdal_translate把 VRT 转成实体文件,或者用gdalwarp对 VRT 做重投影。参数上,如果各 tile 有重叠,加-resolution highest取最高分辨率,加-srcnodata指定无效值。

VRT 的另一个用法是波段运算。比如你要把三个单波段文件合成一个 RGB:

gdalbuildvrt -separate rgb.vrt band_r.tif band_g.tif band_b.tif

-separate表示每个输入文件作为一个独立波段,不加的话默认是按位置拼接。生成rgb.vrt之后,用gdal_translate -of GTiff -co COMPRESS=LZW rgb.vrt rgb.tif就能得到压缩后的 RGB 影像。

我自己的习惯是:任何超过 2GB 的拼接任务,先出 VRT 确认范围和波段没错,再转实体文件。这样万一参数写错,改 VRT 重新生成只要几秒,不用等半小时的物理拼接。另外 VRT 文件可以直接用文本编辑器打开,检查里面的SourceFilename和GeoTransform对不对,比黑匣子式的二进制文件好排查得多。

还有一个技巧:如果 VRT 引用的源文件路径变了,VRT 会失效。所以生成 VRT 之后不要移动源文件,或者用相对路径。我一般把 VRT 和源文件放在同一目录,用文件名而不是绝对路径引用,这样整个目录拷到别的机器也能用。

希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询