使用GDAL创建Erdas格式的金字塔
在使用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格式的金字塔相关推荐
- GDAL添加ECW格式支持
目录 GDAL添加ECW格式支持 ECW 下载ECW JPEG SDK 在Unix平台构建支持ECW的GDAL 二进制ECW SDK和GCC >= 5.1 在Linux上构建的教程 在Windo ...
- 使用OGR创建dxf格式矢量数据
使用OGR库创建DXF格式的数据和创建Shp格式的数据基本一样,代码除了注册驱动不一样之外,其他的完全一样. 需要注意的是,OGR创建DXF格式需要data文件夹下的head.dxf,所以首先要设置G ...
- GDAL创建图像提示Driver xxx does not support XXX creation option的原因
经常在群里有人问,创建图像的时候为什么老是提示下面的信息. CPLError: Driver GTiff does not support DCAP_CREATE creation option Wa ...
- GDAL读取Jpeg2000格式图像
JPEG-2000标准支持无损和有损压缩,并且支持单图像分量(如灰度图像)和多图像分量(如彩色图像).除了基本的图像压缩功能外,还支持其他的功能:1)对图像进行按精度或者按分辨率来渐进显示.2)感兴趣 ...
- MySql 创建utf-8格式的数据库
当我们使用MySql命令创建数据库的时候往往会出现插入的中文数据显示问号,那麽我们如何在创建数据库的时候就定义为中文编码utf-8呢??? 创建utf-8格式的数据库 CREATE DATABASE ...
- hive 导出json格式 文件_hive中创建hive-json格式的表及查询
在hive中对于json的数据格式,可以使用get_json_object或json_tuple先解析然后查询. 也可以直接在hive中创建json格式的表结构,这样就可以直接查询,实战如下(hive ...
- 40 FI配置-财务会计-固定资产-组织结构-创建屏幕格式规则
业务背景:创建屏幕格式规则 事务码: SPRO SPRO路径:SPRO->财务会计->资产会计核算->组织结构->资产类->创建屏幕格式规则 第1步,SPRO路径进入 第 ...
- Python XlsxWriter创建xlsx格式的Excel文件
简介 XlsxWriter是用来创建XLSX格式的Excel模块. 样例 import xlsxwriter# Create a workbook and add a worksheet.workbo ...
- mysql创建数据库utf_MYSQL创建utf-8格式的数据库_MySQL
bitsCN.com MYSQL创建utf-8格式的数据库 先mysql进入: Linux代码 GBK: create database test2 DEFAULT CHARACTER SET gbk ...
最新文章
- Linux下正则表达式和grep命令的使用
- leetcode day5 -- Reorder List Linked List Cycle II
- 阿里产品专家:高情商的技术人,如何做沟通?
- wdatepicker ajax传参,DatePicker在Ajax加载的页面中不起作用
- 如何从零开始制作智能桌宠?
- LeetCode 49. Group Anagrams
- ms-sql数据转成脚本
- 活跃在海底隧道的铁路“小蓝人”
- pic单片机 c语言开发环境,《PIC单片机开发环境入门》.pdf
- 中文字符:中国 的unicode/UTF-8/GBK编码
- sentry-前端应用监控工具
- 修改虚拟机ubuntu的ip地址
- python做表格教程_(0基础如何快速入门Python)python表格入门教程
- 初中数学抽象教学的案例_初中数学教学案例与反思
- 半闲居士 RGB-D slam代码编译总结
- Unity3D实现3D立体的圆环进度条(圆环百分比、圆环血条)
- 悟空问答python反爬_Python写个爬虫碰到反爬了,怎么办那就动手破坏它!
- selenium 远程调用浏览器
- winscp登录主机拒绝_winscp连接被拒绝怎么解决
- UE4 Spline的使用
热门文章
- 第2周第4课:set_uid、set_gid、stick_bit、软(硬)链接文件
- 洛谷——P2626 斐波那契数列(升级版)矩阵
- 陶哲轩实分析 习题 7.2.6 (嵌套级数)
- 崇拜的Unix大牛,记录之。
- [Javascript]怎么样让公告不间断的滚动显示
- python 从网络URL读取图片并直接处理的代码
- Visual Studio 2017 15.7预览版发布
- vue vuex vue-router后台项目——权限路由(超详细简单版)
- 全面梳理关系型数据库和 NoSQL 的使用情景
- MySQL集群系列2:通过keepalived实现双主集群读写分离