GDAL库中提供了一种内存文件格式——MEM。如何使用MEM文件格式,主要有两种,一种是通过别的文件使用CreateCopy方法来创建一个MEM;另外一种是图像数据都已经存储在内存中了,然后使用内存数据块来构造一个MEM。第一种方式比较简单,这里主要说明下第二种方式。
首先看看MEM的说明文档,地址为:www.gdal.org/frmt_mem.html。从里面我们可以看到MEM文件支持几乎所有的空间数据信息,包括投影,坐标,GCP,元数据等信息。下面就主要看看怎么从一个内存数据块来构造一个MEM文件。MEM文件的数据名称如下:
MEM:::option=value[,option=value...]
例如:
MEM:::DATAPOINTER=342343408,PIXELS=100,LINES=100,BANDS=3,DATATYPE=Byte,PIXELOFFSET=3,LINEOFFSET=300,BANDOFFSET=1
可以看到MEM文件名开头有MEM后接三个英文冒号(:::),解析来由一系列的选项=值的方式来组成,具体选项和说明如下:

  • DATAPOINTER:内存数据块的指针地址,指针地址使用长整形来进行表示。注意:指针地址与32位或者64位系统有关系,要注意对应关系。必填项
  • PIXELS:图像宽度。必填项
  • LINES:图像高度,行数。必填项
  • BANDS:波段数,默认为1。选填项
  • DATATYPE:数据类型的名称(如Byte,Int16等),可以通过函数GDALGetDataTypeName()来获取,默认为Byte。选填项
  • PIXELOFFSET:像素偏移量,以Byte为单位。选填项
  • LINEOFFSET:行偏移量,以Byte为单位。选填项
  • BANDOFFSET:波段偏移量,以Byte为单位。选填项

其中前三项为必填项,必须指定,其余五项为选填项,最后三项和RasterIO函数的最后三个参数的意思相同。
下面是一个简单的示例代码,主要作用就是从一个大图像中读取512*512的大小的图像,然后将读取出来的图像构造一个MEM文件,并将该文件存储为一个PNG图像出来。

void GDAL_MEM_Test()
{
GDALAllRegister(); // 打开原始图像
GDALDataset *pSrcDS = (GDALDataset*) GDALOpen("D:\\Data\\landsat\\p139r26_5t19900902_nn2.tif", GA_ReadOnly);
GDALRasterBand *pBand = pSrcDS->GetRasterBand(1); // 申请512*512大小的内存,用于存放像素值
unsigned char *pData = new unsigned char[512*512];
memset(pData, 0, 512*512); // 从2500,2500开始宽高均读取256个像素
pBand->RasterIO(GF_Read, 2500, 2500, 512, 512, pData, 512, 512, GDT_Byte, 0, 0); //使用读取出来的pData构造一个MEM数据集
//"MEM:::DATAPOINTER=342343408,PIXELS=100,LINES=100,BANDS=3,DATATYPE=Byte,PIXELOFFSET=3,LINEOFFSET=300,BANDOFFSET=1"
char aMemString[256] ={0};
//构造MEM的文件名
sprintf_s(aMemString, 256, "MEM:::DATAPOINTER=%d,PIXELS=%d,LINES=%d", pData, 512, 512); //打开MEM文件
GDALDataset *pMemDS = (GDALDataset*) GDALOpen(aMemString, GA_ReadOnly); GDALDriver *pDriver = GetGDALDriverManager()->GetDriverByName("PNG");
GDALDataset *pOutDS = pDriver->CreateCopy("D:\\Data\\landsat\\p139r26_5t19900902_nn2_sub.png", pMemDS, FALSE, NULL, NULL, NULL); GDALClose((GDALDatasetH) pSrcDS);
GDALClose((GDALDatasetH) pMemDS);
GDALClose((GDALDatasetH) pOutDS); delete []pData;
}

裁切的原始图像如下图所示,图中的红色区域大致为代码中读取出来的区域,右下角为鹰眼图。

 

下图是构造的MEM并输出的结果,可以看出图像的区域与上图中的红色区域中的一样。对于需要从图像中裁切一块数据除了使用RasterIO和Cereate方式之外,还可以使用MEM,比较方便,不需要复杂的代码即可完成工作;同时对于某些算法需要将数据做成一个临时文件放到磁盘上,然后再处理的情况,可以考虑使用这种方式,即不将数据写入磁盘,所有的数据都在内存中进行处理,可以很大程度上提高算法的效率。

需要注意的是,MEM文件大小是和你的系统内存大小有关系。如果使用32位程序的话,处理的数据保守估计不会超过2GB,如果是64位程序的话,只和你机器的内存大小有关系了。

GDAL中MEM格式的简单使用示例的更多相关文章

  1. django框架中form组件的简单使用示例:注册验证

    Django中form组件的三大特点: 1. 生成页面可使用的HTML标签 2. 对用户提交的数据进行初步校验    3. 保留上次输入内容 废话不多说,直接进入正题. 这是注册界面截图: 与上一篇a ...

  2. Java中XML格式的字符串4读取方式的简单比较

    Java中XML格式的字符串4读取方式的简单比较 1.java自带的DOM解析. import java.io.StringReader; import javax.xml.parsers.Docum ...

  3. Visual C++ 6.0中if..else..的简单用法和基本格式

    # include <stdio.h> int main (void) { float score; printf("请输入您的考试成绩:"); scanf(" ...

  4. 使用注解注入properties中的值的简单示例

    spring使用注解注入properties中的值的简单示例   1.在web项目的src目录下新建setting.properties的文件,内容如下: version=1 2.在spring的xm ...

  5. GDAL添加ECW格式支持

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

  6. Web Service简单入门示例

    Web Service简单入门示例     我们一般实现Web Service的方法有非常多种.当中我主要使用了CXF Apache插件和Axis 2两种. Web Service是应用服务商为了解决 ...

  7. PHP中关于foreach的简单的用法总结

    在php中使用循环方式输出数组里面的内容有好多种方式,我们既可以采用数组迭代循环的方式,当然也可以采用下面的foreach方法,日常开发中用到的最多就是它.下面我们就先看一下它的用法吧: //语法是: ...

  8. mybatis的sql中使用$会出现sql注入示例

    mybatis的sql中使用$会出现sql注入示例: 模拟简单登录场景: 页面代码: function login(){ //sql注入 var user = { username : "' ...

  9. Rapidjson的简单使用示例

    很早就想用用Markdown了,一直没机会.今天就来试一下 先放个目录: Rapidjson的简单使用示例 rapidjson官方教程 本示例所用环境 示例代码与注释 rapidjson官方教程 如果 ...

随机推荐

  1. 吐槽:【计算机网络与通信】.张元.高清文字版.pdf

    看了这本书的pdf,发现了一处错误,瞬间就不想再看了.新下载了谢希仁老师的<计算机网络>.

  2. python笔记六(函数的参数、返回值)

    一 调用函数 在写函数之前,我们先尝试调用现有的函数 >>> abs(-9) 9 除此之外,还有我们之前使用的len()等.可以用于数据类型转换的 int() float() str ...

  3. ELK学习记录一 :初识ELK

    ELK是elastic公司提供的一套完整的收集日志并分析展示的产品,分别表示Elasticsearch.Logstash和kibana. (官网截个图) 先来一段个人粗浅的认识: Elasticsea ...

  4. Java实验链接

    第1次实验 课堂实验内容:Java入门+Eclipse+PTA+Git+博客 实验任务书:第01次试验(安装JDK.编辑器.编写出第一个Java程序).pdf Eclipse简明教程(by郑如滨).p ...

  5. Linux 虚存 linux2.6内核特性

    一.大型页面的支持 当代计算机体系结构大都支持多种页面大小,例如,IA-32体系结构支持4KB或4MB的页面, Linux操作系统只是将大型页面用于映射实际的内核映像.大型页面的使用主要是为了改进高性 ...

  6. AsyncTask还要知道的一些知识

    在之前的博客中,对AsyncTask做过详细分析,而且也以小案例的形式,介绍如何基本的使用它.今天再来探讨它,更多的认识,尤其在面试中以下面方式回答,可能印象分更多一些. 面试题:讲一讲您对Async ...

  7. 高性能的Redis代理TwemProxy

    TwemProxy是一个Redis的中间件代理,具有很多有用的功能,可以暂时替代一部分Redis Cluster的功能: ²  支持和6479.之后相应地,配置好两个Redis实例并启动.现在就可以启 ...

  8. Linux动态频率调节系统CPUFreq之三:governor

    在上一篇文章中,介绍了cpufreq的core层,core提供了cpufreq系统的初始化,公共数据结构的建立以及对cpufreq中其它子部件提供注册功能.core的最核心功能是对policy的管理, ...

  9. Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52392430 前言:前一篇的mediaPlayer ...

  10. 04_关于元数据,ResultSetMetaData对象以及API方法介绍

     ResultSetMetaData对象 元数据,可以理解为数据的数据 Jdbc中的元数据是指数据库.表.列的定义信息. ResultSetMetaData对象表示结果集ResultSet对象的元 ...