logo资料库

gdal操作操作手册.pdf

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
GdalGdalGdalGdal 浅析(一)读取栅格数据到 Dataset Dataset Dataset Dataset gdal 读取栅格数据的流程分析 今天,利用 gdal 写了一个 demo 用来读取栅格数据、并显示其波段、色调等信息。 在此分享一下,我对 gdal 读取栅格数据的流程的浅析。 1、使用 gdal 的第一步肯定是先要注册。使用静态函数 gdal.AllRegister(); 2、gdal 将所有的栅格数据都是读取到一个它自己定义的 dataset 中,所以 OSGeo.GDAL.Dataset ds=new OSGeo.GDAL.Dataset(); 3、使用 open 函数 ds = gdal.Open(inputFileName, gdalconst.GA_ReadOnly); 4、至此,全路径为 inputFileName 的栅格文件已经读到 ds 中,下面介绍 OSGeo.GDAL.Dataset 类 总体来说,OSGeo.GDAL.Dataset 实际上就是一系列相关联的波段的组合。 其共有成员如下: virtual ~GDALDataset () int GetRasterXSize (void) int GetRasterYSize (void) int GetRasterCount (void) GDALRasterBand * GetRasterBand (int) virtual void FlushCache (void) virtual const char * GetProjectionRef (void) virtual CPLErr SetProjection (const char *) virtual CPLErr GetGeoTransform (double *) virtual CPLErr SetGeoTransform (double *) virtual CPLErr AddBand (GDALDataType eType, char **papszOptions=NULL) virtual void * GetInternalHandle (const char *) virtual GDALDriver * GetDriver (void) virtual int GetGCPCount () virtual const char * GetGCPProjection () 1
virtual const GDAL_GCP * GetGCPs () virtual CPLErr SetGCPs (int nGCPCount, const GDAL_GCP *pasGCPList, const char *pszGCPProjection) virtual CPLErr AdviseRead (int nXOff, int nYOff, int nXSize, int nYSize, int nBufXSize, int nBufYSize, GDALDataType eDT, int nBandCount, int *panBandList, char **papszOptions) CPLErr RasterIO (GDALRWFlag, int, int, int, int, void *, int, int, GDALDataType, int, int *, int, int, int) int Reference () int Dereference () GDALAccess GetAccess () int GetShared () void MarkAsShared () CPLErr BuildOverviews (const char *, int, int *, int, int *, GDALProgressFunc, void *) 上述代码是 C 语言的,有比较烦躁的指针。不过只要大家仔细思考,还是可以很轻松的将其转换成 C#语 言的。 5、其中我们要使用的、或者说比较常用的方法有以下几个。 获取驱动,例如对于 tif 文件的驱动就是 GeoTiff。 virtual GDALDriver * GetDriver (void) 获取投影方式,在.NET 中,返回值是 string 类型的投影描述语句 virtual const char * GetProjectionRef (void) 获取波段数目,这个值决定了下面的分别获取每一个波段的循环次数 int GetRasterCount (void) for (int iBand = 1; iBand <= ds.RasterCount; iBand++) { } Band band = ds.GetRasterBand(iBand);//获取制定波段 2
int GetRasterXSize (void) int GetRasterYSize (void) 获取波段的 size 最后一个: CPLErr BuildOverviews (const char *, int, int *, int, int *, GDALProgressFunc, void *) 这个是在 ds 上构建 Overviews,我猜想是建类似金字塔的抽取,或称之为视图。目前还在摸索,希望高 手指教! 6、这次就先研究到 Band,下次从 Band 入手,继续摸索。 Demo 的效果图如下: -- 3
gdalgdalgdalgdal 浅析((((二))))波段操作 上次分析到将栅格数据读取到 Dataset 中,每个 Dataset 中包含若干个波段,Now let's go on! 首先介绍 Band 类: band 类是用来描述栅格数据的各个波段的信息的。 详细的类介绍在此不贴出来了,太长,影响阅读效果。 其中主要的属性和方法将随着我下面的两个函数详细介绍。 本来这两天忙着看云计算,没有把心思放在 Gdal 上,恰巧 Mr Zuo 在研究 workflow 时建议我写一个可扩展 可应用的处理栅格数据的模块让他在 workflow 中调用,于是便有了下面的文章。 今天主要写了两个函数 一、绝大部分栅格数据含有三个波段,其中的单一波段都不含颜色信息,只有灰度值信息,我们可以将这 4
三个波段分别转换成基于 RGB 三原色的灰度图片 \\将某一波段转换成只有灰度值的 Image void bandtoGrayImage(Band band, string fileName) 其中主要几个步骤 1、band.ReadRaster(0, 0, width, height, data, width, height, 0, 0); 将波段中的数据以 byte 的格式读到数组 byte[] data 中。 这意味着该波段的每一个像素的颜色灰度值按照先行后列的顺序存到数组中了。 2、Color newColor = Color.FromArgb(Convert.ToInt32(data[i + j * width]), Convert.ToInt32(data[i + j * width]), Convert.ToInt32(data[i + j * width])); bitmap.SetPixel(i, j, newColor); 将灰度值作为 RGB 的值,并由此计算出 color 值,并按像素绘制到 Image 中。 这一步因为需要按像素逐点计算并着色,需要较长的时间。但是将数组存储的像素值转换成 Image 貌似也 只有这个笨方法了。实验中我将一个960×480的栅格文件转换出三个波段的图片需要2分钟左右。 上述函数中的 newColor 是将 RGB 三原色的值都等于同一灰度值,如果只是将其中一个赋为灰度值,其他 两个设为0,则得到基于 RGB 的彩色图片。 即:Color newColor = Color.FromArgb(Convert.ToInt32(data[i + j * width]), 0, 0);//基于红色的彩色图像 这时候需要修改函数接口,增加一个标志项 void bandtoColorImage(Band band, string fileName,int colorType) 二、还有一种栅格数据只含有一个波段,而且这个波段是由 RGB 三原色波段组合而成的,含有颜色信息。 因此我们可以将这一个波段转换成基于 RGB 三原色的有颜色的图片。这中栅格数据我只有一幅,还是从网 上的一个实例中找到的。 \\将某一波段转换成只有灰度值的 Image void bandtoColorsImage(Band band, string fileName) 其中主要几个步骤 1、band.ReadRaster(0, 0, width, height, data, width, height, 0, 0); 原理同一 2、ColorTable ct = band.GetRasterColorTable(); 读取该波段的颜色表,其中的 ColorTable 类就是用来描述颜色表的,在下一步有重要作用。 5
3、ColorEntry entry = ct.GetColorEntry(data[i + j * width]); 获取颜色值。ColorTable 类中的 GetColorEntry 方法可以将数组中灰度值转换成颜色值。这里出现的 ColorEntry 类是一种颜色值的表述。 4、Color newColor = Color.FromArgb(Convert.ToInt32(entry.c1), Convert.ToInt32(entry.c2), Convert.ToInt32(entry.c3)); bitmap.SetPixel(i, j, newColor); 这一步从 ColorEntry 的实例中获取 RGB 格式的颜色值,entry.c1,entry.c2,entry.c3分别对应 RGB 三色值。 6
分享到:
收藏