GDAL的RASTERIO功能
为了能快速的显示大影像,最近一直在学习GDAL,GDAL确实是一个功能强大的开源库,其核心部分数据集和波段,下面这个图很详细的描述了它们之间的关系,还有其中的细节:
GDAL的RASTERIO功能非常强大,简短的一句话就能实现图像的显示,但也是这个简单函数,把我折腾的半死。在学习使用GDAL的过程中,非常感谢李林大哥和貟建明大哥,他们不厌其烦地解答我的疑问,提示关键性要点,使我在解决问题的过程中事半功倍。
我现在要把最近学习过程中的心得写下来,留给自己以后看看,也希望可以给新手们一点帮助!
const char* str ;
m_pDataset = (GDALDataset*) GDALOpen( str, GA_ReadOnly );
这一部分应该很好理解,首先打开一个影像,我们必须注册其驱动,因为每种不同的栅格数据都有不同的驱动,也就是driver。之后我们就可以用GDALOpen()函数来打开一个数据集dataset,如果打开的格式并不是GDAL支持的,我们就需要通过new GDALDriver()创建一个新的driver并设置,这样才能打开。如果GDALOpen()函数返回NULL,表示打开文件失败。
打开了一个dataset之后,我们就可以对dataset的内部信息进行操作,dtaset的详细信息以及内部的关系在上图表述的非常详细。
上面这行代码是用来获取仿射信息用的,m_AdfGeoTransform是一个含6个元素的数组,执行了这行代码后,我们就可以获取m_AdfGeoTransform数组的信息,m_AdfGeoTransform[0],m_AdfGeoTransform[3]是整个影像的坐下角坐标,m_AdfGeoTransform[1]是影像宽度上的分辨率,m_AdfGeoTransform[5]是影像高度上的分辨率,而对于m_AdfGeoTransform[2]和m_AdfGeoTransform[4]来说,如果影像是指北的,这两个参数的值为0。有了这几个参数,我们就能通过以下两行代码求出影像左下角和右上角的信息:
YMin = m_AdfGeoTransform[3];
YMax = m_AdfGeoTransform[3] + m_AdfGeoTransform[4] + nY * m_AdfGeoTransform[5];
有了影像的信息之后,我们要做的就是将影像显示出来,这里就有一个分辨率的问题,一个是图像分辨率,一个是显示分辨率。图像分辨率就是单位长度内的像素数,而显示分辨率就是把数字图像在输出设备(比如显示屏或打印机等)上能够显示的像素数目和所显示像素之间的点距。这两个分辨率在显示影像的时候非常有作用。弄清楚原理的东西确实是成功的基石!
然后就到了GDAL的核心部分了:
m_pDataset->RasterIO( GF_Read, xSrc, ySrc, xWidth, yHight, pBuffer, xBuf, yBuf,GDT_Byte, nBand, NULL, nBand, 0, 1 );
对于三个波段以上的影像,我们可以直接通过以上两行代码讲影像读入pBuffer这个内存,然后根据我们的需要,比如说OPENGL,我们就可以利用glDrawPixels( )这个函数直接显示出影像了。现在关键的地方就是RasterIO里面的几个参数了,对照GDAL官方的函数说明:
int nXOff,
int nYOff,
int nXSize,
int nYSize,
void * pData,
int nBufXSize,
int nBufYSize,
GDALDataType eBufType,
int nBandCount,
int * panBandMap,
int nPixelSpace,
int nLineSpace,
int nBandSpace
)
如果为GF_Read,则是将影像内容写入内存,如果为GF_Write,则是将内存中内容写入文件。
nXOff,nYOff,nXSize,nYSize这四个参数是用于影像的,nXOff,nYOff就是说我们要从影像的这个像素坐标开始取数据,nXSize,nYSize就是从影像上取数据的宽度和高度,也就是说要从影像上取出来的数据范围是(nXOff,nYOff)到(nXOff+nXSize,nYOff+nYSize)。如果我们要显示这个取出来的范围,我们就要把这个数据域写入缓存pData中,nBufXSize,nBufYSize即是这个缓存区的大小范围。
RasterIO这个函数只有这些说明,那我们在应用的时候就需要根据我们的实际需要计算,如果有一幅100M的影像,你想快速显示,那么这六个参数的设置就是关键,不过有一个前提条件就是这个影像是金字塔影像,这样你设置好了buffer的size,那么GDAL就会根据GDAL内部函数的实现过程,自动帮你完成缩放操作(把nXSize,nYSizen的数据缩放到BufXSize,nBufYSize的buffer里显示),而并不需要你去控制获取哪个overview,由于开始我并没有理解透这个函数的真正含义,在大影像的显示上走了很多弯路,自己去判断要读金字塔的第几层,以至于自己都把自己快搞崩溃了,这里要非常感谢李林大哥,呵呵,每个细节都给我讲的很详细,并且对于一些抽象的东西他也耐心的给我举些例子,加上自己的时间,最后终于明白了这个函数的原理所在。呵呵,在这里要真挚的感谢李大哥。
nBufXSize,nBufYSize这个缓存区的大小范围,决定了我们要在多大的屏幕范围显示你想显示的图像内容,因此我们要根据屏幕范围和缩放比例来计算这个buffer的size。
nPixelSpace表示一个像素所占byte大小,假如是24位的,那么一个像素就占3个字节,那么nPixelSpace = 3。nLineSpace表示一行所占大小,如果设为0的话,就默认为nBufXSize*nBufYSize。
nBandSpace为一个波段数据所占大小,如果设为0的话,就是以RRRGGGBBB这种形式存储,如果设为1的话,就是以RGBRGBRGB这种形式存储。
不过这个函数还是要自己试了才知道真正的意义,呵呵,希望新手少走我的弯路!!以后还会陆续添加自己的学习心得的,^_^Fighting!!!o(∩_∩)o...
GDAL的RASTERIO功能的更多相关文章
- GDAL中RasterIO函数(把文件读取为一个一维数组)和ReadBlock函数(读取栅格数据块)
CPLErr GDALRasterBand::RasterIO ( GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize, int nYSize, ...
- gdal读写图像分块处理(精华版)
一.gdal进行数据操作在安装好gdal后,即可调用gdal库中的函数.(需要包含的头文件:gdal_priv.h)1.打开数据集使用gdal库进行数据(影像)操作的第一步就是打开一个数据集.对于“数 ...
- gdal读写图像分块处理
转自赵文原文 gdal读写图像分块处理(精华版) Review: 用gdal,感觉还不如直接用C++底层函数对遥感数据进行处理.因为gdal进行太多封装,如果你仅仅只是Geotif等格式进行处理,IO ...
- GDAL指定自定义的金字塔目录
缘起 对于一般的遥感影像文件,金字塔文件默认都是与影像文件放在同一个目录下,金字塔文件名一般与源影像文件名相同,但后缀名不同.或者金字塔内建于影像内部,但这不是这里所涉及的. 在使用ArcGIS桌面版 ...
- GDAL库简介以及在Windows下编译过程
GDAL(Geospatial Data Abstraction Library,地理空间数据抽象库)是一个在X/MIT许可协议下的开源栅格空间数据转换库.官网http://www.gdal.org/ ...
- (数据科学学习手札143)为geopandas添加gdb文件写出功能
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,很多读者朋友跟随着我先前写作的 ...
- VS下的解决方案目录结构设置和管理
转载:http://blog.csdn.net/pl20140910/article/details/52074165 为了方便管理自己写的代码,也为了日后工作能方便的查找之前做过相同的代码,仿照某源 ...
- 栅格那点儿事(四E)
栅格金字塔 如果上面的部分都已经看过了,那么如何在ArcMap中更好的渲染一个栅格数据你已经知道了.可仅展示好一个栅格数据是不够的,我们还需要知道如何快速的展示一个栅格数据. 讲金字塔之前,先解释 ...
- 【C#】C#中使用GDAL3(一):Windows下超详细编译C#版GDAL3.3.0(VS2015+.NET 4+32位/64位)
转载请注明原文地址:https://www.cnblogs.com/litou/p/15004877.html 目录 一.介绍 二.编译准备 三.编译SQLite 四.编译LibTiff 五.编译PR ...
随机推荐
- python模范发送邮件的时候,才smtp.connect的时候总是抛出错误
python发送邮件的时候,总是出现:[Errno 10060] 错误码 根据debug得到在connect的时候出错. 认真检查了下host,没有错呀~应该就是服务器的host. 查看了下网上的一些 ...
- Oracle的几种索引
Oracle 提供了多种不同类型的索引以供使用.简单地说, Oracle 中包括如下索引: 1. B* 树索引 这些是我所说的 “ 传统 “ 索引.到目前为止,这是 Oracle 和大多数其他数据库中 ...
- Windows7里的“计算器”你真的会用吗?
“计算器”是不同Windows版本中的必备工具,虽然功能单一,但的确是人们日常工作中不可缺少的辅助工具,本文就来谈谈它的使用. 一.标准型和科学型两种面板 我们既可从Windows附件菜单中启动它,也 ...
- 源码编译安装 PHP5.5.0,解决curl_exec访问HTTPS返回502错误的问题(修改PATH路径)
最近碰到一个奇怪的问题, PHP使用 curl_exec 访问 HTTPS 网页时, 返回502错误, 访问HTTP网页时没有问题, 用 echo phpinfo() ; 查看, 支持op ...
- Asp.net管道 (第二篇)
从请求进入ASP.NET工作者进程,直至它到达最终的处理程序之前要经过一系列的步骤和过程,这个步骤和过程称为ASP.NET处理管道. Asp.net的处理管道流程如下: 语言描述如下: Asp.net ...
- VC6.0 显示代码行号和WndTab插件
VC6.0是一款比较稳定的功能强大的IDE,目前也有很多人在使用.但美中不足的是它不能像其他IDE那样显示行号. 这里需要用到一个插件VC6LineNumberAddin,下载地址:http://fi ...
- windows phone中,将crash report记录下来,写入文件,方便分析
APP出现crash(崩溃)总是不能忍的 当我们连接调试器调试的时候,发现每当APP崩溃的时候 程序都会走到App.xaml.cs中的 // Code to execute on Unhandled ...
- Types of Binary Tree
Complete Binary Tree According to wiki, A complete binary tree is a binary tree in which every level ...
- (转)ZOJ 3687 The Review Plan I(禁为排列)
The Review Plan I Time Limit: 5 Seconds Memory Limit: 65536 KB Michael takes the Discrete Mathe ...
- POJ 2263 Heavy Cargo(Floyd + map)
Heavy Cargo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3768 Accepted: 2013 Descr ...