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. AsyncLocal 与 async await

    大家来看一张图 先猜猜看为什么会这样 关于async await的原理 建议查看 https://blog.csdn.net/brook_shi/article/details/50803957 这篇 ...

  2. 日常实用css布局技巧汇总

    1.单行完整显示,多行省略显示. .box { width: 100px;  //必要 display: -webkit-box;    //必要 font-size: 14px; line-heig ...

  3. ACM Meteor Shower

    贝茜听到一场非同寻常的流星雨( meteor shower)即将来临;有报道称这些流星将撞击地球并摧毁它们所击中的任何东西.为了安全起见(Anxious for her safety), ,她发誓(v ...

  4. PHP If...Else 语句

    PHP If...Else 语句 条件语句用于根据不同条件执行不同动作. PHP 条件语句 当您编写代码时,您常常需要为不同的判断执行不同的动作.您可以在代码中使用条件语句来完成此任务. 在 PHP ...

  5. Docker Kubernetes 项目

    Kubernetes 是 Google 团队发起并维护的基于Docker的开源容器集群管理系统,它不仅支持常见的云平台,而且支持内部数据中心. 建于Docker之上的Kubernetes可以构建一个容 ...

  6. Nodejs 模块查找机制还不错(从当前目录开始逐级向上查找node_modules)

    比如 m.js是能够调用a.js的, 这样子目录就可以避免重复安装node_modules. 够用了.

  7. (二)ROS系统架构及概念 ROS Architecture and Concepts 以Kinetic为主更新 附课件PPT

    第2章 ROS系统架构及概念 ROS Architecture and Concepts PPT说明: 正文用白色,命令或代码用黄色,右下角为对应中文译著页码. 这一章需要掌握ROS文件系统,运行图级 ...

  8. Singular value decomposition

    SVD is a factorization of a real or complex matrix. It has many useful applications in signal proces ...

  9. pg备份恢复与设置编码

    psql create database jasygl encoding='UTF8' TEMPLATE = template0; 命令行 备份 pg_dump dabase_name > ba ...

  10. 豌豆夹Redis解决方案Codis安装使用

    豌豆夹Redis解决方案Codis安装使用 1.安装 1.1 Golang环境 Golang的安装非常简单,因为官网被墙,可以从国内镜像如studygolang.com下载. [root@vm roo ...