GDAL学习总结

282 篇文章 5 订阅
163 篇文章 19 订阅

GDAL介绍

GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。
OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。
有很多著名的GIS类产品都使用了GDAL/OGR库,包括ESRI的ARCGIS 9.3,Google Earth和跨平台的GRASS GIS系统。利用GDAL/OGR库,可以使基于Linux的地理空间数据管理系统提供对矢量和栅格文件数据的支持。
外文名 Geospatial Data Abstraction Library 
简    称 GDAL 
性    质 开源栅格空间数据转换库
用    途 进行数据转换和处理

简介
GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。
OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。
有很多著名的GIS类产品都使用了GDAL/OGR库,包括ESRI的ARCGIS 9.3,Google Earth和跨平台的GRASS GIS系统。利用GDAL/OGR库,可以使基于Linux的地理空间数据管理系统提供对矢量和栅格文件数据的支持。

功能特征
GDAL提供对多种栅格数据的支持,包括Arc/Info ASCII Grid(asc),GeoTiff (tiff),Erdas Imagine Images(img),ASCII DEM(dem) 等格式。
GDAL使用抽象数据模型(abstract data model)来解析它所支持的数据格式,抽象数据模型包括数据集(dataset),坐标系统,仿射地理坐标转换(Affine Geo Transform), 大地控制点(GCPs), 元数据(Metadata),栅格波段(Raster Band),颜色表(Color Table),子数据集域(Subdatasets Domain),图像结构域(Image_Structure Domain),XML域(XML:Domains)。
GDALMajorObject类:带有元数据的对象。
GDALDdataset类:通常是从一个栅格文件中提取的相关联的栅格波段集合和这些波段的元数据;GDALDdataset也负责所有栅格波段的地理坐标转换(georeferencing transform)和坐标系定义。
GDALDriver类:文件格式驱动类,GDAL会为每一个所支持的文件格式创建一个该类的实体,来管理该文件格式。
GDALDriverManager类:文件格式驱动管理类,用来管理GDALDriver类。

OGR体系结构
Geometry类:Geometry (包括OGRGeometry等类)封装了OpenGIS的矢量数据模型,并提供了一些几何操作,WKB(Well Knows Binary)和WKT(Well Known Text)格式之间的相互转换,以及空间参考系统(投影)。
Spatial Reference类:OGRSpatialReference封装了投影和基准面的定义。
Feature类:OGRFeature封装了一个完整feature的定义,一个完整的feature包括一个geometry和geometry的一系列属性。
Feature Definition类:OGRFeatureDefn里面封装了feature的属性,类型、名称及其默认的空间参考系统等。一个OGRFeatureDefn对象通常与一个层(layer)对应。
Layer类:OGRLayer是一个抽象基类,表示数据源类OGRDataSource里面的一层要素(feature)。
Data Source类:OGRDataSource是一个抽象基类,表示含有OGRLayer对象的一个文件或一个数据库。
Drivers类:OGRSFDriver对应于每一个所支持的矢量文件格式。类OGRSFDriver由类OGRSFDriverRegistrar来注册和管理。

GDAL的安装
(1)下载gdal的安装文件,解压到某目录下,如C:\gdalsrc下。
  这里我们假定VC6的安装在默认目录C:\Program Files\Microsoft Visual Studio8下。
  (2)启动cmd,即打开控制台窗口。进入VC6的安装目录下,如cd C:\Program Files\MicrosoftVisual Studio8\VC\bin\,在此目录下有个文件VCVARS32.BAT,执行一下这个文件,然后重新回到C:\gdalsrc下。运行命令nmake /f makefile。编译完成后,用记事本打开文件C:\gdalsrc\nmake.opt,根据自己的情况修改GDAL_HOME = 这一行,这个指的是最终GDAL的安装目录,比如说我们安装在C:\GDAL,那么这一行就是GDAL_HOME = "C:\GDAL",在C:\gdalsrc下执行nmake /f makefile install,然后是nmake /f makefile devinstall,然后我们需要的东西就安装到了C:\GDAL下。

GDAL的使用
初次使用visual studio 对工具不熟悉,有些步骤可以配置的
(1)在VS2005中新建win32控制台程序 testGDALconsole,(向导中附加选项不能选为空项目)将C:\GDAL\bin\gdal14.dll拷贝到testGDALconsole目录下的debug目录中。(否则运行时会提示找不到gdal14.dll)

  (2)在工程的Library files中和Include files中分别添加GDAL的LIB文件目录和头文件目录,
这步我不会,就直接将gdal_priv.h拷贝到testGDALconsole.cpp所在目录下
(3)添加一个文件gdal_i.lib。使用 #pragma comment (lib,"..\\lib\\gdal_i.lib")(这步没做)
  (4)程序文件

样本程序如下:
#include "stdafx.h"
#include "gdal_priv.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
if(argc!=2)
{
return 0;
}
GDALDataset *poDataset;
GDALAllRegister();
poDataset = (GDALDataset *) GDALOpen( argv[1], GA_ReadOnly );
if( poDataset != NULL )
{
cout<<"RasterXSize:"<<poDataset->GetRasterXSize()<<endl;
cout<<"RasterYSize:"<<poDataset->GetRasterYSize()<<endl;
cout<<"RasterCount:"<<poDataset->GetRasterCount()<<endl;
}
return 0;
}
假定生成的程序名为test.exe,假定有一个文件名为1.jpg的文件在C:\下,在命令行下test.exe
c:\1.jpg,程序将打印出此图片的横纵坐标和raster count,如:
C:\>test 1.JPG
RasterXSize:800
RasterYSize:600
RasterCount:3[1] 
========

很好的GDAL初学者资料

1、编译加使用:http://blog.csdn.net/gisblog/archive/2008/10/06/3021933.aspx 
如何在CSharp中使用GDAL?
    GDAL库的简洁、高效深受开发人员的喜爱,很多开源的GIS软件甚至是商业GIS软件都使用了这个库。GDAL使用C++,在Visual studio环境下开发,对C,C++的支持当然不会有什么问题。但对于C#、Python、Java来说,过程就相对繁琐一些,对初学者造成了不少的麻烦。本文以GDAL1.50为例,详细说明在CSharpe语言中使用GDAL的环境配置问题,至于Python的环境配置问题,在另一篇文章“如何在CSharpe中使用GDAL”中另行讨论。希望对初用GDAL的人员有所帮助。 
    GDAL从1.4.1开始添加了swig,以支持.NET环境下的C#语言。在swig文件夹中包含了C#源代码。以下是主要的处理步骤: 

1、准备一个C++编译器。建议使用Visual studio2005。 

2、下载源代码。 

地址:http://download.osgeo.org/gdal/gdal150.zip。 

3、把gdal150.zip解压至“C:\gdal-1.5.0”,当然放在其它文件夹也可以。 

4、修改源代码中的错误。源文件“C:\gdal-1.5.0\frmts\leveller\levellerdataset.cpp”的第171行的内容如下: 

{ "?, kPI / 180.0, UNITLABEL_DEGREE }, 

在?号后面加上双引呈",改成如下形式: 

{ "?", kPI / 180.0, UNITLABEL_DEGREE }, 

你可以使用任何一种文本文件的编辑工具来进行修改。笔者尝试过下载GDAL1.52的版本,存在同样的问题,真想不到GDAL库也会犯如此低级的错误。 

5、创建安装的目标文件夹“C:\gdal-runtime”,稍后的编译配置中,我们将配置GDAL把编译后将会安装到这个文件夹内。 

6、修改编译配置文件夹“C:\gdal-1.5.0\nmake.opt”。以下是第41至第43行的内容: 

!IFNDEF GDAL_HOME 

GDAL_HOME = "C:\warmerda\bld" 

!ENDIF 

默认的情况下,GDAL将会安装到"C:\warmerda\bld"文件夹内,为了更好地了解安装过程,我们把第42行修改成如下内容: 

GDAL_HOME = "C:\gdal-runtime" 

7、编译源文件。使用“Visual Studio 2005 命令提示”工具来进行,(该工具位于“开始\程序\Microsoft Visual Studio 2005\Visual Studio Tools”内)。 

打开“Visual Studio 2005 命令提示”工具,键入"cd C:\gdal-1.5.0",进入源文件所在的文件夹,再键入"nmake /f makefile.vc"执行编译。编译过程可能需要一些时间,主要取决于机器的性能。 

如果没有第4步的修改,将会出现大量的编译错误,累积至100个后,VS2005将自动停止编译。 

8、安装文件。 

键入“nmake /f makefile.vc install”,执行完毕后,"C:\gdal-runtime"文件夹下增加了bin,data,及html文件夹。 

键入“nmake /f makefile.vc devinstall”执行完毕后,"C:\gdal-runtime"文件夹下增加了lib,include文件夹。这两个文件夹主要用于C及C++的开发。 

在"C:\gdal-runtime\bin"文件夹内已经生成了gdal15.dll文件,这是GDAL库的核心,不管采用何种开发方式,最终都由这个DLL文件来执行实质性的操作。 

9、编译C#源文件。 

键入“cd C:\gdal-1.5.0\swig\csharp”,进入C#源文件所在的文件夹。 

键入“nmake /f makefile.vc”,编译完毕后生成8个DLL文件:gdal_csharp.dll、gdalconst_csharp.dll、ogr_csharp.dll、osr_csharp.dll和gdal_wrap.dll、gdalconst_wrap.dll、ogr_wrap.dll、osr_wrap.dll。前面4个文件名中都含有"csharp",用法与另外4个稍有不同,稍后详细讨论。 

10、把8个DLL文件复制到安装文件夹"C:\gdal-runtime\bin"。 

11、创建环境变量。 

把路径C:\gdal-runtime\bin添加到系统变量Path,如果没有该变量,则应新建一个。如果你使用的是windows2003,添加后不必重启,修改即时生效;如果你不能确定是否已经生效,可以在doc窗口内输入“echo %path%”,如果显示的内容中包含了"C:\gdal-runtime\bin",则表示修改已经生效。如果你还是无法确定,那就重启吧,这是最安全的方式。 

12、在VS2005 CSharp项目中添加对GDAL的引用。新建一个CShapr应用程序项目,然后添加对C:\gdal-runtime\bin中4个含有"csharp"的DLL文件的引用。至此我们就可以使用GDAL的功能了。为了测试GDAL是否可以运行,我们为窗体的Load事件增加如下的代码: 

private void Form1_Load(object sender, EventArgs e) 

try 

OSGeo.GDAL.Gdal.AllRegister(); 
OSGeo.GDAL.Dataset dataSet = OSGeo.GDAL.Gdal.Open(@"C:\F-49-32-(10).tif", Access.GA_ReadOnly); 
int w = dataSet.RasterXSize; 
int h = dataSet.RasterYSize; 
MessageBox.Show("image width=" + w + ",height=" + h); 

catch (Exception err) 

Console.WriteLine(err.Message); 

}为了运行程序,Open方法的第一个参数@"C:\F-49-32-(10).tif"应改成你本机上图像文件所在的路径。如果运行正常的话将弹出一个对话框,显示图像的宽度和高度。 

关于其它一些问题的讨论: 

1、关于GDAL_DATA系统变量。GDAL建议创建这个系统变量,从上面的讨论中,我们已经知道,这个系统变量并非必须的,但是如果你想使用一些GDAL提供的例子,那就很有必要,因为样例中的某些方法需要访问这个系统变量。 

2、我们已经提到过,创建安装文件夹并非必须的;如果使用默认的方式来编译,将安装到C:\warmerda\bld文件夹内。无论使用何种方式,要想使用GDAL,你的C#程序必须能访问到这些DLL文件:包括上面提到的8个DLL文件,以及C:\gdal-runtime\bin\gdal15.dll文件。我们可以用一句话来概括:C#环境下使用GDAL的问题核心,实质上就是如何保证C#程序能够访问到这9个DLL文件。 

在此,我们回顾一下Windows搜索DLL文件的基本规则: 

1)执行文件所在的文件夹。 

2)windows系统安装文件夹,即安装了windows的文件夹,GetWindowsDirectory( )函数可提供该目录的路径名。 

3)Windows系统目录,即System32子目录;调用GetSystemDiretory( )函数可获得这个目录的路径名。 

4)在系统变量Path中配置的文件夹,或用dos的path命令指定的文件夹。 

5)网络中映象的目录列表中的全部目录。 

在需要调用DLL文件时,windows将按以上的顺序,逐一查找各个文件夹,如果找不到相应的文件,将返回异常信息。 

根据以上的规则,系统变量path中不必包含GDAL的安装路径,我们只要把这9个DLL文件复制到执行文件所有的位置,同样可以运行。例如把文件复制到bin/debug或bin/release文件夹内,这样程序的运行就不再依赖于任何系统变量了。这种方式非常适合于发布和打包最终的应用程序。在程序开发期间,我们仍然提倡使用系统变量指向GDAL安装路径的方式,开发时将更加有灵活性。

2、GDAL(Geospatial Data Abstraction Library)从1.4.1版本开始支持.NET环境下的C#语言。基本的编译步骤参照《如何在CSharp中使用GDAL》(http://blog.csdn.net/gisblog/archive/2008/10/06/3021933.aspx),博主把步骤写的很详细,一路参照编译顺利,只是把自己遇到的几个问题总结如下:

a)下载地址:http://download.osgeo.org/gdal/,自己使用的时候还只是1.6.1,现在最新的版本已是1.6.2,O(∩_∩)O~每天都有新事物。

b)GDAL的底层是用C++写的,所以要用C++编译器才会编译成功。

c)生成的九个dll中,gdal16.dll才是GDAL库的实现核心。

d)在C#中使用时,需要引用四个有_csharp后缀的dll。

e)在开发过程,最好把编译的GDAL库bin文件夹加入到系统环境变量中。

f)在打包和用于发布的应用程序中,需要把9个dll文件全部拷贝到程序目录中。

注意了上面的细节,就可以顺利使用啦↖(^ω^)↗

3、

Gdal In C# 接口编译

Gdal是栅格地理空间数据格式的转换开源类库,它使用一种单一的抽象数据模型,满足了其所支持的所有数据格式的应用需求。目前Gdal的最新版本为GDAL/OGR 1.6.0
与Gdal类似地,与Gdal库一起的OGR类库,提供了对矢量数据的相关操作。
详细资料请参考GDAL
流浪者N应用Gdal是为了用C#实现对HDF文件的操作。
下面为流浪者N编译支持HDF4、HDF5的Gdal库的操作,首先声明流浪者N这么编译出的Gdal仍然不支持HDF,这里写下一为记录;二为交流,寻求帮助。
流浪者N尝试编译的Gdal版本:gdal-1.5.2、gdal-1.6.0 ;
另外还需swig,这里用的版本:swigwin-1.3.38 ;HDF4:42r4-win-vnet;HDF5:5-182-win-vs2005
为了支持HDF5,还需下载SZip,这里用szip21-vs2005 ;
OK,现在万事具备,只欠编译了,尽管编译出来不能支持HDF,但对于TIFF之类还是支持的,仍然期待…
编译准备……
1.Gdal压缩包、swigwin压缩包、HDF压缩包、szip压缩包解压;
2.修改。
修改Gdal中的bug,Source Files\leveller\levellerdataset.cpp文件171行 { “?, kPI / 180.0, UNITLABEL_DEGREE },将“ “? ”修改为“ ”? “ ”,保存;
修改Gdal根目录下的nmake.opt文件:MSVC_VER=1400(即选择VS2005);GDAL_HOME=“YourDir”,YourDir为你自己建立的用于存放编译生成的文件的地方,自行定义;SWIG = swig.exe,将swigwin解压后其中swig.exe的路径填于此处;
3.再次修改nmake.opt,安装 Hdf4、Hdf5的驱动。
找到“Uncomment the following and update to enable NCSA HDF Release 4 support”位置,将该项下方的三个#去除。修改如下:HDF4_PLUGIN = YES    HDF4_DIR = E:\JoSn\sIon\Gdal0311_10\42r4-win-vnet     HDF4_LIB = $(HDF4_DIR)\lib\ hd424.lib
同理修改HDF5的相关配置。修改如下:HDF5_PLUGIN = YES     HDF5_DIR = E:\JoSn\sIon\Gdal0311_10\5-182-win-vs2005     SZIP_DIR = E:\JoSn\sIon\Gdal0311_10\szip21-vs2005-enc       HDF5_LIB = $(HDF5_DIR)\hdf5dll.lib \
  $(SZIP_DIR)\dll\szlibdll.lib
修改部分结束
修改完毕,编译真正开始…
1.打开VS 2005 命令行,定位到Gdal所在的文件夹;
2.nmake /f makefile.vc;
3.nmake /f makefile.vc install;
4.nmake /f makefile.vc devinstall,这步完成后GDAL_HOME处生成一系列的文件,其bin目录下会有gdal15.dll or gdal16.dll,视gdal版本而定。
5. cd swig\csharp,定位到gdal目录下的csharp文件夹。
6.nmake /f makefile.vc,这步完成后会在csharp目录下生成8个dll文件。将这8个文件拷贝到gdal15.dll or gdal16.dll 所在位置(见第4步)。
测试程序……
1.添加*_csharp.dll 四个文件的引用。
2.OSGeo.GDAL.Gdal.AllRegister();
3.OSGeo.GDAL.Dataset ds=OSGeo.GDAL.Gdal.Open(@”d:\test.tiff”,OSGeo.GDAL.Access.GA_ReadOnly);
4.int w = ds.RasterXSize; int h = ds.RasterYSize; MessageBox.Show(”image width=” + w + “,height=” + h);
5.tiff文件的测试没有问题,但改为HDF4或HDF5文件就无能为力了。提示为:暂不支持该文件。
寻求交流与帮助
1.望对Gdal有较深研究者传授流浪者N编译支持HDF的方法
2.流浪者N后来用FWTools,据说FWTools编译的Gdal支持了HDF4、HDF5,但不知是流浪者N愚钝,不会用FWTools2.2.8,还是FWTools2.2.8存在bug,总之有异常,说是“OSGeo.GDAL.GdalPINVOKE的类型初始值设定项引发异常”,这倒与之前流浪者N错误编译Gdal库时的异常相同,不知是和缘故,望广大GIS同行们指点。
3.大家帮帮忙,期待ing
 
4\
========

在Window下编译、安装、使用GDAL 


1. GDAL简介
GDAL(主页:http://www.gdal.org/)是一个操作栅格地理数据的库,由C写成。它包括读取、写入、转换和处理各种栅格数据格式。当前版本的GDAL还包含了OGR库,OGR也是用C写成,是操作矢量地理数据的库,合二为一,GDAL库具备了操作栅格和矢量地理数据的能力。更令人欣喜的是,GDAL是开源的,跨平台的,目前有很多软件都用到了GDAL,如GRASS,QGIS,Google Earth等等。GDAL支持C/C++、VB、Python、Java、C#/.NET、Ruby、Perl,目前能够支持如此多语言的库真的不多。GDAL支持的格式多得惊人,可以看看它主页上列也的Support Formats(http://www.gdal.org/formats_list.html)。

2.下载GDAL
二进制文件(已经编译好的):http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries

源文件(未编译):http://trac.osgeo.org/gdal/wiki/DownloadSource

上面两链接都列出了各种平台各种版本,你可根据自己的情况下载。撰写此文时,GDAL最新的Release版本是1.6.0。

3.编译前配置
         直接下载编译好的二进制文件固然省事,但对于想自己动手进一步了解GDAL,用GDAL进行开发的话,最好还是下载源文件自己编译。编译方法如下:

1)  准备C++编译器,如Visual Studio2005或者2003。

2)  将下载的源码解压到C:\gdal-X.X.X(X.X.X表示版本号,当然你也可以自己命名),把文件放在其它目录也可以。

3)  修改源文件的错误。源文件\frmts\leveller\levellerdataset.cpp的第171行的内容如下:

{ "?, kPI / 180.0, UNITLABEL_DEGREE }

在?号后面加上双引号",改成如下形式:


{ "?", kPI / 180.0, UNITLABEL_DEGREE },


不知为何,1.6.0版本依然没有修改这个BUG。

4)  修改编译安装目录。


用任意文本编辑器,如记事本打开配置文件nmake.opt,找到以下代码:


!IFNDEF GDAL_HOME

GDAL_HOME = "C:\warmerda\bld"

!ENDIF

BINDIR = $(GDAL_HOME)\bin

PLUGINDIR = $(BINDIR)\gdalplugins

PY_INST_DIR = $(GDAL_HOME)\pymod

LIBDIR = $(GDAL_HOME)\lib

INCDIR = $(GDAL_HOME)\include

DATADIR = $(GDAL_HOME)\data

HTMLDIR = $(GDAL_HOME)\html

其中GDAL_HOME = "C:\warmerda\bld"为编译后的安装目录,这里你可以修改你想要的目录,当然也可以不改。

4.  添加Python支持
修改PY_INST_DIR = $(GDAL_HOME)\pymod把路径改成python下的Lib\site-packages文件夹下。PYDIR = "C:\Software\Python24" 改成python的安装路径。

5.  添加其它支持
在编译GDAL时,你可以按需要添加其它支持,如ProJ,GeoTiff等等,添加方法只要在nmake.opt找到相关配置节,把前面的“#”去掉,即取消注释,然后修改相关的路径即可。如:

nmake.opt中的PROJ.4 stuff节

# PROJ.4 stuff
# Uncomment the following lines to link PROJ.4 library statically. Otherwise
# it will be linked dynamically during runtime.
# PROJ_FLAGS = -DPROJ_STATIC
# PROJ_INCLUDE = -ID:\GDAL\proj-4.5.0\src
# PROJ_LIBRARY = D:\GDAL\proj-4.5.0\src\proj_i.lib

本节的作用是控制链接方式,默认是注释的,即采用动态链接方式。只需拷贝proj的动态库。若要采用静态链接方式,通过取消gdal的该节注释,并设置proj源码的对应路径即可。静态链接的好处是,加载之初就会判断库的依赖关系,这可以避免采用动态链接库而又缺少依赖库而出现莫名其妙的现象。

6.  编译GDAL源码
打开“Visual Studio 2005 命令提示”工具,该工具位于“开始\程序\Microsoft Visual Studio 2005\Visual Studio Tools”。或者直接打开“cmd”窗口,但需要注册VC编译环境,使用如下代码(与你机子的VS安装路径有关):

E:\program files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat

在命令提示符下,用“cd”命令定位到GDAL文件夹(如C:\gdal-1.6.0),输入以下命令:

nmake /f makefile.vc

这里编译要花费一定的时间,请耐心等待。

7.  安装GDAL
编译完成后,输入以下命令:

nmake /f makefile.vc install

命令执行后,即在安装目录下创建了bin,data,html文件夹。其中bin中包含了GDAL的核心文件gdalXX.dll(XX为版本号,如为gdal16.dll)。

再输入以下命令:

nmake /f makefile.vc devinstall

命令执行后,即在安装目录下创建include,lib文件夹,这两个文件夹用于开发。 

8.  编译C#源码
         在命令提示符下输入:

cd C:\gdal-1.5.0\swig\csharp

进入C#源文件所在的文件夹,然后再输入:

nmake /f makefile.vc

编译完成后,将会生成以下8个dll文件:

gdal_csharp.dll、

gdalconst_csharp.dll、

ogr_csharp.dll、

osr_csharp.dll

gdal_wrap.dll、

gdalconst_wrap.dll、

ogr_wrap.dll、

osr_wrap.dll。

将以上8个dll文件复制到安装目录的bin文件夹下。

9.  使用GDAL
在VS开发中,要先在工具(Tools)-> 选项(Options)-> Projects(vc6.0为Directories)中添加GDAL的lib和include路径,然后把生成的dll文件放在可执行文件所在的文件夹里或直接放在system32文件夹内即可。


如果要用到bin目录中的exe程序,则要创建环境变量,即把GDAL的安装目录的bin路径(如C:\gdal-1.6.0\bin)添加到环境变量中的Path。添加方法为:右击“我的电脑”-> “属性”->”高级”,点击“环境变量”按钮,在系统变量里找到Path,如果没有可添加Path变量,然后把路径添加进去,多个路径以分号分隔。
 
========

GDAL源码剖析 之GDAL开发及其调试

一、简单的调用
关于GDAL的使用,网上的资料都很多,主要还是要熟悉GDAL的组织结构,类以及类的函数等,熟悉了,使用GDAL就不在话下了。最常用的就是动态库的GDAL,当然你也可以使用静态库,这里只是简单的介绍使用动态GDAL库来做开发。

首先打开VS,新建一个工程,控制台的就成。然后在工程的属性对话框中,找到【配置属性】-【C/C++】-【常规】,右侧的【附加包含目录】中,将GDAL的include文件夹路径填写到这里,如下图:

第二、继续在属性对话框中,找到【配置属性】-【链接器】-【常规】,右侧的【附加库目录】中,将GDAL的lib文件夹路径填写到这里,如下图:

第三、在【配置属性】-【链接器】-【输入】,右侧的【附加依赖项】中,将gdal_i.lib填写到此处。然后点击确定即可。至此,使用GDAL的环境全部搭建完成,剩下的就是在您的代码中使用GDAL了。
将下面的代码(代码摘自GDAL官方指南:http://gdal.org/gdal_tutorial.html)贴到刚才新建的工程中的cpp文件中,保存后编译,正常情况下会提示生成成功,然后运行,会在控制台上将图像的信息输出。

#include "gdal_priv.h"
#include "cpl_conv.h" //for CPLMalloc()
 
int main()
{
    //注册文件格式
    GDALAllRegister();
   
    const char* pszFile = "C:\\Test.img";
    GDALDataset *poDataset;
    //使用只读方式打开图像
    poDataset = (GDALDataset*) GDALOpen( pszFile,GA_ReadOnly );
    if( poDataset == NULL )
    {
        printf( "File: %s不能打开!\n",pszFile);
        return 0;
    }
 
    //输出图像的格式信息
    printf( "Driver:%s/%s\n",
        poDataset->GetDriver()->GetDescription(),
        poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME) );
 
    //输出图像的大小和波段个数
    printf( "Size is%dx%dx%d\n",
        poDataset->GetRasterXSize(),poDataset->GetRasterYSize(),
        poDataset->GetRasterCount());
 
    //输出图像的投影信息
    if( poDataset->GetProjectionRef() != NULL )
        printf( "Projectionis `%s'\n", poDataset->GetProjectionRef() );
 
    //输出图像的坐标和分辨率信息
    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;
    int            nBlockXSize, nBlockYSize;
    int            bGotMin, bGotMax;
    double         adfMinMax[2];
 
    //读取第一个波段
    poBand = poDataset->GetRasterBand( 1 );
 
    //获取图像的块大小并输出
    poBand->GetBlockSize(&nBlockXSize, &nBlockYSize );
    printf( "Block=%dx%dType=%s, ColorInterp=%s\n",
        nBlockXSize, nBlockYSize,
        GDALGetDataTypeName(poBand->GetRasterDataType()),
        GDALGetColorInterpretationName(
        poBand->GetColorInterpretation()));
 
    //获取该波段的最大值最小值,如果获取失败,则进行统计
    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] );
 
    //输出图像的金字塔信息
    if( poBand->GetOverviewCount() > 0 )
        printf( "Band has%d overviews.\n", poBand->GetOverviewCount() );
 
    //输出图像的颜色表信息
    if( poBand->GetColorTable() != NULL)
        printf( "Band hasa color table with %d entries.\n",
        poBand->GetColorTable()->GetColorEntryCount() );
 
    float *pafScanline;
    int   nXSize = poBand->GetXSize();
   
    //读取图像的第一行数据
    pafScanline = (float*) CPLMalloc(sizeof(float)*nXSize);
    poBand->RasterIO(GF_Read, 0, 0, nXSize,1, 
        pafScanline, nXSize,1, GDT_Float32, 0, 0 );
 
    CPLFree(pafScanline);  //记得要释放空间
 
    //关闭文件
    GDALClose((GDALDatasetH)poDataset);
}


二、GDAL源代码调试

在很多时候我们需要看看GDAL的内部实现,当然可以直接查看GDAL的源代码,但是直接看源代码,不能很好的理解,这时候就需要调试查看源代码中变量的内容。调试GDAL的源代码,需要GDAL的debug版本,以及编译GDAL的时候的pdb等调试文件。当然也可以把GDAL的源代码加入到你的工程中,但是这样太费时费力。

下面就有一个很简单的方法,可以直接调试进GDAL的源代码中,首先编译一下GDAL的debug版本,将编译生成的文件,主要有gdal18.dll,gdal_i.exp,gdal_i.lib,gdal.lib,gdal18.pdb,gdal18.ilk,gdal18.exp等文件,将gdal18开头的文件拷贝到自己工程的生成目录中,然后调试自己的程序,在执行到GDALOpen函数(或者其他GDAL的函数)时按F11键,就会进入到GDAL的源代码中进行调试GDAL代码。

三、GDAL使用示例

1、使用GDAL进行图像裁切,参考http://blog.csdn.net/liminlu0314/article/details/6136512

2、使用GDAL进行图像重采样,参考http://blog.csdn.net/liminlu0314/article/details/6130064

3、使用GDAL创建金字塔,参考http://blog.csdn.net/liminlu0314/article/details/6127755

4.  CSDN 上一个GDAL专栏:http://blog.csdn.net/column/details/gdal.html
========

了解GDAL图像处理

http://blog.163.com/chenxingfeng_001/blog/static/10627072006115836560/

1. GDAL库介绍 
简单地说,GDAL是一个操作各种栅格地理数据格式的库。包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持)。它使用了一个单一的抽象数据模型就支持了大多数的栅格数据(GIS对栅格,矢量,3D数据模型的抽象能力实在令人叹服)。当然除了栅格操作,这个库还同时包括了操作矢量数据的另一个有名的库ogr(ogr这个库另外介绍),这样这个库就同时具备了操作栅格和矢量数据的能力,买一送一,这么合算的买卖为什么不做。最最最重要的是这个库是跨平台的,开源的!如今这个库对各种数据格式的支持强大到令人啧啧的地步了。如果你对他的强大有什么怀疑的话,看看这里一大串的GDAL所支持格式清单,吓到了吧!再看看它的主页最后那些使用了它作为底层数据处理的软件列表吧!其中你可以不知道GRASS,你也可以不知道Quantum GIS (QGIS),但是你总该知道Google Earth吧! 
你即使不玩GIS,这个库也是满有用的。首先,哪个库支持这么多栅格(图片)格式,哪个库在C/C++/python/ruby/VB/java/C#(这个暂时不完全支持)下都能用,而且都一样用?退一步讲,3S软件又不一定要用在3S下(很多医学影像就是用PCI软件来处理的)。再退一步,你的生活即使和3S一点关系都没有,栅格数据又不单单只有GIS下才用到。你大可用这个库来读取jpg,gif,tif,xpm等格式。而且对各种格式支持得不是一般的好,很大一部分非标准格式照样支持得非常好。我曾经在java下玩过jai,以及一系列jai的扩展库,一些图像格式在很多图片浏览器中都可以正确读取(有的甚至不是非标准格式),用jai死活就读不出来! 
这个库的python版和其他的python库结合的很好。最直接、明显的支持是使用Numeric库来进行数据读取和操作。各种矩阵魔术可以发挥得淋漓尽致(图像其实就是矩阵)。而且按我的观点,python对矩阵的操作比其他的语言有明显的优势。写出来的东西比其他语言写出来的短小的多,而且好看得多。并且python的弱类型在处理栅格数据格式类型的时候代码量比强类型的语言少了数倍(不用double,byte,short等等分开处理,这简直就是先天上的优势)。所以我就喜欢用python做图像的处理。所以就连GIS界的微软ESRI也直接在ARCGIS9中用python来作栅格数据的导入导出。一句话,真是太方便啦! 
2. 安装 
2.1. windows下的安装 
官方安装文档在这里。下面是我自己的实践步骤: 
先去http://www.gdal.org/dl/下一个版本,解压。 打开控制台,输入: “D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat" 注册vc的编译环境。 
打 开gdal文件夹下的nmake.opt修改GDAL_HOME = "C:\warmerda\bld"把路径改到需要把gdal安装的地方。不改也可以。这里需要添加python支持,所以修改PY_INST_DIR = $(GDAL_HOME)\pymod把路径改成python下的Lib\site-packages文件夹下。PYDIR = "C:\Software\Python24" 改成python的安装路径。 下面的参数爱改什么就把前面的#删除(要看您有没有那些库的源码),注意一下路径就可以了。我是都没改。 后面就依次运行 
Toggle line numbers 
1 nmake /f makefile.vc 
2 nmake /f makefile.vc install 
3 nmake /f makefile.vc devinstall 

最后最后,还要去GDAL_HOME目录下的bin文件夹下把gdal13.dll (也有可能是gdal12.dll)copy到PY_INST_DIR路径下 
到此处就完成安装gdal(python)的工作。 
最后需要注意一下,gdal在.net2005下只能顺利编译1.2,1.3以上版本不能顺利编译,有一个地方指针转换出错。可能是2005的编译器比以往的严厉一点吧。另外,安装了QGIS,对编译也有一些影响,主要是proj库的冲突,导致一个找不到"d:/program.obj"文件的错误,如果你有静态编译过proj,那么你可以打开nmake.opt修改有关proj的设置,如果搞不定,就卸载QGIS,然后编译,编译后再安装QGIS.呵呵,还好QGIS的体积没有ArcGIS那么可怕. 
2.2. linux下的安装 
linux下的安装就更简单了。直接 
Toggle line numbers 
1 ./configure 
2 make 
3 su 
4 make install 
5 ldconfig 

就ok(默认就已经支持python)。当然在第一步的时候需要看看是否依赖的库都安装了。如果缺少,就去安装一个。如果对configure的条件不理解,就用./configure --help看看具体情况。 
2.3. 安装其他驱动 
这里讲一个安装hdf4的驱动的例子(默认情况下gdal是不安装hdf4的),其他驱动应该和这个也差不了多少吧,可以作为其他的参考。完整步骤如下: 
在windows下的安装: 
从ftp://ftp.ncsa.uiuc.edu/HDF/HDF/HDF%5FCurrent/bin/windows/下载42r1-win.ZIP,解压。 
编辑gdal根目录下的nmake.opt,找到“# Uncomment the following and update to enable NCSA HDF Release 4 support.”这一行 
把下面两行前面的#去掉,然后改成: 

HDF4_DIR = D:\warmerda\42r1-win\release 
#HDF4_LIB = /LIBPATH:$(HDF4_DIR)\lib hd421m.lib 
HDF4_LIB = $(HDF4_DIR)\dll\hd421m.lib $(HDF4_DIR)\dll\hm421m.lib \ 
$(HDF4_DIR)\lib\hd421.lib $(HDF4_DIR)\lib\hm421.lib 

用HDF4_LIB=/LIBPATH:这种形式似乎可以建立gdal的库,但是往下编译会出错。而且要把$(HDF4_DIR)\dll和$(HDF4_DIR)\lib拷贝到同一个目录下,不然会提示找不到库 
你也可以试一试在D:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vsvars32.bat文件中添加HDF4_LIB路径到“@set LIB=”这行的末尾(不要忘记;的分割符)。 
然后找一下"INC="这行,把 -I$(HDF4_DIR)\include加到下一行的末尾(应该也可以在vsvars32.bat中添加路径,不过要重启命令行)。 
然后编译吧!祝你好运。 
注意:上面的HDF4_DIR 是我本机的路径,你要根据你自己的路径进行设置(想起我的一个老师说过的话:“抄人家的作业可以,不要连名字也一起抄走啊 ” ),下面的$(HDF4_DIR)可以不用改,那个是变量,会自动替代HDF4_DIR 路径。 
编译成功后,要HDF4能运行,还需要两个库,一个是zlib,一个是szip,可以到下面两个链接去下载一个 
ftp://hdf.ncsa.uiuc.edu/lib-external/zlib/1.2/bin 
ftp://hdf.ncsa.uiuc.edu/lib-external/szip/2.0/bin/windows 
把这两个库下载后解压,然后设置PATH系统变量,使得它们在默认状态下也可以被动态链接成功 。 
在Linux下比在Windows下简单: 
只要用./configure --help察看一下打开HDF4的编译开关(包括库路径,头文件路径等,看清楚),然后在./configure 后面加上那个开关以及hdf4的安装路径后就可以了。在configure后gdal会提示是否支持HDF4。 编译后也要把zlib和szip的动态链接库设置好 。 
到此你已经可以用C/C++来操作gdal读写hdf4的格式了! 
最后,为了让Python能够支持hdf的读写,别忘了把重新生成安装后的pymod目录下的内容,还有gdal13,还有那两个hdf的库,还有zlib,szip的库拷贝到Python的Lib\site-packages目录下 。 
2.4. 下载 
如果你实在玩不转,可以在这里下载已经编译好的gdal1.3.2程序库 以及其依赖的其他库,其中包括hdf4,hdf5支持,以及proj,geos插件。注意,这里的geos是静态链接的,注意版权(geos是LGPL的license)。hdf4和hdf5用的是release版本。这里是我的nmake配置文件,你可以对照你的实际情况参考一下。 
3. 快速开始 
其实在主站的教程里已经有python的示例了。但是我们还是按照自己的思路来开始吧。 
第一步就是打开一个数据集。对于“数据集”这个名词大家可能不会太习惯,但是对于一般的格式来说,一个“数据集”就是一个文件,比如一个gif文件就是一个以gif为扩展名的文件。但是对于众多RS数据来说,一个数据集包含的绝对不仅仅是一个文件。对于很多RS数据,他们把一张图像分成数个图像文件,然后放在一个文件夹中,用一些额外的文件来组织它们之间的关系,形成一个“数据集”。如果你不理解,那么就算了,当成jpg或者gif文件好了。 
下面我们打开一个tiff文件(GeoTIFF)。这个文件是我从GRASS的示例数据spearfish中导出的一个同名影像数据。 
Toggle line numbers 
1 >>> import gdal 
2 >>> dataset = gdal.Open("j:/gisdata/gtif/spot.tif") 
3 >>> dir(dataset) 
4 ['AddBand', 'AdviseRead', 'BuildOverviews', 'FlushCache', 'GetDescription', 'Get 
5 Driver', 'GetGCPCount', 'GetGCPProjection', 'GetGCPs', 'GetGeoTransform', 'GetMe 
6 tadata', 'GetProjection', 'GetProjectionRef', 'GetRasterBand', 'GetSubDatasets', 
7 'RasterCount', 'RasterXSize', 'RasterYSize', 'ReadAsArray', 'ReadRaster', 'Refr 
8 eshBandInfo', 'SetDescription', 'SetGCPs', 'SetGeoTransform', 'SetMetadata', 'Se 
9 tProjection', 'WriteRaster', '__del__', '__doc__', '__init__', '__module__', '_b 
10 and', '_o'] 
11 >>> 

这样我们就打开了这个文件。并且我们可以看到可以供我们调用的函数们(更具体的API列表可以看这里)。现在我们不做修改,不做添加,所以只要带有Set开头的函数以及有Write开头的函数我们暂时都不管。因为RS影像必然要和地理上的位置挂上钩,才能把图像正确铺展到一个坐标系中。其中的信息和对应关系有点复杂,不适合在快速开始中介绍,我们暂时也先不管。这里需要注意的就是几个函数。 
GetDescription 获得栅格的描述信息。 
Toggle line numbers 
1 >>> dataset.GetDescription() 
2 'j:/gisdata/gtif/spot.tif' 
3 >>> 

看来这里的图像描述是图像的路径名,但是这是和各种不同数据集相关的,不同数据集可能有不同的描述。这要看读取驱动的实现作者的高兴了。 
RasterCount 获得栅格数据集的波段数。 
GetRasterBand 获得栅格数据集的波段。 
Toggle line numbers 
1 >>> dataset.RasterCount 
2 1 
3 >>> band = dataset.GetRasterBand(1) 
4 >>> 

Band这个词可以翻译成“波段。 
这里我们获取了第一个波段(红色值组成的表)。注意!这里的波段获取和通常的C数组获取不一样,开始是1不是0。获取了波段,我们就可以在下面的操作中读取这个波段的所有数值。 
RasterXSize 图像的宽度(X方向上的像素个数) 
RasterYSize 图像的高度(Y方向上的像素个数) 
Toggle line numbers 
1 >>> dataset.RasterXSize 
2 950 
3 >>> dataset.RasterYSize 
4 700 
5 >>> 

可以看出我们的图像大小是950*700。还是很小的一张图。 
ReadRaster 读取图像数据(以二进制的形式) 
ReadAsArray 读取图像数据(以数组的形式) 
Toggle line numbers 
1 >>> help(dataset.ReadRaster) 
2 Help on method ReadRaster in module gdal: 
3 ReadRaster(self, xoff, yoff, xsize, ysize, buf_xsize=None, buf_ysize=None, buf_t 
4 ype=None, band_list=None) method of gdal.Dataset instance 
5 >>> help(dataset.ReadAsArray) 
6 Help on method ReadAsArray in module gdal: 
7 ReadAsArray(self, xoff=0, yoff=0, xsize=None, ysize=None) method of gdal.Dataset 
8 instance 
9 >>> 

这两个函数很重要,它们直接读取图像的数据,可以看到两个函数的帮助中有一大溜的参数。解释一下: xoff,yoff,xsize,ysize 你可能不想读取整张图像。只想读取其中的一部分。那么就用xoff,yoff指定想要读取的部分原点位置在整张图像中距离全图原点的位置。用xsize和ysize指定要读取部分图像的矩形大小。 
buf_xsize buf_ysize 你可以在读取出一部分图像后进行缩放。那么就用这两个参数来定义缩放后图像最终的宽和高,gdal将帮你缩放到这个大小。 
buf_type 如果你要读取的图像的数据类型不是你想要的(比如原图数据类型是short,你要把它们缩小成byte),就可以设置它。 
band_list 这就适应上面多波段的情况。你可以指定读取的波段序列。要哪几个波段,不要哪几个波段,你说了算。 
举个例子吧: 
Toggle line numbers 
1 >>> dataset.ReadAsArray(230,270,10,10) 
2 array([[255, 255, 255, 232, 232, 255, 255, 255, 255, 222], 
3 [255, 255, 255, 255, 255, 255, 210, 110, 11, 122], 
4 [255, 255, 255, 255, 255, 255, 210, 255, 11, 243], 
5 [201, 255, 255, 255, 255, 200, 200, 110, 122, 243], 
6 [111, 211, 255, 201, 255, 255, 100, 11, 132, 243], 
7 [255, 100, 100, 100, 110, 100, 110, 111, 122, 243], 
8 [255, 255, 255, 255, 255, 255, 122, 222, 255, 255], 
9 [255, 255, 255, 255, 255, 255, 243, 243, 255, 255], 
10 [255, 255, 255, 255, 255, 255, 255, 255, 255, 255], 
11 [255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],'b') 
12 >>> dataset.ReadRaster(230,270,10,10) 
13 '\xff\xff\xff\xe8\xe8\xff\xff\xff\xff\xde\xff\xff\xff\xff\xff\xff\xd2n\x0bz\xff\ 
14 xff\xff\xff\xff\xff\xd2\xff\x0b\xf3\xc9\xff\xff\xff\xff\xc8\xc8nz\xf3o\xd3\xff\x 
15 c9\xff\xffd\x0b\x84\xf3\xffdddndnoz\xf3\xff\xff\xff\xff\xff\xffz\xde\xff\xff\xff 
16 \xff\xff\xff\xff\xff\xf3\xf3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff 
17 \xff\xff\xff\xff\xff\xff\xff\xff\xff' 
18 >>> 

我们就把图像中位于230,270,宽度10高度10的数据读取出来了。 
我们看完了数据集的主要函数。似乎已经够用了。的确,如果只是为了显示图像,这些的确已经够了。但是如果需要更多信息,我们就不得不进入波段操作数据(实际上我们大多数时候都需要进入band获取信息)。下面我们现在来看看刚才读取出来的那个band有些什么东西可以供我们操作的(具体的API列表看这里)。 
Toggle line numbers 
1 >>> dir(band) 
2 ['AdviseRead', 'Checksum', 'ComputeBandStats', 'ComputeRasterMinMax', 'DataType' 
3 , 'Fill', 'FlushCache', 'GetDefaultHistogram', 'GetDescription', 'GetHistogram', 
4 'GetMaximum', 'GetMetadata', 'GetMinimum', 'GetNoDataValue', 'GetOffset', 'GetO 
5 verview', 'GetOverviewCount', 'GetRasterColorInterpretation', 'GetRasterColorTab 
6 le', 'GetScale', 'GetStatistics', 'ReadAsArray', 'ReadRaster', 'SetDefaultHistog 
7 ram', 'SetDescription', 'SetMetadata', 'SetNoDataValue', 'SetRasterColorInterpre 
8 tation', 'SetRasterColorTable', 'WriteArray', 'WriteRaster', 'XSize', 'YSize', ' 
9 __doc__', '__init__', '__module__', '_o'] 
10 >>> 

挑几个有用的吧。 
Toggle line numbers 
1 >>> band.XSize 
2 950 
3 >>> band.YSize 
4 700 
5 >>> band.DataType 
6 1 
7 >>> 

不用解释了吧,波段图像的宽和高(象元为单位)。DataType,图像中实际数值的数据类型。具体数据类型定义在gdalconst模块里。使用的时候用import gdalconst引入。 
Toggle line numbers 
1 >>> import gdalconst 
2 >>> dir(gdalconst) 
3 ['CE_Debug', 'CE_Failure', 'CE_Fatal', 'CE_None', 'CE_Warning', 'CPLES_Backslash 
4 Quotable', 'CPLES_CSV', 'CPLES_SQL', 'CPLES_URL', 'CPLES_XML', 'CPLE_AppDefined' 
5 , 'CPLE_AssertionFailed', 'CPLE_FileIO', 'CPLE_IllegalArg', 'CPLE_NoWriteAccess' 
6 , 'CPLE_None', 'CPLE_NotSupported', 'CPLE_OpenFailed', 'CPLE_OutOfMemory', 'CPLE 
7 _UserInterrupt', 'CXT_Attribute', 'CXT_Comment', 'CXT_Element', 'CXT_Literal', ' 
8 CXT_Text', 'DCAP_CREATE', 'DCAP_CREATECOPY', 'DMD_CREATIONDATATYPES', 'DMD_CREAT 
9 IONOPTIONLIST', 'DMD_EXTENSION', 'DMD_HELPTOPIC', 'DMD_LONGNAME', 'DMD_MIMETYPE' 
10 , 'GA_ReadOnly', 'GA_Update', 'GCI_AlphaBand', 'GCI_BlackBand', 'GCI_BlueBand', 
11 'GCI_CyanBand', 'GCI_GrayIndex', 'GCI_GreenBand', 'GCI_HueBand', 'GCI_LightnessB 
12 and', 'GCI_MagentaBand', 'GCI_PaletteIndex', 'GCI_RedBand', 'GCI_SaturationBand' 
13 , 'GCI_Undefined', 'GCI_YellowBand', 'GDT_Byte', 'GDT_CFloat32', 'GDT_CFloat64', 
14 'GDT_CInt16', 'GDT_CInt32', 'GDT_Float32', 'GDT_Float64', 'GDT_Int16', 'GDT_Int 
15 32', 'GDT_TypeCount', 'GDT_UInt16', 'GDT_UInt32', 'GDT_Unknown', 'GF_Read', 'GF_ 
16 Write', 'GPI_CMYK', 'GPI_Gray', 'GPI_HLS', 'GPI_RGB', 'GRA_Bilinear', 'GRA_Cubic 
17 ', 'GRA_CubicSpline', 'GRA_NearestNeighbour', '__builtins__', '__doc__', '__file 
18 __', '__name__'] 
19 >>> 

那些GDT开头的就是数值数据类型。 
Toggle line numbers 
1 >>> band.GetNoDataValue() 
2 65535.0 
3 >>> band.GetMaximum() 
4 >>> band.GetMinimum() 
5 >>> band.ComputeRasterMinMax() 
6 (1.0, 255.0) 
7 >>> 

Maximum 是表示在本波段数值中最大的值,Minimum当然就是表示本波段中最小的值啦。我们可以看到在一开始这两个都没有值。因为对于文件格式不会有固有的最大最小值。所以我们通过函数ComputeRasterMinMax计算得到了。注意!这里的最大最小值不包括“无意义值”!也就是上面显示的NoDataValue。需要解释一下“无意义值”。不要以为0或者255在任何情况下都无意义。在很多情况下0,255需要和其他值一样表示一个实际意义。虽然可能它最终会被显示得和黑色一样。而一些位置上的点要表示的意思是“什么也不是”,它在那个位置上只是为了占一个位置,使得整体图像看起来像个矩形而已。在做实际应用的时候两种值的处理将会完全不一样。所以需要设置无意义值,来和其他的值区别开来。而用ComputeRasterMinMax算出的最大最小值,是排除了无意义值后计算出来的最大最小值。 
Toggle line numbers 
1 >>> band.GetRasterColorInterpretation() 
2 2 
3 >>> gdalconst.GCI_PaletteIndex 
4 2 
5 >>> colormap = band.GetRasterColorTable() 
6 >>> dir(colormap) 
7 ['Clone', 'GetColorEntry', 'GetColorEntryAsRGB', 'GetCount', 'GetPaletteInterpre 
8 tation', 'SetColorEntry', '__del__', '__doc__', '__init__', '__module__', '__str 
9 __', '_o', 'own_o', 'serialize'] 
10 >>> colormap.GetCount() 
11 256 
12 >>> colormap.GetPaletteInterpretation() 
13 1 
14 >>> gdalconst.GPI_RGB 
15 1 
16 >>> for i in range(colormap.GetCount()): 
17 ... print colormap.GetColorEntry(i), 
18 ... 
19 (0, 0, 0, 255) (0, 0, 28, 255) (0, 0, 56, 255) (0, 0, 85, 255) (0, 0, 113, 255) 
20 (0, 0, 142, 255) (0, 0, 170, 255) (0, 0, 199, 255) (0, 0, 227, 255) (0, 0, 255, 
21 255) (0, 28, 0, 255) (0, 28, 28, 255) (0, 28, 56, 255) (0, 28, 85, 255) (0, 28, 
22 113, 255) (0, 28, 142, 255) (0, 28, 170, 255) (0, 28, 199, 255) (0, 28, 227, 255 
23 ) (0, 28, 255, 255) (0, 56, 0, 255) (0, 56, 28, 255) (0, 56, 56, 255) (0, 56, 85 
24 , 255) (0, 56, 113, 255) (0, 56, 142, 255) (0, 56, 170, 255) (0, 56, 199, 255) ( 
25 0, 56, 227, 255) (0, 56, 255, 255) (0, 85, 0, 255) (0, 85, 28, 255) (0, 85, 56, 
26 255) (0, 85, 85, 255) (0, 85, 113, 255) (0, 85, 142, 255) (0, 85, 170, 255) (0, 
27 85, 199, 255) (0, 85, 227, 255) (0, 85, 255, 255) (0, 113, 0, 255) (0, 113, 28, 
28 255) (0, 113, 56, 255) (0, 113, 85, 255) (0, 113, 113, 255) (0, 113, 142, 255) ( 
29 0, 113, 170, 255) (0, 113, 199, 255) (0, 113, 227, 255) (0, 113, 255, 255) (0, 1 
30 42, 0, 255) (0, 142, 28, 255) (0, 142, 56, 255) (0, 142, 85, 255) (0, 142, 113, 
31 255) (0, 142, 142, 255) (0, 142, 170, 255) (0, 142, 199, 255) (0, 142, 227, 255) 
32 (0, 142, 255, 255) (0, 170, 0, 255) (0, 170, 28, 255) (0, 170, 56, 255) (0, 170 
33 , 85, 255) (0, 170, 113, 255) (0, 170, 142, 255) (0, 170, 170, 255) (0, 170, 199 
34 , 255) (0, 170, 227, 255) (0, 170, 255, 255) (0, 199, 0, 255) (0, 199, 28, 255) 
35 (0, 199, 56, 255) (0, 199, 85, 255) (0, 199, 113, 255) (0, 199, 142, 255) (0, 19 
36 9, 170, 255) (0, 199, 199, 255) (0, 199, 227, 255) (0, 199, 255, 255) (0, 227, 0 
37 , 255) (0, 227, 28, 255) (0, 227, 56, 255) (0, 227, 85, 255) (0, 227, 113, 255) 
38 (0, 227, 142, 255) (0, 227, 170, 255) (0, 227, 199, 255) (0, 227, 227, 255) (0, 
39 227, 255, 255) (0, 255, 0, 255) (0, 255, 28, 255) (0, 255, 56, 255) (0, 255, 85, 
40 255) (0, 255, 113, 255) (0, 255, 142, 255) (0, 255, 170, 255) (0, 255, 199, 255 
41 ) (0, 255, 227, 255) (0, 255, 255, 255) (28, 0, 0, 255) (28, 0, 28, 255) (28, 0, 
42 56, 255) (28, 0, 85, 255) (28, 0, 113, 255) (28, 0, 142, 255) (28, 0, 170, 255) 
43 (28, 0, 199, 255) (28, 0, 227, 255) (28, 0, 255, 255) (28, 28, 0, 255) (28, 28, 
44 28, 255) (28, 28, 56, 255) (28, 28, 85, 255) (28, 28, 113, 255) (28, 28, 142, 2 
45 55) (28, 28, 170, 255) (28, 28, 199, 255) (28, 28, 227, 255) (28, 28, 255, 255) 
46 (28, 56, 0, 255) (28, 56, 28, 255) (28, 56, 56, 255) (28, 56, 85, 255) (28, 56, 
47 113, 255) (28, 56, 142, 255) (28, 56, 170, 255) (28, 56, 199, 255) (28, 56, 227, 
48 255) (28, 56, 255, 255) (28, 85, 0, 255) (28, 85, 28, 255) (28, 85, 56, 255) (2 
49 8, 85, 85, 255) (28, 85, 113, 255) (28, 85, 142, 255) (28, 85, 170, 255) (28, 85 
50>>> 


通过GetRasterColorInterpretation,我们知道我们的图像是一个颜色表索引的图像而不是纯粹的黑白灰度图像(PaletteIndex,其他的颜色模型,可以察看gdalconst模块中GCI打头的枚举值)。这意味着我们读出的数据有可能不是真实的数据。这些数据只是一个个实际数据的索引。真实数据存储在另一个表中。我们通过ReadRaster读出的数据值只是对应到这个表的一个索引而已。我们需要通过读出这些数据,并在真实数据表中找出真实数据,重新组织成一个RGB表才能用来绘制。如果我们不经过对应,我们绘制出来的东西可能什么东西都不是。 
用GetRasterColorTable获得了颜色表,通过GetPaletteInterpretation我们知道我们获得的颜色表是一个RGB颜色表。GDAL支持多种颜色表,具体可以参考gdalconst模块中GPI打头的枚举值。然后我们可以通过GetCount获得颜色的数量。通过GetColorEntry获得颜色表中的值。这里的颜色值都是一个4值的元组。里面有意义的只有前三个(如果颜色模型是GPI_RGB, GPI_HLS,都使用前3个,如果采用GPI_CMYK,则4个值都有意义了)。 
Toggle line numbers 
1 >>> help(band.ReadAsArray) 
2 Help on method ReadAsArray in module gdal: 
3 ReadAsArray(self, xoff=0, yoff=0, win_xsize=None, win_ysize=None, buf_xsize=None 
4 , buf_ysize=None, buf_obj=None) method of gdal.Band instance 
5 >>> help(band.ReadRaster) 
6 Help on method ReadRaster in module gdal: 
7 ReadRaster(self, xoff, yoff, xsize, ysize, buf_xsize=None, buf_ysize=None, buf_t 
8 ype=None) method of gdal.Band instance 
9 >>> 


显然,band里的ReadAsArray参数显然比dataset里面的要好用,而ReadRaster则差不多。但是ReadAsArray读出的是数组,可以用Numeric模块进行矩阵魔法。ReadRaster读出的是二进制,虽然可以直接绘制,但是对于一些绘图API来说,对[[RRR...][GGG...][BBB...]]表的处理明显不如[[RGB][RGB]...],有的甚至不支持。虽然可以用struct.unpack来拆封,可效率上就差很多(而且拆封出来还是数组)。数组在矩阵魔法的控制之下则会显得十分方便快捷,最后用tostring直接转化称为二进制绘制,速度也相当快。 
好了,快速开始已经使我们可以初步看清楚了gdal中图像的组织。下面用一句话总结一下:波段组成图像,波段指挥颜色。
========

Win7(32/64)VS2010配置编译GDAL环境(图文教程)


最近的一个VS2010的项目中用到了GDAL,关于GDAL这个库的说明与赞美,这里就不赘述了,下面是在VS2010中配置GDAL的详细过程。

系统说明

Win7(32位/64位),VS2010,GDAL 1.10.1(截止本文发布的最新版),进行下面的操作之前,请确保您已经正确安装了VS2010,步骤如下:

1.下载GDAL

点击进入GDAL的官方下载页面,根据需要选择不同的版本,根据测试之前的GDAL1.9.1 0往后的版本均可以按照本文的方法编译成功。下载完成后解压到一个根目录下,因为这样后面的操作会比较方便,本文所解压的地址为

D:\gdal-1.10.1
如果你解压的地址跟本文不同,可以按照实际情况做出修改。

2.执行VCVARS32.BAT

以管理员身份运行cmd,(您可以在开始菜单搜索cmd,然后右击选择用管理员身份运行,也可以在C:\windows\system32下找到cmd.exe右击选择采用管理员身份运行),如图:

undefined

然后在cmd中切换到VS2010的安装目录,例如本文中的是

C:\program files\Microsoft Visual Studio 10.0\VC\bin
执行VCVARS32.BAT,如图:

undefined

3.编译GDAL

在cmd中切换目录到

D:\gdal-1.10.1
目录下,运行如下命令

nmake /f makefile.vc
编译过程可能需要几分钟,根据系统的配置而定,如图

undefined

4.设置输出目录

找到下载目录中的nmake.opt文件,例如本文的中的文件路径为:

D:\gdal-1.10.1\nmake.opt
用文本编辑器(建议使用现代化文本编辑器例如notepad++)打开修改GDAL_HOME的值为安装目录。本文中使用的目录如下:

GDAL_HOME = "D:\GDAL"
如图:

undefined

5.安装GDAL

回到CMD界面,切换到解压目录(本文的是D:\gdal-1.10.1)下,执行如下两条命令:

nmake /f makefile.vc install
nmake /f makefile.vc devinstall
如图所示:

先执行nmake /f makefile.vc install

undefined

再执行nmake /f makefile.vc devinstall

undefined

等待一段时间之后,GDAL就算真正的编译完成了,这时候打开步骤4中设置的安装目录,需要的东西就在里面了,有bin,data,html,lib,include几个文件夹。如图所示:

undefined

安装完成以后需要在VS2010的项目中配置GDAL,具体方法情看:VS2010中项目配置引入GDAL

6.其他方法

Windows下,cmd定位至gdal目录,运行makegdal_gen.bat生成.vcproj,然后打开生成即可;Linux下,terminal定位至gdal目录,运行./configure,然后运行make命令即可,如需安装,运行sudo make install。 来自@hao,也可以测试下。

VS2010调试变量报错CXX0017没有找到符号
 
运行VS2010空项目直接退出
 
VS2010中项目配置引入GDAL

请问配置好后添加头文件,为什么总是提示无法找到呢?急急急急

参考http://malagis.com/vs2010-project-configuration-gdal.html,我这里是可以的

请问为什么它不能成功识别.BAT文件路径?

你的路径是不是有空格?

编译gdal只能用vs20##软件吗?vc++6.0 不行吗?

应该也可以,你去GDAL的官网看看,有没相应的支持版本。

.站长,小弟觉得您的方法有纰漏,下面是我搜到的方法以管理员身份运行Visual Studio x64 兼容工具命令提示(2010)http://m15989223765.blog.163.com/blog/static/233430095201421725748335/

我想问下我编译最后两行的时候总是出现两个错误
Fatal error LNK1181和fatal error U1007 返回值0x49d
有解决方法么

你好,我现在在vs2010c++项目里用gdal打开图像,自己电脑可以正常打开,换别的电脑就打不开
========

相关链接

http://blog.csdn.net/rrrrssss00/article/details/7455478
http://www.cnblogs.com/zhangjun1130/archive/2009/11/13/1602340.html
http://malagis.com/win7-vs2010-gdal.html
http://blog.csdn.net/liminlu0314/article/details/7072007
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值