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中显示,就需要自...

gdal使用经验(一)影像读取-生成金字塔

1.关于rasterio ################################################################ 对于http://www.gdal.or...

使用gdal对图像建立金字塔

对图像建立金字塔,参考了李民录的博客,给出了一个可以直接粘贴就能运行的代码 // CreatePyramids.cpp : 定义控制台应用程序的入口点。 #define _AFXDLL #pragm...

GDAL-读取影像的金字塔,生成快视图

之前使用GDAL提取快视图时,使用的是直接读取原始影像的方式,但之前遇到一次原始影像有坏块的情况,无法读取,所以想试试通过读取金字塔来生成快视图   我觉得从原理上来说,这样也应该会更快一些,不过没有...

绘制金字塔

  • 2015年06月04日 17:03
  • 11KB
  • 下载

金字塔决策交易系统【免登录版】

  • 2017年09月29日 23:11
  • 32.28MB
  • 下载

【opencv学习】lucas金字塔光流算法的实现——基于opencv3.0+vs2013+windows10

1. 代码简介 程序平台:vs2013 opencv3.0 win10 安装与配置方法:http://blog.csdn.net/poem_qianmo/article/details/19809...

金字塔原理

  • 2013年11月08日 18:13
  • 332KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GDAL金字塔
举报原因:
原因补充:

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