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构建金字塔

GDAL读取数据构建金字塔可以加速下一次读取,函数也很简单。 下面是我整理的GDAL构建金字塔函数,只需传入读取图像的地址和构建金字塔所显示的进度条即可。 #reg...
  • u011609113
  • u011609113
  • 2015年07月17日 21:19
  • 474

使用GDAL建立影像金字塔

gdal金字塔工具
  • wanliyun2009
  • wanliyun2009
  • 2010年11月14日 14:21
  • 8439

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

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

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

1.关于rasterio ################################################################ 对于http://www.gdal.or...
  • C_Bright
  • C_Bright
  • 2014年12月20日 15:34
  • 5319

gdal 图像金字塔

TIIF格式的影像并不能创建金字塔,创建之后数据都是0(至少我尝试的是这样)。 以下是创建代码:     const char      *pszResampling = "nearest"; /...
  • zyf19930610
  • zyf19930610
  • 2015年12月09日 17:10
  • 852

gdal 工具创建金字塔

http://www.gdal.org/gdaladdo.html 创建一个金字塔,嵌入到原文件中。 gdaladdo -r average strm_51_02.tif 2 4 8 16...
  • IvanLJF
  • IvanLJF
  • 2013年07月28日 15:26
  • 1498

GDAL读取图像文件,建立金字塔

       GDAL是遥感数据的IO处理库,可以读写erdas img、GeoTiff等多种文件格式。本文通过建立金字塔读取大数据量的文件(测试数据1.45GB,文件格式 img)。#include...
  • doncai
  • doncai
  • 2007年05月20日 20:15
  • 7205

VS2010 c#利用GDAL创建金字塔文件(金字塔文件包含在文件内部)

1、首先要配置工程环境,将编译好的9个dll文件放在debug目录下,将带有csharp的四个dll添加到引用;如下图: 2.添加命名空间:using OSGeo.GDAL 3、贴出代码:   us...
  • IvanLJF
  • IvanLJF
  • 2013年07月29日 12:44
  • 2248

QGIS中的金字塔机制优化

QGIS中快速建立金字塔
  • wanliyun2009
  • wanliyun2009
  • 2010年11月09日 20:50
  • 2916

gdal库对ENVI文件的一点支持不好

作者:朱金灿来源:http://blog.csdn.net/clever101            使用GDALOpen函数打开ENVI的img文件,如果使用更新的方式即GA_Update会改写对应...
  • clever101
  • clever101
  • 2014年01月09日 18:33
  • 2850
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GDAL金字塔
举报原因:
原因补充:

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