在使用Erdas或者ArcGIS打开栅格图像的时候,会创建一个后缀名为rrd的金字塔文件,用于快速显示图像。那么在使用GDAL编写自己的图像算法后,像快速的在Erdas或者ArcGIS中显示,就需要自己创建rrd格式的金字塔文件,这样在打开该图像文件时,打开速度会非常快,在我的电脑上一个2G的img不到一秒钟可以全部加载进来。

查看GDAL中,有个gdaladdo的工具,就是一个专门用于创建金字塔文件的,但是默认的创建的是一个后缀名为ovr的金字塔文件,该种格式的金字塔不能被Erdas或者ArcGIS使用,但是可以在QGIS等使用。为了能够在Erdas中使用,在创建的时候需要指定一个选项,那就是 USE_RRD=YES,使用该选项后,创建的金字塔格式是一个aux文件,虽然后缀名不是rrd,但是该文件是可以被Erdas或者ArcGIS中使用的。

关于gdaladdo的使用帮助,可以参考网址:http://www.gdal.org/gdaladdo.html

Erdas的金字塔是按照2的次方来采样,金字塔顶层的大小应该是小于等于64*64,创建金字塔的,于是按照gdaladdo中的说明,其命令行参数应该是:

   gdaladdo --config USE_RRD YES airphoto.img 2 4 8 16 ...

最后的...表示采样级别,一直到最顶层的像元个数小于等于64*64结束。有了上面的知识,下面就给出我写的一个函数,用于创建金字塔。

/**
* @brief 创建金字塔
* @param pszFileName        输入的栅格文件
* @param pProgress          进度条指针
* @return 成功返回0
*/
int CreatePyramids(const char* pszFileName, LT_Progress *pProgress)
{if (pProgress != NULL){pProgress->SetProgressCaption("创建金字塔");pProgress->SetProgressTip("正在创建金字塔...");}GDALAllRegister();CPLSetConfigOption("USE_RRD","YES");    //创建Erdas格式的字塔文件/* -------------------------------------------------------------------- *//*      Open data file.                                                 *//* -------------------------------------------------------------------- */GDALDatasetH     hDataset;hDataset = GDALOpen( pszFileName, GA_ReadOnly );GDALDriverH hDriver = GDALGetDatasetDriver(hDataset);const char* pszDriver = GDALGetDriverShortName(hDriver);if (EQUAL(pszDriver, "HFA") || EQUAL(pszDriver, "PCIDSK")){GDALClose(hDataset);    //如果文件是Erdas的img或者PCI的pix格式,创建内金字塔,其他的创建外金字塔hDataset = GDALOpen( pszFileName, GA_Update );}if( hDataset == NULL ){if (pProgress != NULL)pProgress->SetProgressTip("打开图像失败,请检查图像是否存在或文件是否是图像文件!");return RE_NOFILE;}/* -------------------------------------------------------------------- *//*      Get File basic infomation                                       *//* -------------------------------------------------------------------- */int iWidth = GDALGetRasterXSize(hDataset);int iHeigh = GDALGetRasterYSize(hDataset);int iPixelNum = iWidth * iHeigh;    //图像中的总像元个数int iTopNum = 4096;                 //顶层金字塔大小,64*64int iCurNum = iPixelNum / 4;int anLevels[1024] = { 0 };int nLevelCount = 0;                //金字塔级数do    //计算金字塔级数,从第二级到顶层{anLevels[nLevelCount] = static_cast<int>(pow(2.0, nLevelCount+2));nLevelCount ++;iCurNum /= 4;} while (iCurNum > iTopNum);const char      *pszResampling = "nearest"; //采样方式GDALProgressFunc pfnProgress = GDALProgress;//进度条/* -------------------------------------------------------------------- *//*      Generate overviews.                                             *//* -------------------------------------------------------------------- */if (nLevelCount > 0 &&GDALBuildOverviews( hDataset,pszResampling, nLevelCount, anLevels,0, NULL, pfnProgress, pProgress ) != CE_None ){if (pProgress != NULL)pProgress->SetProgressTip("创建金字塔失败!");return RE_FAILD;}/* -------------------------------------------------------------------- *//*      Cleanup                                                         *//* -------------------------------------------------------------------- */GDALClose(hDataset);GDALDestroyDriverManager();if (pProgress != NULL)pProgress->SetProgressTip("创建金字塔完成!");return RE_SUCCESS;
}

需要说明的是,这段代码创建img格式和pix格式的金字塔会创建内金字塔,Erdas的img格式和PCI的pix格式可以把金字塔存放在文件内部。

PS:在给img文件创建内金字塔后,使用除ArcGIS9.2以外的软件打开后,都正常,但是使用ArcGIS9.2打开后会出现图层偏移的问题,不知道是否ArcGIS9.2的bug。ArcGIS10正常!ArcGIS9.3没有测试。

测试代码:

void main()
{LT_ConsoleProgress *pProgress = new LT_ConsoleProgress();int f = CreatePyramids("C://Work//Data//ttttt.img", pProgress);if (f == RE_SUCCESS)printf("计算成功/n");elseprintf("计算失败/n");delete pProgress;
}

测试:在使用ArcGIS10打开没有金字塔的文件时,提示:

运行测试代码:

再次打开刚才的文件,没有上面的提示对话框了,而且很快加载进来,说明已经有金字塔了,如果使用Erdas打开的话,可以看到详细的金字塔信息。不过可以试用QGIS查看金字塔信息。右侧的列表显示的是金字塔的级别,Erdas的金字塔是从第二级开始建立的,所以看到第一级的图标上有个红色的小叉叉。见下图:

转载于:https://www.cnblogs.com/xiaowangba/archive/2011/01/10/6314059.html

使用GDAL创建Erdas格式的金字塔相关推荐

  1. GDAL添加ECW格式支持

    目录 GDAL添加ECW格式支持 ECW 下载ECW JPEG SDK 在Unix平台构建支持ECW的GDAL 二进制ECW SDK和GCC >= 5.1 在Linux上构建的教程 在Windo ...

  2. 使用OGR创建dxf格式矢量数据

    使用OGR库创建DXF格式的数据和创建Shp格式的数据基本一样,代码除了注册驱动不一样之外,其他的完全一样. 需要注意的是,OGR创建DXF格式需要data文件夹下的head.dxf,所以首先要设置G ...

  3. GDAL创建图像提示Driver xxx does not support XXX creation option的原因

    经常在群里有人问,创建图像的时候为什么老是提示下面的信息. CPLError: Driver GTiff does not support DCAP_CREATE creation option Wa ...

  4. GDAL读取Jpeg2000格式图像

    JPEG-2000标准支持无损和有损压缩,并且支持单图像分量(如灰度图像)和多图像分量(如彩色图像).除了基本的图像压缩功能外,还支持其他的功能:1)对图像进行按精度或者按分辨率来渐进显示.2)感兴趣 ...

  5. MySql 创建utf-8格式的数据库

    当我们使用MySql命令创建数据库的时候往往会出现插入的中文数据显示问号,那麽我们如何在创建数据库的时候就定义为中文编码utf-8呢??? 创建utf-8格式的数据库 CREATE DATABASE ...

  6. hive 导出json格式 文件_hive中创建hive-json格式的表及查询

    在hive中对于json的数据格式,可以使用get_json_object或json_tuple先解析然后查询. 也可以直接在hive中创建json格式的表结构,这样就可以直接查询,实战如下(hive ...

  7. 40 FI配置-财务会计-固定资产-组织结构-创建屏幕格式规则

    业务背景:创建屏幕格式规则 事务码: SPRO SPRO路径:SPRO->财务会计->资产会计核算->组织结构->资产类->创建屏幕格式规则 第1步,SPRO路径进入 第 ...

  8. Python XlsxWriter创建xlsx格式的Excel文件

    简介 XlsxWriter是用来创建XLSX格式的Excel模块. 样例 import xlsxwriter# Create a workbook and add a worksheet.workbo ...

  9. mysql创建数据库utf_MYSQL创建utf-8格式的数据库_MySQL

    bitsCN.com MYSQL创建utf-8格式的数据库 先mysql进入: Linux代码 GBK: create database test2 DEFAULT CHARACTER SET gbk ...

最新文章

  1. Linux下正则表达式和grep命令的使用
  2. leetcode day5 -- Reorder List Linked List Cycle II
  3. 阿里产品专家:高情商的技术人,如何做沟通?
  4. wdatepicker ajax传参,DatePicker在Ajax加载的页面中不起作用
  5. 如何从零开始制作智能桌宠?
  6. LeetCode 49. Group Anagrams
  7. ms-sql数据转成脚本
  8. 活跃在海底隧道的铁路“小蓝人”
  9. pic单片机 c语言开发环境,《PIC单片机开发环境入门》.pdf
  10. 中文字符:中国 的unicode/UTF-8/GBK编码
  11. sentry-前端应用监控工具
  12. 修改虚拟机ubuntu的ip地址
  13. python做表格教程_(0基础如何快速入门Python)python表格入门教程
  14. 初中数学抽象教学的案例_初中数学教学案例与反思
  15. 半闲居士 RGB-D slam代码编译总结
  16. Unity3D实现3D立体的圆环进度条(圆环百分比、圆环血条)
  17. 悟空问答python反爬_Python写个爬虫碰到反爬了,怎么办那就动手破坏它!
  18. selenium 远程调用浏览器
  19. winscp登录主机拒绝_winscp连接被拒绝怎么解决
  20. UE4 Spline的使用

热门文章

  1. 第2周第4课:set_uid、set_gid、stick_bit、软(硬)链接文件
  2. 洛谷——P2626 斐波那契数列(升级版)矩阵
  3. 陶哲轩实分析 习题 7.2.6 (嵌套级数)
  4. 崇拜的Unix大牛,记录之。
  5. [Javascript]怎么样让公告不间断的滚动显示
  6. python 从网络URL读取图片并直接处理的代码
  7. Visual Studio 2017 15.7预览版发布
  8. vue vuex vue-router后台项目——权限路由(超详细简单版)
  9. 全面梳理关系型数据库和 NoSQL 的使用情景
  10. MySQL集群系列2:通过keepalived实现双主集群读写分离