源代码下载
git clone https://github.com/OSGeo/gdal.git
PROJ安装配置
GDAL3.0以上版本必须依赖于PROJ库(6.0以上版本),因此需要在编译前安装PROJ。PROJ可以通过源代码编译安装,这种方式我刚开始尝试了没有成功,也可以通过osgeo或conda安装,我采用的是conda安装
conda create -n proj python=3.8
conda activate proj
conda install proj
通过conda安装的PROJ,安装目录如下,在后面会用到这两个目录
D:\ProgramData\Anaconda3\envs\proj\Library\include
这个目录包含PROJ的头文件
D:\ProgramData\Anaconda3\envs\proj\Library\lib
这个目录包含PROJ的库文件 此外还需要配置环境变量PROJ_LIB,否则会在用GDAL进行坐标转换时报错,PROJ_LIB为proj.db所在路径
修改编译配置文件
修改GDAL源码目录下的nmake.opt文件
- GDAL_HOME = “C:\warmerda\bld” GDAL的安装路径(66行左右),可以根据自己的需要进行修改,我的是GDAL_HOME = “G:\warmerda\bld”
- PROJ_INCLUDE 和 PROJ_LIBRARY(260行左右) ,在编译的时候需要指明PROJ路径,我的如下:
PROJ_INCLUDE = -ID:\ProgramData\Anaconda3\Library\include
PROJ_LIBRARY = D:\ProgramData\Anaconda3\Library\lib\proj.lib shell32.lib ole32.lib
编译
打开x64 Native Tools Command Prompt for VS 2017工具,切换到GDAL源码目录下 编译安装步骤
nmake -f makefile.vc WIN64=1 注意:在nmake.opt文件中可以通过去掉WIN64=YES的注释,来编译64位的GDAL,但我这样做编译一直报错(很奇怪),所以就在编译命令行中直接加上WIN64=1,效果是一样的,编译成功nmake -f makefile.vc WIN64=1 install 这会在安装目录下生成bin和data两个文件 bin文件夹中存放的是GDAL命令行工具,将该目录添加到环境变量PATH后,可以直接调用 环境变量 GDAL命令行调用 nmake -f makefile.vc WIN64=1 install 这会在安装目录下生成include和lib两个文件,用于二次开发,后续VS开发环境配置会用到这两个目录
VS2017 GDAL配置
- 打开VS2017新建项目
- 项目、属性
- VC++目录、包含目录
- VC++目录、库目录
- 链接器、输入、附加依赖项
测试
注意修改为自己的图像路径
#include <gdal_priv.h>
#include <iostream>
using namespace std;
int main()
{
GDALAllRegister();
const char * tifpath = "./demo.tif";
GDALDataset * ds = (GDALDataset *)GDALOpen(tifpath, GA_ReadOnly);
if (ds == NULL)
{
cout << "打开文件失败" << endl;
return 0 ;
}
cout << "图像基本信息" << endl;
cout << ds->GetDriver()->GetDescription() << endl;
cout << "图像元数据" << endl;
cout << ds->GetDriver()->GetMetadataItem(GDAL_DMD_LONGNAME) << endl;
int bandcount = ds->GetRasterCount();
cout << "图像波段数目:" << bandcount << endl;
int width = ds->GetRasterXSize();
int height = ds->GetRasterYSize();
cout << "图像宽度:" << width << endl;
cout << "图像高度:" << height << endl;
const OGRSpatialReference * sr = ds->GetSpatialRef();
char * srwkt;
sr->exportToWkt(&srwkt);
cout << "坐标信息:" << endl;
cout << srwkt << endl;
system("pause");
return 0;
}
输出
|