GDAL金字塔

原创 2007年10月02日 10:44:00
GDAL是遥感数据的IO处理库,可以读写erdas img、GeoTiff等多种文件格式。本文通过建立金字塔读取大数据量的文件(测试数据1.45GB,文件格式 img)。

#include "gdal_priv.h"
#include "math.h"

unsigned char *uc_gray;       //灰度数组
 int iwidth;          //图像宽度
 int iheight;         //图像高度

int CImageObject::GetSmpStep(float size)
{
 //一副图内存中加载最大32MB
 if (size <= 32)
  return 1;
 else
  return (int(sqrt(size/32)));
}

 bool CImageObject::ReadGdalFile(CString strfile)

    GDALDataset  *poDataset;
    GDALAllRegister();
    poDataset = (GDALDataset *) GDALOpen(strfile , GA_ReadOnly);

    if( !poDataset == NULL )
   {
  //Fetching a Raster Band
  GDALRasterBand  *poBand;  
        poBand = poDataset->GetRasterBand( 1 );
  
  //Reading Raster Data
        long   nXSize = poBand->GetXSize();
  long   nYSize = poBand->GetYSize();
  //计算图像大小
  float fsize;
  fsize = (nXSize / 1024) * (nYSize / 1024) * 8  ;
  //获得金字塔压缩比率
  iSmpStep = GetSmpStep(fsize);
  //图像较小时直接读取灰度值
  if(iSmpStep == 1)
  {
   uc_gray = (BYTE *) CPLMalloc(sizeof(unsigned int)*nXSize*nYSize);
   int width=nXSize;
   int savewidth=width%4;
   if(savewidth!=0)
    savewidth=4-savewidth;
   savewidth+=width;
   iwidth=savewidth;
   iheight=nYSize;

   poBand->RasterIO( GF_Read, 0, 0, nXSize, nYSize,
         uc_gray, iwidth, iheight, GDT_Byte,
         0, 0 );
     
  }
  //图像较大时根据压缩比率建立相应的金字塔
  else
  {
   int OverviewList[1]={iSmpStep};
   poBand->BuildOverviews("NEAREST", 1, OverviewList, GDALDummyProgress, NULL );  
   int index = 0;
   iSmpStep = 4;
   nXSize /= iSmpStep;
   nYSize /= iSmpStep;
   uc_gray = (BYTE *) CPLMalloc(sizeof(unsigned int)*nXSize*nYSize);
   int width=nXSize;
   int savewidth=width%4;
   if(savewidth!=0)
    savewidth=4-savewidth;
   savewidth+=width;
   iwidth=savewidth;
   iheight=nYSize;

   GDALRasterBand *poBand2;
   poBand2 = poBand->GetOverview(index);
   poBand2->RasterIO( GF_Read, 0, 0, nXSize, nYSize,
         uc_gray, iwidth, iheight, GDT_Byte,
         0, 0 );
  }
  //转置图像使(0,0)坐标由左上角转换为左下角
  int i;
  BYTE temp;
  for(i=0; i<int(iheight/2); i++)
  {
   for(int j=0; j<iwidth; j++)
   {
    temp = uc_gray[i*iwidth+j];
    uc_gray[i*iwidth+j] = uc_gray[(iheight-i-1)*iwidth+j];
    uc_gray[(iheight-i-1)*iwidth+j] = temp;
   }
  }

   GDALClose(poDataset);
  return true;
 }
 return false; 
}

 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[转]使用GDAL创建Erdas格式的金字塔

在使用Erdas或者ArcGIS打开栅格图像的时候,会创建一个后缀名为rrd的金字塔文件,用于快速显示图像。那么在使用GDAL编写自己的图像算法后,像快速的在Erdas或者ArcGIS中显示,就需要自...

使用GDAL创建Erdas格式的金字塔

在使用Erdas或者ArcGIS打开栅格图像的时候,会创建一个后缀名为rrd的金字塔文件,用于快速显示图像。那么在使用GDAL编写自己的图像算法后,像快速的在Erdas或者ArcGIS中显示,就需要自...

形态学金字塔分割初步

【金字塔原理】思考的逻辑

思考的逻辑 当你对文章结构的构思已深入到关键句层次的下一层次时,就可以坐下来写作了。更低层次的思想不要再构思阶段完成,而要放在实际的写作过程中。 确定逻辑顺序 大脑能够进行的分组分析活动只有以下三种:...

星形倒金字塔实现

  • 2015-03-24 11:16
  • 564B
  • 下载

星星金字塔

金字塔形的存储设备,操作系统的抽象概念

金字塔形的存储设备,操作系统的抽象概念 系统在数据的创书上花费了大量的时间.硬件开发商(主要是那个做存储介质的人)为了减少这种数据传输的时间成本,此阿勇了以中高速缓存的技术去减少这种时间成本.  ...

金字塔仓库管理软件

  • 2014-09-03 08:27
  • 2.56MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)