GDAL 2.3.1 Windows 64位预编译包使用指南:环境配置、影像处理与VS2022开发

发布时间:2026/9/29 16:43:35
GDAL 2.3.1 Windows 64位预编译包使用指南:环境配置、影像处理与VS2022开发 简介本资源为自行编译的 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.libbin目录放的是可执行文件和运行时 DLLdata目录放的是坐标系统、投影参数等字典文件include和lib是给 C 开发用的头文件和导入库。如果你只用命令行工具重点在bin和data如果你要在 VS2022 里写代码调用 GDAL四个目录都要用到。2.2 三个必须设置的环境变量GDAL 在 Windows 上能不能跑起来八成取决于环境变量有没有配对。我一般会设这三个变量名示例值作用PATHD:\dev\gdal231\bin让系统找到 gdal*.exe 和依赖 DLLGDAL_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 WORLDFILEYES -co QUALITY90 input.tif output.jpg逻辑说明-of JPEG指定输出格式-co是 creation optionWORLDFILEYES会额外生成一个.jgw世界文件来保留地理坐标QUALITY90控制 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 COMPRESSLZW %f converted_%f逻辑说明for %f in (*.tif)遍历当前目录所有 tif 文件%f是文件名变量。注意在批处理文件里要写成%%f在命令行直接执行写%f。-co COMPRESSLZW启用 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链接导入库调试 → 环境PATHD:\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”原因调试环境变量没配或者配了但路径写错。解决在项目属性 → 调试 → 环境中加PATHD:\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 的另一个用法是波段运算。比如你要把三个单波段文件合成一个 RGBgdalbuildvrt -separate rgb.vrt band_r.tif band_g.tif band_b.tif-separate表示每个输入文件作为一个独立波段不加的话默认是按位置拼接。生成rgb.vrt之后用gdal_translate -of GTiff -co COMPRESSLZW rgb.vrt rgb.tif就能得到压缩后的 RGB 影像。我自己的习惯是任何超过 2GB 的拼接任务先出 VRT 确认范围和波段没错再转实体文件。这样万一参数写错改 VRT 重新生成只要几秒不用等半小时的物理拼接。另外 VRT 文件可以直接用文本编辑器打开检查里面的SourceFilename和GeoTransform对不对比黑匣子式的二进制文件好排查得多。还有一个技巧如果 VRT 引用的源文件路径变了VRT 会失效。所以生成 VRT 之后不要移动源文件或者用相对路径。我一般把 VRT 和源文件放在同一目录用文件名而不是绝对路径引用这样整个目录拷到别的机器也能用。希望帮到你。本文还有配套的精品资源点击获取