利用GDAL从内存中直接解析图像数据
对于网络数据源,调度中可以把数据写入本地,然后读取本地数据格式进行影像的解析(地形有时候也用tif等格式)。
此种方式会每次调度进行不必要的IO开销和时间花费。
GDAL提供了相应的接口,直接从内存中解析数据,避免了磁盘写入和读取操作。具体步骤是:
(1)利用内存中的二进制数据流创建对应的内存文件 即 从 Buffer 创建 memory "file",这里的内存文件路径是位于GDAL自定义的虚拟文件目录 /vsimem/下。
(2)和解析本地文件一样,利用GDALOpen 读取内存文件。
//通过读取本地文件,产生二进制数据流 buffer、size
FILE* pFile = fopen("D:\\data\\1.tif","rb");
fseek(pFile,0,SEEK_END);
int size = ftell(pFile);
rewind(pFile); GByte * buffer = new GByte [size];
fread(buffer,1,size,pFile);
fclose(pFile); //利用二进制流创建内存文件
VSIFCloseL(VSIFileFromMemBuffer("/vsimem/work",buffer,size,FALSE)); //像打开本地文件一样,利用GDALopen 打开内存文件
GDALAllRegister();
GDALDataset* readDS = (GDALDataset*)GDALOpen("/vsimem/work",GA_ReadOnly);
//释放 内存文件
VSIUnlink("/vsimem/work"); int width = readDS->GetRasterXSize();
int height = readDS->GetRasterYSize();
int bandCount = readDS->GetRasterCount();
float* data = new float[width*height*bandCount];
if (readDS->RasterIO(GDALRWFlag::GF_Read,0,0,width,height,data,width,height,GDT_Float32,bandCount,NULL,0,0,0)==CE_Failure)
{
GDALClose(readDS);
//释放二进制数据流
delete[] buffer;
buffer = NULL; delete[] data;
data = NULL;
} GDALClose(readDS);
delete[] buffer;
buffer = NULL;
//现在只需操纵data就好,用完释放
delete[] data;
data = NULL;
这也正好说明,创建的内存文件 "/vsimem/work" 没有重新分配内存保存图像数据块,而是指向二进制数据流 buffer。
参考:
http://cryolite.iteye.com/blog/358929
http://blog.csdn.net/liminlu0314/article/details/40209357
http://www.gdal.org/cpl__vsi_8h.html#af9c1b931449d423e7a80bacb75ff0717
利用GDAL从内存中直接解析图像数据的更多相关文章
- 使用dom4j中SAXReader解析xml数据
public ApiConfig(String configFilePath) throws DocumentException{ SAXReader reader = new SAXReader() ...
- Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件
前言 上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤. 受限制 因为直接配置sample的vi比较麻烦 ...
- cocos2d-x 中XML解析与数据存储
一不小心就玩了一周的游戏了.哎.玩的时候时间过得总是这么快... 于是今天决定看一下之前不怎么非常熟悉的XML;(之前做游戏时数据的储存用到过XML,但这块是还有一个同事在做,所以不怎么熟悉), 看了 ...
- C#中怎么解析JSON数据,并获取到其中的值?
[1]首先我们根据创建一个json字符转 string json = @"[{'phantom':true,'id':'20130717001','data':{'MID':1019,'Na ...
- js中读取解析json数据
在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键. JSON字符串: 'var str1 = ' ...
- OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式
以最简单的4 x 5三通道图像为例,其在内存中Mat类型的数据组织形式如下: 每一行的每一列像素的三个通道数据组成一个一维数组,一行像素组成一个二维数组,整幅图像组成一个三维数组,即: Mat.dat ...
- 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...
- 数据在内存中的存储方式( Big Endian和Little Endian的区别 )(x86系列则采用little endian方式存储数据)
https://www.cnblogs.com/renyuan/archive/2013/05/26/3099766.html 1.故事的起源 “endian”这个词出自<格列佛游记>.小 ...
- OpenCV中IplImage图像格式与BYTE图像数据的转换
最近在将Karlsruhe Institute of Technology的Andreas Geiger发表在ACCV2010上的Efficent Large-Scale Stereo Matchin ...
随机推荐
- 一步一步教你使用 LSMW 批量处理数据
保存退出 输入完后,保存退出
- linux安装应用程序
实验:为 Linux 主机安装应用程序 环境:vmware workstation 14 . redhad-server-6.4 需求:1.使用 RPM 包的方式安装 Mozilla Firef ...
- Java的GC
垃圾收集 在探究Jvm的过程中,有两个点特别需要关注,一是:内存的使用,分配策略,而这一点是在前一篇博客已经介绍过了. 二是:内存的回收.也就是这一篇博客所要探究的关键点. 内存回收需要关注的几个点: ...
- 使用ggbio在R中制作弦图
分享一个制作弦图的R包:ggbio. 以下是一个简单的使用实例,效果图和代码如下. library(GenomicRanges) set.seed(1) N <- 100 gr <- GR ...
- ubuntu 下 重启 mongo 后 遇到蛋疼问题。
以后,切忌 mongo 正常关闭后 ,再重启ubuntu. 否则后果这是很严重. 2014.8.6日 PM 6点. 网站莫名打不开了,全部是空白,又是老问题. 幸亏 及时发现,那就重启下. 蛋疼,重启 ...
- Android 开发工具类 24_getHtml
获取网页(JSP)源码 import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; impo ...
- 【原】SPARK_MEM和SPARK_WORKER_MEMORY的区别
SPARK_MEM:设置每个Job(程序)在每个节点可用的内存量:(默认为512m) SPARK_WORKER_MEMORY:设置集群中每个节点分配的最大内存量:(默认为内存总量减去1G)
- manjaro i3 sound soft
sudo pacman -S pavucontrol sudo pacman -S pulseaudio # 为了启动 fcitx 输入法…… #exec --no-startup-id LANG=& ...
- python:rs, ws, es = select.select(inputs, [], []) --报错error 10022
昨晚折腾的1个多钟,直到3点多才睡,感觉自己也是热爱代码了,敲3个多钟一点也不累(其实是为了凌晨6点起来抢票回家了^_^) 练习python中select进行异步通信-防止socket.recv方法阻 ...
- Go 单元测试、基准测试、并发基准测试
一.单元测试 要开始一个单元测试,需要准备一个 go 源码文件,在命名文件时需要让文件必须以_test结尾. 单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以Test为前缀,例如: fu ...