刚上研一那会就听师兄说起GDAL,由于当时刚开始用C#开发,所以看着他们编译了一下GDAL1.5的代码,试图用的C#图像处理的开发中,感觉好繁琐啊!所以虽然一直有心学习一下,但只是粗略的接触了一些。知道Google earth、ArcGIS都在用。最近再一次学习C++,觉得有必要从新接触GDAL。查阅了一些资料,发现1.7以后的版本编译起来并不是那么困难!尤其是应用到C++中的开发中。所以先编译了一个简单的应用到学习中。
一、环境准备:
1.VC++2010
2.gdal181源码
首先使用VisualStudio2010 IDE编译,但是在C:\warmerda\bld盘只安装了bin、data、html三个文件夹,所以在测试开发的时候找不到include和lib文件夹。
决定使用cmd命令行编译,首先在“开始菜单\所有程序\Microsoft Visual Studio 2010\Visual Studio Tools\ Visual Studio 2010命令提示”
使用cd命令,切换到GDAL的源代码目录, 依次敲入 下面的命令行后回车,等待编译结束即可。
nmake -f makefile.vc
nmake -f makefile.vc install
nmake -f makefile.vc devinstall
同时还有其他的命令,如:
nmake -f makefile.vc clean nmake -f makefile.vc MSVC_VER=1600clean nmake -f makefile.vc MSVC_VER=1600DEBUG=
1
上面六行的命令含义依次是:
1
编译GDAL库
2
编译GDAL库,并安装(这里安装的意思就是将生成的dll,
exe等文件拷贝到C:
\warmerda\bld目录),
3
编译GDAL库,并安装开发者模式(安装的意思同上,
开发者模式意思是将开发用的include文件夹中的头文件和lib文件一同拷贝到
C:
\warmerda\bld目录,
此时会在C:
\warmerda\bld目录中多出来两个文件夹,分别是include和lib,分别存放的是GDAL的头文件和lib文件,用于调用GDAL库使用)。
4
清理GDAL库,同时会删除编译GDAL库所生成的临时文件,作用相当于在VS环境中的清理命令。
5
作用同上,但是添加了一个MSVC_VER=
1600
,表示使用VS2010编译。
6
编译GDAL库的debug模式,可以用来调试GDAL源码。
这样再C:\warmerda\bld盘只安装了bin、data、html、include、lib共5个文件夹。这样简单的开发用到的项目基本全了。
( 参考:http://www.cnblogs.com/bigbigtree/archive/2011/11/20/2256434.html 该文章写的很好,特别推荐,只是配图没有了!)
二、测试开发
1.新建一个win32项目命名为readimg
2.配置项目【属性】
【C/C++】-【常规】,右侧的【附加包含目录】中,选择GDAL的include文件夹路径
【链接器】-【常规】,右侧的【附加库目录】中,选择GDAL的lib文件夹路径
【链接器】-【输入】,右侧的【附加依赖项】中,填写gdal_i.lib
3.添加头文件
1
#include
"
cpl_conv.h
"
2
#include
"
gdal_priv.h
"
4.在main中键入如下代码
1
//
注册文件格式
2
GDALAllRegister();
3
4
const
char
* pszFile =
"
D:\\hsy.img
"
;
5
GDALDataset*
poDataset;
6
//
使用只读方式打开图像
7
poDataset = (GDALDataset*
)GDALOpen(pszFile,GA_ReadOnly);
8
if
( poDataset ==
NULL )
9
{
10
printf(
"
File: %s不能打开!\n
"
,pszFile);
11
return
0
;
12
}
13
14
//
输出图像的格式信息
15
printf(
"
Driver:%s/%s\n
"
,
16
poDataset->GetDriver()->
GetDescription(),
17
poDataset->GetDriver()->
GetMetadataItem( GDAL_DMD_LONGNAME) );
18
19
//
输出图像的大小和波段个数
20
printf(
"
Size is%dx%dx%d\n
"
,
21
poDataset->GetRasterXSize(),poDataset->
GetRasterYSize(),
22
poDataset->
GetRasterCount());
23
24
//
输出图像的投影信息
25
if
( poDataset->GetProjectionRef() !=
NULL )
26
printf(
"
Projectionis `%s'\n
"
, poDataset->
GetProjectionRef() );
27
28
//
输出图像的坐标和分辨率信息
29
double
adfGeoTransform[
6
];
30
if
( poDataset->GetGeoTransform( adfGeoTransform) ==
CE_None )
31
{
32
printf(
"
Origin =(%.6f,%.6f)\n
"
,
33
adfGeoTransform[
0
], adfGeoTransform[
3
]);
34
35
printf(
"
PixelSize = (%.6f,%.6f)\n
"
,
36
adfGeoTransform[
1
], adfGeoTransform[
5
]);
37
}
38
char
a;
39
std::cin>>a;
运行结果: