本篇为VS2019配置GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5的过程!
本篇为基于VS2019(MSVC),编译X64的Debug版本的静态库GDAL,其他版本会在中间注释。
GDAL3.0
以上编译要求PROJ6
投影库,而PROJ6
又要求SQLite3
环境,所以编译GDAL
之前我们需要编译好SQLite3
和PROJ6
。
GDAL
本身没有自带HDF
库,如果需要读取HDF4/5
数据的话还需要集成GEOS
库和HDF4/5
库。
(a,b,c必备,d,e,f可选)
注意:如果要配置GEOS,HDF4,HDF5,编译GDAL之前先配置这三个库,配置完再编译!
a. GDAL官方下载地址为GDAL官网,我下载的版本是gdal-3.3.2;
b. PROJ6的官方下载地址为PROJ官网,我现在的版本为6.3.2版本;
c. SQLite3的官方下载地址为SQLite官网,下载Source Code下的sqlite-amalgamation-3360000.zip
,和Precompiled Binaries for Windows下的sqlite-dll-win64-x64-3360000.zip
(如果要配置32位GDAL,则下载sqlite-dll-win32-x86-3360000.zip
), sqlite-tools-win32-x86-3360000.zip
。
为了方便编译,我将下载的三个文件分别解压在F盘的GDALTools目录下GDAL、PROJ、SQLite文件夹内,以备后用。
d. GEOS下载,地址GEOS官网,我下的geos-3.7.3
,后面需要编译;
e. HDF4库下载,HDF4.2.6下载地址,HDF4.2.6_win_x64.zip
(如果要配置32位GDAL,则下载HDF4.2.6_win_x86.zip
);
f. HDF5库下载,HDF5-1.8.7下载地址,HDF5-1.8.7_win_x64.zip
(如果要配置32位GDAL,则下载 HDF5-1.8.7_win_x86.zip
);
e和f下载的就是编译好的,将下载的GEOS、HDF4、HDF5分别解压编译GDAL所需库和工具目录(我的是F:\GDALTools)下的supportlibs文件夹下,方便后面配置。
cmake官方下载地址为CMake官网,下载cmake-3.18.0-rc4-win64-x64.msi
(编译32位GDAL则下载cmake-3.18.0-rc2-win32-x86.msi
,其实不太影响,32位的GDAL必须一套32位,强迫症罢了!)文件直接在windows上安装,安装过程中选择Add CMake to the system PATH for all users
或者Add CMake to the system PATH for the current users
为所有用户或者只为当前用户配置环境变量,以便在cmd命令行中使用。
安装完后win + R 输入 cmd 打开命令行,在命令行中输入cmake -version
查看cmake是否安装成功,出现以下内容即为安装成功!
将下载好的两个文件sqlite-amalgamation-3360000.zip
、和sqlite-dll-win64-x64-3360000.zip
解压到SQLite文件夹内,如下所示:
F:\GDALTools\SQLite
├─sqlite-amalgamation-3360000
│ shell.c
│ sqlite3.c
│ sqlite3.h
│ sqlite3ext.h
│
└─sqlite-dll-win64-x64-3360000
sqlite3.def
sqlite3.dll
选好工程创建位置之后,将sqlite3.c
、sqlite3.h
、sqlite3ext.h
、sqlite3.def
四个文件添加到工程中,如下图所示:
配置选择所有配置
,平台选择所有平台
,配置类型选择静态库(.lib)
(如果要配置动态库,则选择
点击C/C++,选择预处理器,点击预处理器定义进行编辑
将以下内容添加到预定义处理里面
_USRDLL
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_FTS5
SQLITE_ENABLE_UNLOCK_NOTIFY
修改编译器配置类型为Debug,X64
编译64位Debug版GDAL选择 Debug,X64
编译32位Debug版GDAL选择 Debug,X86
编译64位Release版GDAL选择 Release,X64
编译32位Release版GDAL选择 Release,X86
在F:\GDALTools\SQLite\SQLite3\x64\Debug
(你的项目目录下)文件夹可以看到SQLite3.lib静态库(Release版在F:\GDALTools\SQLite\SQLite3\x64\Release
文件夹中)。
在SQLite目录中分别创建include和lib和bin文件夹,将刚才生成的SQLite3.lib
文件放入lib文件夹中,将sqlite-amalgamation-3360000
中的sqlite3.h
、sqlite3ext.h
放入include中,将sqlite-tools-win32-x86-3360000
中的sqlite3.exe放在bin文件夹中以备后用。
proj-6.3.2.tar.gz
解压到PROJ文件夹中。Where is the source code
选择proj
库文件夹所在路径,Where to build the binaries
选择你刚在所创建的build
目录所在路径
点击左下角的Configure
,选择 Visual Studio 16 2019
和 x64
(编译32位则选择X86),然后点击Finish。
点击完Finish他会开始进行安装,会出现一些错误,如图:
这时找到Name
为EXE_SQLITE3
、SQLITE3_INCLUDE_DIR
和SQLITE3_LIBRARY
三个属性,可以看到现在它们的Value
值都为NOTFOUND或者其他路径的状态,这并不相符合,我们将SQLite3.exe
、include
和SQLite3.lib
的路径分别赋给它们,并找到Name为CMAKE_INSTALL_PREFIX
的属性设置文件生成目录,我设置的是F:\GDALTools\PROJ\OSGeo4W
。
重新点击Configure,提示Configuring done。点击Generate,提示Generating done。这时可以看到build
文件夹里有PROJ4.sln。
打开x64 Native Tools Command Prompt for VS 2019
(一般在开始菜单安装VS2019的文件夹里就能看到),进入build文件夹。
然后输入命令:
msbuild ALL_BUILD.vcxproj /p:Configuration="Debug"
msbuild INSTALL.vcxproj /p:Configuration="Debug"
进行编译
第一行命令结果:
警告不影响,如果想消除警告,进入到..\PROJ\proj-6.3.2\src\transformations
将deformation.cpp
和helmert.cpp
用VS高级保存选项保存成Unicode - 代码页 1200
编码,然后再重新编译
如果没有"高级保存选项"请参考这篇文章
这时可以在设置的文件生成目录中找到生成的文件
bin
中有各种*.exe
文件、 include
中放有头文件、 lib
中是静态库文件、share
放有一些数据文件。到此PROJ编译完成。
nmake.opt
文件首先进入GEOS源码文件夹中的,修改nmake.opt文件
26行的BUILD_DEBUG =
设置成YES(如果是Release版,设置为NO)
56行的WIN64=
设置成YES(如果是编译32位,设置为NO)
166和167行的GEOS_MSVC
和GEOS_MSC
分别按照自己的MSVC版本修改
管理员运行x64 Native Tools Command Prompt for VS 2019
(在开始菜单中)(编译32位则选择x86 Native Tools Command Prompt for VS 2019
),cd
进入GEOS
文件夹下,输入以下命令:
autogen.bat
nmake -f makefile.vc
GDAL3.3.2
解压到GDAL
文件夹内。进入GDAL源码文件夹中,找到nmake.opt
文件打开。
42行左右的MSVC_VER=
设置为1929
,具体数字根据自己的MSVC版本设置;
66行左右的GDAL_HOME =
设置成想要的位置,我设置成F:\GDALAllVersions\GDAL_Static_MSVC_Debug_X64
;
130行左右的DEBUG=0
改为DEBUG=1
;(如果是Release版,设置为0)
213行左右的#WIN64=YES
去掉#号注释,变为WIN64=YES
;(如果是编译32位,设置为NO)
240行左右的DLLBUILD=1
改为DLLBUILD=0
,1
启动动态编译、 0
为静态编译。我这里进行静态编译设置DLLBUILD=0
;
260行和264行左右找到PROJ_INCLUDE
PROJ_LIBRARY
,分别设置成你刚才生成PROJ时的include
和lib
文件夹(其中PROJ_INCLUDE
的-I
后为地址),并将.lib的名称改对,最后去掉#号注释。
# PROJ stuff (required dependency: PROJ >= 6)
PROJ_INCLUDE = -IF:\GDALTools\PROJ\OSGeo4W\include
# Note: add shell32.lib is needed starting with PROJ 7.0 in some circumstances
# for static linking. See https://github.com/OSGeo/gdal/issues/2488
# And ole32.lib also since PROJ 7.1 (see https://github.com/OSGeo/gdal/issues/2743)
PROJ_LIBRARY = F:\GDALTools\PROJ\OSGeo4W\lib\proj_d.lib
650行和651行左右,找到SQLITE_INC
, SQLITE_LIB
分别设置成你刚才创建在SQLite文件夹里的include
和lib
文件夹(其中SQLITE_INC
的-I
后为地址),并将.lib的名称改对,最后去掉#号注释。
# SQLite Libraries
SQLITE_INC=-IF:\GDALTools\SQLite\include
SQLITE_LIB=F:\GDALTools\SQLite\lib\SQLite3.lib
753行,754行,755行左右找到GEOS_DIR
,GEOS_CFLAGS
,GEOS_LIB
#GEOS_DIR=C:/warmerda/geos
#GEOS_CFLAGS = -I$(GEOS_DIR)/capi -I$(GEOS_DIR)/source/headers -DHAVE_GEOS
#GEOS_LIB = $(GEOS_DIR)/source/geos_c_i.lib
将其修改为:
GEOS_DIR=F:\GDALTools\supportlibs\geos-3.7.3
GEOS_CFLAGS = -I$(GEOS_DIR)/capi -I$(GEOS_DIR)/include -DHAVE_GEOS
GEOS_LIB = $(GEOS_DIR)/src/geos_c_i_d.lib
注意,geos_c_i_d.lib是debug版本的库,编译release版本时使用geos_c_i.lib
581行左右,找到HDF4_PLUGIN
,HDF4_DIR
,HDF4_LIB
,HDF4_INCLUDE
#HDF4_PLUGIN = NO
#HDF4_DIR = D:\warmerda\HDF41r5
#HDF4_LIB = /LIBPATH:$(HDF4_DIR)\lib Ws2_32.lib
#HDF4_INCLUDE = $(HDF4_DIR)\include
将其修改为:
HDF4_PLUGIN = NO
HDF4_DIR = F:\GDALTools\supportlibs\HDF4.2.6_win_x64
HDF4_LIB = $(HDF4_DIR)\dll\hd426m.lib $(HDF4_DIR)\dll\hm426m.lib \
$(HDF4_DIR)\lib\hd426.lib $(HDF4_DIR)\lib\hm426.lib Ws2_32.lib
HDF4_INCLUDE = $(HDF4_DIR)\include
593行左右,找到HDF5_PLUGIN
,HDF5_DIR
,HDF5_LIB
#HDF5_PLUGIN = NO
#HDF5_DIR = c:\warmerda\supportlibs\hdf5\5-164-win
#HDF5_LIB = $(HDF5_DIR)\dll\hdf5dll.lib
将其修改为:
HDF5_PLUGIN = NO
HDF5_DIR = F:\GDALTools\supportlibs\HDF5-1.8.7_win_x64
HDF5_LIB = $(HDF5_DIR)\dll\hdf5dll.lib
至此,GDAL的namke.opt文件修改完毕,保存文件!
打开x64 Native Tools Command Prompt for VS 2019
(编译32位则选择x86 Native Tools Command Prompt for VS 2019
),进入GDAL文件夹下,运行以下三行命令:
nmake /f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
最后,记得将hdf4
和hdf5
库中的dll文件夹下的.dll
文件(总共18个,因为重复2个,所以加进去为16个)、GEOS
库文件夹下src
文件夹中geos_c_d.dll
文件,都拷贝到GDAL
编译后存放的目录下的bin
文件夹下,否则会提示你找不到xxx.dll
文件。
右键 此电脑 --> 属性 --> 高级系统设置 --> 环境变量 --> 找到下面系统变量里面的Path,双击 --> 将编译好的GDAL
的bin
文件夹路径添加到里面。比如我的路径是F:\GDALAllVersions\GDAL_Static_MSVC_Debug_X64\bin
将生成的OSGeo4W
文件夹下的share
文件夹下的proj
文件夹路径添加到Path
比如我的路径是F:\GDALTools\PROJ\OSGeo4W\share\proj
至此,GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5 编译完成!
首先创建一个main.cpp
,使项目属性具有C/C++选项。
在项目中创建GetRasterInformation.h
头文件和GetRasterInformation.cpp
源文件
创建main.cpp
主文件
GetRasterInformation.h
声明函数
/**
* GetRasterInformation.h声明函数
*/
#pragma once
#include "gdal_priv.h"
#include
using namespace std;
/**
* 获取图像信息
*/
void GetRasterInformation(const char* file);
GetRasterInformation.cpp
定义函数
#include "GetRasterInformation.h"
void GetRasterInformation(const char* file)
{
//注册文件格式
GDALAllRegister();
//使用只读方式打开图像
GDALDataset* poDataset = (GDALDataset*)GDALOpen(file, GA_ReadOnly);
if (poDataset == NULL)
{
cout << "File:" << "E:\\DataSet\\test.tif" << "不能打开!"<GetDriver()->GetDescription()
<< "/" << poDataset->GetDriver()->GetMetadataItem(GDAL_DMD_LONGNAME)
<< endl;
//输出图像的大小和波段个数
cout << "Size is " << poDataset->GetRasterXSize()
<< "x" << poDataset->GetRasterYSize()
<< "x" << poDataset->GetRasterCount()
<< endl;
//输出图像的投影信息
if (poDataset->GetProjectionRef() != NULL)
{
cout << "Projection is " << poDataset->GetProjectionRef() << endl;
}
//输出图像的坐标和分辨率信息
double adfGeoTransform[6];
if (poDataset->GetGeoTransform(adfGeoTransform) == CE_None)
{
printf("Origin = (%.6f,%.6f)\n", adfGeoTransform[0], adfGeoTransform[3]);
printf("PixelSize = (%.6f,%.6f)\n", adfGeoTransform[1], adfGeoTransform[5]);
}
//读取第一个波段
GDALRasterBand* poBand = poDataset->GetRasterBand(1);
GDALDataType type = poBand->GetRasterDataType();//获取数据类型
cout << "第一个波段的数据类型为:" << GDALGetDataTypeName(type) << endl;
//获取该波段的最大值最小值,如果获取失败,则进行统计
int bGotMin, bGotMax;
double adfMinMax[2];
adfMinMax[0] = poBand->GetMinimum(&bGotMin);
adfMinMax[1] = poBand->GetMaximum(&bGotMax);
if (!(bGotMin && bGotMax))
{
GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);
}
printf("Min = %.3fd , Max = %.3f\n", adfMinMax[0], adfMinMax[1]);
//关闭文件
GDALClose(poDataset);
}
main.cpp
主函数
#include "GetRasterInformation.h"
int main()
{
const char* inFile = "E:\\DataSet\\RGB.tif";
GetRasterInformation(inFile);
system("pause");
return 0;
}
非常感谢这些大神的帮助!!!
排名不分先后,皆为大神!!!