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即可獲得。