刚上研一那会就听师兄说起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;
运行结果: