GDAL文档.docx
《GDAL文档.docx》由会员分享,可在线阅读,更多相关《GDAL文档.docx(15页珍藏版)》请在冰点文库上搜索。
GDAL文档
GDAL文档
GDAL介绍:
GDAL(GeospatialDataAbstractionLibrary)是一个在X/MIT许可协议下的开源栅格空间数据转换库。
它利用抽象数据模型来表达所支持的各种文件格式。
它还有一系列命令行工具来进行数据转换和处理。
OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。
有很多著名的GIS类产品都使用了GDAL/OGR库,包括ESRI的ArgGIS9.2,GoogleEarth和跨平台的GRASSGIS系统。
利用GDAL/OGR库,可以使基于Linux的地理空间数据管理系统提供对矢量和栅格文件数据的支持。
1.GDAL
GDAL提供对多种栅格数据的支持,包括Arc/InfoASCIIGrid(asc),GeoTiff(tiff),ErdasImagineImages(img),ASCIIDEM(dem)等格式。
GDAL使用抽象数据模型(abstractdatamodel)来解析它所支持的数据格式,抽象数据模型包括数据集(dataset),坐标系统,仿射地理坐标转换(AffineGeoTransform),大地控制点(GCPs),元数据(Metadata),栅格波段(RasterBand),颜色表(ColorTable),子数据集域(SubdatasetsDomain),图像结构域(Image_StructureDomain),XML域(XML:
Domains)。
GDALMajorObject类:
带有元数据的对象。
GDALDdataset类:
通常是从一个栅格文件中提取的相关联的栅格波段集合和这些波段的元数据;GDALDdataset也负责所有栅格波段的地理坐标转换(georeferencingtransform)和坐标系定义。
GDALDriver类:
文件格式驱动类,GDAL会为每一个所支持的文件格式创建一个该类的实体,来管理该文件格式。
GDALDriverManager类:
文件格式驱动管理类,用来管理GDALDriver类。
2.OGR
OGR提供对矢量数据格式的读写支持,它所支持的文件格式包括:
ESRIShapefiles,S-57,SDTS,PostGIS,OracleSpatial,Mapinfomid/mif,MapinfoTAB。
1)OGR体系结构
OGR包括如下几部分:
Geometry:
类Geometry(包括OGRGeometry等类)封装了OpenGIS的矢量数据模型,并提供了一些几何操作,WKB(WellKnowsBinary)和WKT(WellKnownText)格式之间的相互转换,以及空间参考系统(投影)。
SpatialReference:
类OGRSpatialReference封装了投影和基准面的定义。
Feature:
类OGRFeature封装了一个完整feature的定义,一个完整的feature包括一个geometry和geometry的一系列属性。
FeatureDefinition:
类OGRFeatureDefn里面封装了feature的属性,类型、名称及其默认的空间参考系统等。
一个OGRFeatureDefn对象通常与一个层(layer)对应。
Layer:
类OGRLayer是一个抽象基类,表示数据源类OGRDataSource里面的一层要素(feature)。
DataSource:
类OGRDataSource是一个抽象基类,表示含有OGRLayer对象的一个文件或一个数据库。
Drivers:
类OGRSFDriver对应于每一个所支持的矢量文件格式。
类OGRSFDriver由类OGRSFDriverRegistrar来注册和管理。
GDAL库安装:
http:
//download.osgeo.org/gdal/gdal142.zip从这个网站中下载gdal文件。
接下来是安装步骤,具体是在VC6.0上安装的,但是安装过后生成的include文件夹、Lib文件、dll拷到其他平台上都可以使用的。
所以讲一下在VC6.0中安装就行。
1.把GDAL文件夹拷贝到C:
\DocumentsandSettings\Administrator目录下面(也可以选择其他路径)把C:
\windows\system32目录下面的xcopy.exe复制到.\MicrosoftVisualStudio\VC98\Bin目录下在VC目录下面搜索出MSPDB60.DLL文件,也复制到\VC98\Bin目录下。
2.新建一个文件Autoexec.bat内容如下:
SETPATH=D:
\ProgramFiles\MicrosoftVisualStudio\VC98\Bin
SETINCLUDE=D:
\ProgramFiles\MicrosoftVisualStudio\VC98\Include
SETLIB=D:
\ProgramFiles\MicrosoftVisualStudio\VC98\LIB
(注:
“D:
\ProgramFiles\MicrosoftVisualStudio\”为VC安装的具体路径)
保存后复制到C:
\DocumentsandSettings\Administrator目录下
3.将.\VC98\Bin目录下的VCVARS32.BAT也复制到C:
\DocumentsandSettings\Administrator目录下
4.运行cmd,启动DOS,WindowsXP自带的DOS默认路径为C:
\DocumentsandSettings\Administrator
5.直接键入Autoexec.bat,回车运行,屏幕显示Autoexec.bat的内容
6.再键入VCVARS32.BAT,回车运行,屏幕显示SettingenvironmentforusingMicrosoftVisualC++tools.
7.键入cdgdal,回车进入gdal目录
8.键入nmake/fmakefile.vc,回车后开始处理gdal文件
9.等待一段时间,处理完毕,先修改nmake.opt中的文件生成路径:
只修改一处即可:
GDAL_HOME="C:
\DocumentsandSettings\Administrator\gdal"(引号内可以为其他路径),保存文件
10.键入nmake/fmakefile.vcinstall,等待一段时间,安装成功C:
\DocumentsandSettings\Administrator\gdal目录下面生成了bin和data文件夹
11.键入nmake/fmakefile.vcdevinstall,等待一段时间,安装成功C:
\DocumentsandSettings\Administrator\gdal目录下面生成了include和lib文件夹
12.VC编译器中新增链接include和lib,并将C:
\DocumentsandSettings\Administrator\gdal目录下面生成的gdal13.dll文件复制到工程目录下.
13.将gdal_priv.h头文件加进工程,即可调用gdal中的函数.函数的使用方法请参考gdaldoc下面的GDALAPITutorial说明(若安装过程中发生某个文件找不到,请在VC安装目录下或者C:
\下面搜索,并复制到合适的目录下面,一般为.\VC989\Bin或者DOS操作的目录(这里为C:
\DocumentsandSettings\Administrator目录),再重新进行上面的步骤即可完成安装)
GDAL库使用:
在GDAL库读写IMG文件时常用的一些函数,在GDALAPI中都有说明,在这里我简单的介绍一下。
1.声明一个数据集:
GDALDataset*poDataSet=NULL;
2.在打开GDAL所支持的光栅数据之前需要注册驱动。
这里的驱动是针对GDAL支持的所有数据格式。
各种图像支持的数据格式。
通常可以通过调用GDALAllRegister()函数来注册所有已知的驱动,同时也包含那些用GDALDriverManager:
:
AutoLoadDrivers()从.so文件中自动装载驱动。
3.注册完驱动之后就可以通过GDALopen函数来打开数据集。
具体使用方法是:
poDataSet=(GDALDataset*)GDALopen(filepath,GA_ReadOnly/*GA_Update*/);
如果GDALOpen()函数返回NULL则表示打开失败,同时CPLError()函数产生相应的错误信息。
如果您需要对错误进行处理可以参考CPLError()相关文档。
通常情况下,所有的GDAL函数都通过CPLError()报告错误。
另外需要注意的是pszFilename并不一定对应一个实际的文件名(当然也可以就是一个文件名)。
它的具体解释由相应的驱动程序负责。
它可能是一个URL,或者是文件名以后后面带有许多用于控制打开方式的参数。
通常建议,不要在打开文件的选择对话框中对文件的类型做太多的限制。
获取Dataset信息
一个GDALDataset包含了光栅数据的一系列的波段信息。
同时它还包含元数据、一个坐标系统、投影类型、光栅的大小以及其他许多信息。
adfGeoTransform[0]/*左上角x*/
adfGeoTransform[1]/*东西方向一个像素对应的距离*/
adfGeoTransform[2]/*旋转,0表示上面为北方*/
adfGeoTransform[3]/*左上角y*/
adfGeoTransform[4]/*旋转,0表示上面为北方*/
adfGeoTransform[5]/*南北方向一个像素对应的距离*/
可以这样使用来输出信息:
DoubleadfGeoTransform[6]={0,1,0,0,0,1};
if(poDataSet->GetGeoTransform(adfGeoTransform)==CE_None)
{
doubleOriginX=adfGeoTransform[0];//左上角X
doubleOriginY=adfGeoTransform[3];//左上角Y
doubleH_Pixel=adfGeoTransform[1];//东西方向一个像素对应距离
doubleV_Pixel=adfGeoTransform[5];//南北方向一个像素对应距离
doublerotateN=adfGeoTransform[2];//旋转,表示上面为北方
doublerotateS=adfGeoTransform[4];//旋转,表示下面为北方
}
获取一个光栅波段
现在,我们可以通过GDAL获取光栅的一个波段。
同样每个波段含有元数据、块大小、颜色表以前其他一些信息。
下面的代码从dataset获取一个GDALRasterBand对象,并且显示它的一些信息。
GDALRasterBand*poBand;
poBand=poDataSet->GetRasterBand
(1);
poBand->GetBlockSize(&nXBlockSize,&nYBlockSize)//图像的x、y方向的像素点个数
光栅数据
GDAL图像的读写有三种方法:
GDALDataset:
:
RasterIO(…);
GDALRasterBand:
:
RasterIO(…);
GDALRasterBand:
:
ReadBlock()和WriteBlock()
但是GDALRasterBand:
:
RasterIO()是最常用的一种。
该函数可以自动转换数据类型、采样以及裁剪。
Short*pScanLine;
IntnXSize=poBand->GetXSize();
IntnYSize=poBand->GetYSize();
pScanLine=(short*)CPLMalloc(nXBlockSize*nYBlockSize);
poBand->RasterIO(GF_Read,0,0,nXSize,nYSize,//灰色图像中两种都能用
pafScanline,nXSize,nYSize,GDT_Int16,
0,0);
前两者本质上差不多,只不过第一项可以一次读取指定图像范围的所有波段信息,而第二种只读取所在波段的信息。
这两个函数的参数都有原图要读取的区域,以及目标大小两部分参数,根据这两部分参数,RasterIO可以自动完成图像的缩放(我只用到缩小)。
第一种读取,由于可以读取所有波段,还有一些特殊的地方,后面说明。
ReadBlock和WriteBlock是按照图像文件的分块组织读取,分块大小是图像文件本身已经客观存在的,由于适合文件分块的读取,所以速度是最快的,但是只能按分好的某块读取,灵活性差。
RasterIO最后三个参数对读取结果的排列,这个函数读取指定区域的所有波段,既然读取所有波段,就有一个数据组织格式的问题。
对于一般图像,一个波段(实际颜色的一个分量)是8bit,那么我们通过RasterIO取出来的数据就是byte*pData;(这里的byte,可以是typedefunsignedcharbyte)。
那么对于24bit的真彩图,pData里要存储红绿蓝(RGB)三个波段,RasterIO的最后三个参数就是指定这种组织方式的,具体概念大家到其APIDocument里面抠说明去,这里给出:
nPixelSpace, nLineSpace, nBandSpace 三者,如果都为0,则pData中数据的组织是:
RRR...RGGG….GBBB...B(三个参数均使用了默认设置),如果设置为(3,0,1),则可以排列成RGBRGBRGB…..(每像素3个数据位,每行可用数据位自动,每个波段1个数据位),后者更便于显示。
当然,Windows位图数据颜色排列是BGR,那么可以设置nBandCount=3,panBandMap=newint[]{3,2,1},这样读取波段的顺序就是BGR了~
下面来说一下RasterIO的参数说明:
CPLErrGDALRasterBand:
:
RasterIO(GDALRWFlageRWFlag,
intnXOff,intnYOff,intnXSize,intnYSize,
void*pData,intnBufXSize,intnBufYSize,
GDALDataTypeeBufType,
intnPixelSpace,
intnLineSpace)
RasterIO通过eRWFlag参数来确定读写数据(GF_Read或GF_Write)。
参数nXOff/nYOff/nXSize/nYSize描述了要读的影象范围(或者是写)同时它也可同时它也可以自动处理边界等特殊情况。
参数pData指定读/写对应的缓冲。
缓冲的类型必须是eBufType中定义的,例如GDT_Float32、GDT_Byte等。
RasterIO()会自动转换缓冲和波段的类型,使它们一致。
当数据向下转换时,或者是数据超出转换后的数据类型可以表示的范围时,将会用最接近的数据来代替。
例如一个16位的整数被转换为GDT_Byte时,所有大于255的值都会用255代替(数据并不会被缩放)。
参数nBufXSize和nBufYSize描述了缓冲的大小。
当时读写是是全部数据时,该值和影象的大小相同。
当需要对影象抽样的时候,缓冲也可以比真实的影象小。
因此,利用RasterIO()实现预览功能是很方便的。
参数nPixelSpace和nLineSpace通常被设置为0。
当然,也可以使用他们来控制内存中的数据。
关闭Dataset。
下面贴出我的关于GDAL读取IMG文件的函数代码,这个函数主要用于把IMG文件中的信息提取出来写入到LDF文件中去,然后将IMG文件中的栅格数据按块写入到dsm中。
voidWriteLDF(CStringimgfilepath,CStringdestination)//加了参数
{
CStringLdfFilepath;
LdfFilepath=destination+_T("\\")+_T("LAYERDESCRIPTIONFILE.LDF");
CStdioFileWriteFile(LdfFilepath,CFile:
:
modeWrite|CFile:
:
modeCreate);
WriteFile.WriteString(_T("[Common]\n"));
WriteFile.WriteString(_T("Date=(cstring)\"22.06.2010\"\n"));
WriteFile.WriteString(_T("Version=(cstring)\"1.0.0\"\n"));
WriteFile.WriteString(_T("Copyright=(cstring)\"\"\n"));
WriteFile.WriteString(_T("\n"));
WriteFile.WriteString(_T("[Filenames]\n"));
WriteFile.WriteString(_T("Prefix=(cstring)\"dsm\"\n"));
WriteFile.WriteString(_T("Delimiter=(cstring)\"_\"\n"));
WriteFile.WriteString(_T("XSuffix=(cstring)\"00\"\n"));
WriteFile.WriteString(_T("YSuffix=(cstring)\"00\"\n"));
WriteFile.WriteString(_T("\n"));
WriteFile.WriteString(_T("[DataDescription]\n"));
GDALDataset*poDataSet=NULL;
USES_CONVERSION;
GDALAllRegister();
poDataSet=(GDALDataset*)GDALOpen(T2A(imgfilepath),GA_ReadOnly);//"E:
\\dingya\\ASTGTM_N31E120J\\ASTGTM_N30E120R_DEM_UTM.img"
if(poDataSet!
=NULL)
{
doubleOriginX;
doubleOriginY;
doubleH_Pixel;
doubleV_Pixel;
doublerotateN;
doublerotateS;
intnXBlockSize,nYBlockSize;
intnBandNum=0;
CStringstrTemp=_T("");
intnLengthX=poDataSet->GetRasterXSize();
intnLengthY=poDataSet->GetRasterYSize();
nBandNum=poDataSet->GetRasterCount();
GDALDriver*pDriver;
pDriver=poDataSet->GetDriver();
if(pDriver==NULL)
return;
//获取Dataset信息,一个GDALDataset包含了光栅数据的一系列的波段信息。
//同时它还包含元数据、一个坐标系统、投影类型、光栅的大小以及其他许多信息。
CStringDriver(pDriver->GetDescription());//获取文件信息
CStringDriverName(pDriver->GetMetadataItem(GDAL_DMD_LONGNAME));//驱动名字
CStringProjection(poDataSet->GetProjectionRef());//获取坐标信息
CStringzone;
AfxExtractSubString(zone,Projection,2,'');
zone.SetAt(zone.GetLength()-1,'');
zone.Trim();
doubleadfGeoTransform[6]={0,1,0,0,0,1};
if(poDataSet->GetGeoTransform(adfGeoTransform)==CE_None)//获取仿射信息
{
OriginX=adfGeoTransform[0];//左上角X
OriginY=adfGeoTransform[3];//左上角Y
H_Pixel=adfGeoTransform[1];//东西方向一个像素对应距离
V_Pixel=adfGeoTransform[5]*(-1);//南北方向一个像素对应距离
rotateN=adfGeoTransform[2];//旋转,表示上面为北方
rotateS=adfGeoTransform[4];//旋转,表示下面为北方
}
GDALRasterBand*poBand;
poBand=poDataSet->GetRasterBand
(1);
poBand->GetBlockSize(&nXBlockSize,&nYBlockSize);
WriteFile.WriteString(_T("XPixel=(long)"));
strTemp.Format(_T("%d"),nXBlockSize);
WriteFile.WriteString(strTemp);
WriteFile.WriteString(_T("\n"));
WriteFile.WriteString(_T("YPixel=(long)"));
strTemp.Format(_T("%d"),nYBlockSize);
WriteFile.WriteString(strTemp);
WriteFile.WriteString(_T("\n"));
WriteFile.WriteString(_T("BitsPerPixel=(long)16\n"));
WriteFile.WriteString(_T("PixelDataType=(cstring)\"short\"\n"));
WriteFile.WriteString(_T("FileType=(cstring)\"Binary\"\n"));
WriteFile.WriteString(_T("ByteOrder=(cstring)\"BigEndian\"\n"));
WriteFile.WriteString(_T("InvertByte=(cstring)\"FALSE\"\n"));
WriteFile.WriteString(_T("Offset