[GDAL]1.GDAL1.8.1编译与第一个程序

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

运行结果:

文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流,转载请注明出处。
原文地址:https://www.cnblogs.com/yhlx125/p/2814653.html