GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。该项目由Frank Warmerdam教授于1998年发起。 它利用抽象数据模型来表达所支持的各种文件格式。 它还有一系列命令行工具来进行数据转换和处理。 OGR(OpenGIS Simple Features Reference Implementation)是GDAL项目的一个子项目,提供对矢量数据的支持。 一般把这两个库合称为GDAL/OGR,或者简称为GDAL。这个库是GIS、遥感系统开发必备神器。
一、编译环境说明
- 操作系统:Win11
- 编译器:Visual Studio 2019
- CMake:3.27.0
- gdal版本:3.7.1
二、依赖说明
因为gdal支持几乎所有矢量、栅格文件格式的读写和转换,以及基础的分析功能,因此依赖库也是非常多。不过gdal对于编译的支持也是非常贴心的,虽然多,但编译起来也不算难。由于依赖实在太多,这里就不一一列举,只列出核心依赖。
依赖项 | 版本 |
geos | 3.12.0 |
proj | 9.2.1 |
libtiff | 4.5.0 |
libpng | 1.6.37 |
以上除了GEOS和PROJ外部设置外,其他相应的读写库其实gdal内部都包含了源码(和相应的Driver一起),会和GDAL一起参与编译。所以说虽然依赖多,但并不需要配置很多内容。如果你要特别替换其中的版本,例如替换libtiff最新版,那么得手动将代码全部替换,一般情况下不推荐这么做。
三、编译过程
1、源码下载
官方下载地址:Download — GDAL documentation
2、编译命令
直接上脚本吧:
@echo off
if defined PROGRAMFILES(X86) set PF86=%PROGRAMFILES(X86)%
if not defined PF86 set PF86=%PROGRAMFILES%
if not defined PF86 (echo PROGRAMFILES not set & goto error)
set PROJ_ROOT=D:\SourceCode\proj-9.2.1\prefix
set GEOS_ROOT=D:\SourceCode\geos-3.12.0\install
set OPENSSL_ROOT=D:\SourceCode\openssl-1.1.1t\prefix
set VCSDK=10.0.19041.0
set VCARCH=amd64
if not defined CC set CC=cl.exe
if not defined CXX set CXX=cl.exe
if not defined OSGEO4W_ROOT set OSGEO4W_ROOT=C:\OSGeo4W64
for %%e in (Community Professional Enterprise) do if exist "%PF86%\Microsoft Visual Studio\2019\%%e" set vcdir=%PF86%\Microsoft Visual Studio\2019\%%e
if not defined vcdir (echo Visual C++ not found & goto error)
set VS160COMNTOOLS=%vcdir%\Common7\Tools
call "%vcdir%\VC\Auxiliary\Build\vcvarsall.bat" %VCARCH% %VCSDK%
path %path%;%vcdir%\VC\bin
if exist "%PROGRAMFILES%\CMake\bin" path %PROGRAMFILES%\CMake\bin;%PATH%
if exist "%PF86%\CMake\bin" path %PF86%\CMake\bin;%PATH%
set LIB=%LIB%;%PROJ_ROOT%\lib;%GEOS_ROOT%\lib;%OPENSSL_ROOT%\lib
set INCLUDE=%INCLUDE%;%PROJ_ROOT%;%GEOS_ROOT%\include;%OPENSSL_ROOT%\include
goto end
:usage
echo usage: %0
exit /b 1
:error
echo ENV ERROR %ERRORLEVEL%: %DATE% %TIME%
exit /b 1
:end
cmake -DCMAKE_INSTALL_PREFIX=.\install -S . -B .\bld
简要说明:其中配置了PROJ、GEOS、OPENSSL的路径就可以了。常用的编译选项如下:
BUILD_APPS:是否编译应用,即常用的工具,默认为ON
CMAKE_PREFIX_PATH:指定CMake搜索外部模块的地址
GDAL_BUILD_OPTIONAL_DRIVERS:编译可选Drivers,默认是ON,如果您对于GDAL编译出来的库觉得太大,可以把该选项关闭,那么GDAL就只会编译内置的,可选的就不编译了
OGR_BUILD_OPTIONAL_DRIVERS:与上一个选项类似,不过这是控制OGR的
GDAL_ENABLE_DRIVER_<driver_name>和OGR_ENABLE_DRIVER_<driver_name>:若你想精确控制可选Driver是否编译,可以通过该选项进行指定Driver,driver_name如下:
driver_name | 说明 |
GDAL_ENABLE_DRIVER_RAW | ACE2, BT, BYN, CPG, CTable2, DIPEx, DOQ1, DOQ2, EHDR, EIR, ENVI, FAST, GenBIN, GSC, GTX, MFF2, ISCE, KRO, MFF, LAN, LCP, LOSLAS, NDF, NTv2, PAUX, PNM, ROIPAC, RRASTER, SNODAS |
GDAL_ENABLE_DRIVER_PDS | PDS, PDS4, ISIS2, ISIS3, VICAR |
GDAL_ENABLE_DRIVER_ECW | ECW, JP2ECW |
GDAL_ENABLE_DRIVER_EEDA | EEDA, EEDAI |
GDAL_ENABLE_DRIVER_GSG | GSAG, GSBG, GS7BG |
GDAL_ENABLE_DRIVER_HDF5 | HDF5, BAG |
GDAL_ENABLE_DRIVER_MRSID | MrSID, JP2MrSID |
GDAL_ENABLE_DRIVER_NITF | NITF, RPFTOC, ECRGTOC |
GDAL_ENABLE_DRIVER_NORTHWOOD | NWT_GRD, NWT_GRC |
GDAL_ENABLE_DRIVER_ADRG | SRP, ADRG |
GDAL_ENABLE_DRIVER_ILI | Interlis 1, Interlis 2 |
GDAL_ENABLE_DRIVER_WFS | WFS, OAPIF |
GDAL_ENABLE_DRIVER_AVC | AVCBIN, AVCE00 |
GDAL_ENABLE_DRIVER_DWG | DWG, DGNv8 |
GDAL_ENABLE_DRIVER_AIGRID | AIG |
GDAL_ENABLE_DRIVER_ENVISAT | ESAT |
GDAL_ENABLE_DRIVER_GEOR | GeoRaster |
GDAL_ENABLE_DRIVER_IDRISI | RST |
OGR_ENABLE_DRIVER_ELASTIC | ElasticSearch |
OGR_ENABLE_DRIVER_PG | PostgreSQL |
OGR_ENABLE_DRIVER_NTF | UK .NTF |
OGR_ENABLE_DRIVER_CAD | CAD |
GDAL_ENABLE_DRIVER_NETCDF | netCDF |
GDAL_ENABLE_DRIVER_PDF | |
OGR_ENABLE_DRIVER_GPKG | GPKG |
OGR_ENABLE_DRIVER_NGW | NGW |
OGR_ENABLE_DRIVER_SQLITE | SQLite |
GDAL_USE_EXTERNAL_LIBS:默认ON,如果设置为OFF,则所有外部指定依赖都将失效,不过也可以通过GDAL_USE_<Packagename_in_upper_case>选项单独配置,这对于需要指定特定依赖库版本时特别有用。于此相反,还有个GDAL_USE_INTERNAL_LIBS选项,与之相反。
四、编译可能出现的错误
1、error LNK2019: 无法解析的外部符号 EVP_PKEY_size
正在创建库 D:/SourceCode/gdal-3.7.1/bld/RelWithDebInfo/gdal.lib 和对象 D:/SourceCode/gdal-3.7.1/bld/RelWithDebInfo/gdal.exp161>cpl_sha256.obj : error LNK2019: 无法解析的外部符号 EVP_PKEY_size,函数 CPL_RSA_SHA256_Sign 中引用了该符号161>D:\SourceCode\gdal-3.7.1\bld\RelWithDebInfo\gdal.dll : fatal error LNK1120: 1 个无法解析的外部命令
这是个链接错误,无法找到EVP_PKEY_size函数。这个函数是OpenSSL库的,一开始编译时,使用的是OpenSSL3.1.1,因此可能是版本太高了,这个函数更名或被移除了。 解决方法有二:
方法一:只需要变更为OpenSSL1.1.1即可
方法二:将GDAL_USE_OPENSSL选项设置为OFF
五、小结
赶快动动你的小手编起来,如果你实在懒,小编提供了下载链接,关注同名GZH回复gdal即可获得。
本文暂时没有评论,来添加一个吧(●'◡'●)