logo资料库

GDAL开发手册--基础API的介绍和一些入门.doc

第1页 / 共114页
第2页 / 共114页
第3页 / 共114页
第4页 / 共114页
第5页 / 共114页
第6页 / 共114页
第7页 / 共114页
第8页 / 共114页
资料共114页,剩余部分请下载后查看
第一部分:GDAL DEVELOPER GUIDE
1.GDAL API入门
1.1.打开文件
1.2.获取Dataset信息
1.3.获取一个光栅波段
1.4.读光栅数据
1.5.创建文件的技巧
1.6.使用CreateCopy()
1.7.使用Create()
2.GDAL数据模型
2.1.数据集(Dataset)
2.1.1.坐标系统
2.1.2.仿射地理变换
2.1.3.GCPs
2.1.4.元数据(Metadata)
2.1.4.1.SUBDATASETS 域
2.1.4.2.IMAGE_STRUCTURE 域
2.1.4.3.xml: 域
2.2.Raster Band
2.3.颜色表
2.4.总结
3.GDAL驱动实现向导
3.1.目录
3.2.子类化Dataset
3.3.子类化RasterBand
3.4.驱动
3.5.将驱动添加到GDAL中
3.6.添加参照系
3.7.Overview
3.8.创建文件
3.9.CreateCopy
3.9.1.动态创建
3.10.RawDataset/RawRasterBand Helper Classes
3.11.元数据以及其他扩展
4.OGR API 使用向导
4.1.用OGR读
4.2.用OGR写
第二部分:GDAL学习笔记
1.GDAL库简介
1.1.GDAL库介绍
1.2.安装
1.2.1.windows下的安装
1.2.2.linux下的安装
1.2.3.安装其他驱动
1.2.4.下载
1.3.快速开始
1.4.反馈
2.GDAL库的一些细节
2.1.关于ReadRaster
2.1.1.缩放
2.1.2.范围
2.1.3.效率
2.2.1.2. 关于ColorMap
2.2.1.ColorMap的颜色定义
2.2.2.ColorMap颜色变动
2.2.3.反馈
3.GDAL创建数据集
3.1.创建数据集
3.2.注意
3.3.小例子
3.4.反馈
4.关于空间参考
4.1.关于空间参考
4.2.GDAL文档的解释
4.2.1.仿射地理转换
4.2.2.GCPs
4.3.我的理解
4.3.1.WKT
4.3.2.坐标转换
4.3.3.小插曲:
4.3.4.GCPs
4.4.反馈
5.坐标系之间的转化
5.1.坐标转化
5.1.1.官方的教程
5.1.1.1.简介
5.1.1.2.定义一个地理坐标系
5.1.1.3.定义一个投影系统
5.1.1.4.查询坐标系统
5.1.1.5.坐标转换
5.1.1.6.API绑定
5.1.1.7.接口实现
5.2.我的试验
5.2.1.创建和比较
5.2.2.地理坐标系和投影坐标系之间的坐标转换
5.3.反馈
6.把dem地形转化成vrml虚拟现实
6.1.一个从DEM生成VRML的例子
6.2.反馈
7.GDAL和PIL的互操作
7.1.gdal和PIL的互操作
7.2.反馈
第三部分:其它资源
1.DXF库(dxflib)使用指南
目录
第一章 简介
第二章 编译dxflib库
Unix/Linux
Windows
第三章 读DXF文件
实现Creation接口
第四章 写DXF文件
4.1 创建一个Writer对象
4.2 写DXF Header
4.2.1 打开DXF Header
4.2.2 存储附加的变量
4.2.3 关闭Header
4.3 写Tables Section
4.3.1 打开Tables Section
4.3.2 写Viewports
4.3.3 写Linetypes
4.3.4 写Layers
4.3.5 写其他的Tables
4.3.6 写Dimension Styles
4.3.7 写Block Records
4.3.8 结束Tables Section
4.4 写Blocks Section
4.5 写Entities Section
4.6 写Objects Section
4.7 结束并且关闭文件
附录参考
第一部分:GDAL DEVELOPER GUIDE 翻译:柴树杉(chaishushan@gmail.com) 原文:http://www.gdal.org/gdal_tutorial.html 1. GDAL API 入门 1.1. 打开文件 在打开 GDAL 所支持的光栅数据之前需要注册驱动。这里的驱动是针对 GDAL 支持 的所有 数据格式。通常可以通过调用 GDALAllRegister() 函数来注册所有已知 的驱动,同时 也包含那些用 GDALDriverManager::AutoLoadDrivers() 从.so 文件中自动装载驱动。 如果程序需要对某些驱动做限制,可以参考 gdalallregister.cpp 代码。 当驱动被注册之后,我们就可以用 GDALOpen() 函数来打开一个数据集。打开的 方式 可以是 GA_ReadOnly 或者 GA_Update。 In C++: #include "gdal_priv.h" int main() { GDALDataset *poDataset; GDALAllRegister(); poDataset = (GDALDataset *) GDALOpen( pszFilename, GA_ReadOnly ); if( poDataset == NULL ) { ...; } In C: #include "gdal.h" int main() { GDALDatasetH hDataset;
GDALAllRegister(); hDataset = GDALOpen( pszFilename, GA_ReadOnly ); if( hDataset == NULL ) { ...; } In Python: import gdal from gdalconst import * dataset = gdal.Open( filename, GA_ReadOnly ) if dataset is None: ... 如果 GDALOpen() 函数返回 NULL 则表示打开失败,同时 CPLError() 函数产生 相应的错误信息。 如果您需要对错误进行处理可以参考 CPLError() 相关文档。 通常情况下,所有的 GDAL 函数都通过 CPLError()报 告错误。另外需要注意的 是 pszFilename 并不一定对应一个 实际的文件名(当然也可以就是一个文件 名)。它的具体解释由相应的驱动程序负责。 它可能是一个 URL,或者是文件 名以后后面带有许多用于控制打开方式的参数。通常建议, 不要在打开文件的 选择对话框中对文件的类型做太多的限制。 1.2. 获取 Dataset 信息 如果 GDAL 数据模型一节所描述的,一个 GDALDataset 包含了光栅数据的一系列 的波段信息。 同时它还包含元数据、一个坐标系统、投影类型、光栅的大小以 及其他许多信息。 adfGeoTransform[0] /* 左上角 x */ adfGeoTransform[1] /* 东西方向一个像素对应的距离 */ adfGeoTransform[2] /* 旋转, 0 表示上面为北方 */ adfGeoTransform[3] /* 左上角 y */ adfGeoTransform[4] /* 旋转, 0 表示上面为北方 */ adfGeoTransform[5] /* 南北方向一个像素对应的距离 */ 如果需要输出 dataset 的基本信息,可以这样: In C++: double adfGeoTransform[6]; 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( "Projection is `%s'\n", poDataset->GetProjectionRef() ); if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None ) { printf( "Origin = (%.6f,%.6f)\n", adfGeoTransform[0], adfGeoTransform[3] ); printf( "Pixel Size = (%.6f,%.6f)\n", adfGeoTransform[1], adfGeoTransform[5] ); } In C: GDALDriverH double hDriver; adfGeoTransform[6]; hDriver = GDALGetDatasetDriver( hDataset ); printf( "Driver: %s/%s\n", GDALGetDriverShortName( hDriver ), GDALGetDriverLongName( hDriver ) ); printf( "Size is %dx%dx%d\n", GDALGetRasterXSize( hDataset ), GDALGetRasterYSize( hDataset ), GDALGetRasterCount( hDataset ) ); if( GDALGetProjectionRef( hDataset ) != NULL ) printf( "Projection is `%s'\n", GDALGetProjectionRef( hDataset ) ); if( GDALGetGeoTransform( hDataset, adfGeoTransform ) == CE_None ) { printf( "Origin = (%.6f,%.6f)\n", adfGeoTransform[0], adfGeoTransform[3] );
printf( "Pixel Size = (%.6f,%.6f)\n", adfGeoTransform[1], adfGeoTransform[5] ); } In Python: print 'Driver: ', dataset.GetDriver().ShortName,'/', \ dataset.GetDriver().LongName print 'Size is ',dataset.RasterXSize,'x',dataset.RasterYSize, \ 'x',dataset.RasterCount print 'Projection is ',dataset.GetProjection() geotransform = dataset.GetGeoTransform() if not geotransform is None: print 'Origin = (',geotransform[0], ',',geotransform[3],')' print 'Pixel Size = (',geotransform[1], ',',geotransform[5],')' 1.3. 获取一个光栅波段 现在,我们可以通过 GDAL 获取光栅的一个波段。同样每个波段含有元数据、块 大小、 颜色表以前其他一些信息。下面的代码从 dataset 获取一个 GDALRasterBand 对象, 并且显示它的一些信息。 In C++: GDALRasterBand int int double *poBand; nBlockXSize, nBlockYSize; bGotMin, bGotMax; adfMinMax[2]; poBand = poDataset->GetRasterBand( 1 ); poBand->GetBlockSize( &nBlockXSize, &nBlockYSize ); printf( "Block=%dx%d Type=%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 has a color table with %d entries.\n", poBand->GetColorTable()->GetColorEntryCount() ); In C: GDALRasterBandH hBand; int int double nBlockXSize, nBlockYSize; bGotMin, bGotMax; adfMinMax[2]; hBand = GDALGetRasterBand( hDataset, 1 ); GDALGetBlockSize( hBand, &nBlockXSize, &nBlockYSize ); printf( "Block=%dx%d Type=%s, ColorInterp=%s\n", nBlockXSize, nBlockYSize, GDALGetDataTypeName(GDALGetRasterDataType(hBand)), GDALGetColorInterpretationName( GDALGetRasterColorInterpretation(hBand)) ); adfMinMax[0] = GDALGetRasterMinimum( hBand, &bGotMin ); adfMinMax[1] = GDALGetRasterMaximum( hBand, &bGotMax ); if( ! (bGotMin && bGotMax) ) GDALComputeRasterMinMax( hBand, TRUE, adfMinMax ); printf( "Min=%.3fd, Max=%.3f\n", adfMinMax[0], adfMinMax[1] ); if( GDALGetOverviewCount(hBand) > 0 ) printf( "Band has %d overviews.\n", GDALGetOverviewCount(hBand)); if( GDALGetRasterColorTable( hBand ) != NULL ) printf( "Band has a color table with %d entries.\n", GDALGetColorEntryCount( GDALGetRasterColorTable( hBand ) ) ); In Python: band = dataset.GetRasterBand(1)
print 'Band Type=',gdal.GetDataTypeName(band.DataType) min = band.GetMinimum() max = band.GetMaximum() if min is not None and max is not None: (min,max) = ComputeRasterMinMax(1) print 'Min=%.3f, Max=%.3f' % (min,max) if band.GetOverviewCount() > 0: print 'Band has ', band.GetOverviewCount(), ' overviews.' if not band.GetRasterColorTable() is None: print 'Band has a color table with ', \ band.GetRasterColorTable().GetCount(), ' entries.' 1.4. 读光栅数据 GDAL 有几种读光栅数据的方法,但是 GDALRasterBand::RasterIO()是最常用的 一种。 该函数可以自动转换数据类型、采样以及裁剪。下面的代码读光栅的第 1 行数据, 同时转换为 float 保存到缓冲。 In C++: In C: 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 ); float *pafScanline; int nXSize = GDALGetRasterBandXSize( hBand ); pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize); GDALRasterIO( hBand, GF_Read, 0, 0, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0, 0 ); In Python:
scanline = band.ReadRaster( 0, 0, band.XSize, 1, \ band.XSize, 1, GDT_Float32 ) 返回的是一个 string,包含了 xsize*4 大小的二进制数据,是 float 类型指针。 可以使用 python 的 struct 模块转换为 python 数据类型: import struct tuple_of_floats = struct.unpack('f' * b2.XSize, scanline) RasterIO 函数的完整说明如下: CPLErr GDALRasterBand::RasterIO( GDALRWFlag eRWFlag, nYSize, nBufYSize, int nXOff, int nYOff, int nXSize, int void * pData, int nBufXSize, int GDALDataType eBufType, int nPixelSpace, int nLineSpace ) 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 需要强调的一点是:GDALRasterBand 对象属于相应的 dataset,用户不能私自 delete 任何 GDALRasterBand 对象。GDALDataset 可以用 GDALClose()关闭数据, 或者是直接 delete GDALDataset 对象。关闭 GDALDataset 的时候会进行相关的 清除操作和刷新一些写操作。 1.5. 创建文件的技巧
如果相应格式的驱动支持写操作的话,则可以创建文件。GDAL 有两函数可以创 建文件: CreateCopy()和 Create()。 CreateCopy()函数直接从参数给定的数 据集复制数据。 Create()函数则需要用户明确地写入各种数据(元数据、光栅 数据等)。所有支持创建 的格式驱动都支持 CreateCopy()函数,但是并不一定 支持 Create()函数。 为了确定数据格式是否支持 Create 或 CreateCopy,可以检查驱动对象中的 DCAP_CREATE 和 DCAP_CREATECOPY 元数据。在使用 GetDriverByName()函数之前 确保 GDALAllRegister() 已经被调用过。 In C++: #include "cpl_string.h" ... const char *pszFormat = "GTiff"; GDALDriver *poDriver; char **papszMetadata; poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); if( poDriver == NULL ) exit( 1 ); papszMetadata = poDriver->GetMetadata(); if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ) ) printf( "Driver %s supports Create() method.\n", pszFormat ); if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE ) ) printf( "Driver %s supports CreateCopy() method.\n", pszFormat ); In C: #include "cpl_string.h" ... const char *pszFormat = "GTiff"; GDALDriver hDriver = GDALGetDriverByName( pszFormat ); char **papszMetadata; if( hDriver == NULL ) exit( 1 ); papszMetadata = GDALGetMetadata( hDriver, NULL ); if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ) ) printf( "Driver %s supports Create() method.\n", pszFormat ); if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE ) )
分享到:
收藏