• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
修成正果
记录修身养性、终成正果之漫漫长路
博客园    首页    新随笔    联系   管理    订阅  订阅

Gdal浅析(一)读取栅格数据到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 ()
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);//获取制定波段
}


int  GetRasterXSize (void)
int  GetRasterYSize (void)
获取波段的size
最后一个:

CPLErr  BuildOverviews (const char *, int, int *, int, int *, GDALProgressFunc, void *)


这个是在ds上构建Overviews,我猜想是建类似金字塔的抽取,或称之为视图。目前还在摸索,希望高手指教!


6、这次就先研究到Band,下次从Band入手,继续摸索。

Demo的效果图如下:

--

posted @ 2008-09-04 22:52  修程正果.GIS  阅读(9870)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3