一个小测试程序开发全过程实录,完全新手入门级的实例,如果你还在为处理大影像而发愁,来试试这个称手的工具吧。

Imagec 开发日记
2013-6-25

需求:

影像数据切割,重采样
数据切割的要求是简单的给予矩形的等分切割,并以2的幂次为分割单元,无需使用AOI裁切,
重采样需要实现多种采样模式,用户可以切换采样模式(下文中所提供的代码只是利用了RasterIO的一个特性使用了默认的最近邻重采样方法)

基本思路

考虑是否存在使实用的gdal接口,
自行设计,利用GDAL的读写接口完成数据输入输出工作
初步了解,GDAL并不提供现成的切割和重采样的接口。
/////////////////////////////////////////////////////////////////////
2013-6-26

确定使用自己的方法实现:

裁切

1、读入数据
2、设置剪切范围
3、完成裁切,将数据写入目标文件

2013-6-27

重采样

1.读入数据
2.借鉴Warp工具代码重写重采样代码
将数据写入目标文件

2013-6-28

重采样2

1.读入数据
2.使用RasterIO自带的重采样功能
3.数据写入目标文件

////////////////////////////////////////////////////////////////////////////
2013-6-27

实现算法

裁切:

读入文件
GDALDataset *poDataset;
GDALAllRegister();

//open a dataset
poDataset =(GDALDataset *)GDALOpen(fn,GA_ReadOnly);

if(poDataset == NULL)
设置相关参数为实现裁切做准备
char **papsOptions = NULL;
const int iXSize = poSrcDS->GetRasterXSize()/2;
const int iYSize = poSrcDS->GetRasterYSize()/2;
int iSize = GDALGetBandTypeSize(GDT_Byte)/8;
//生成一个用于存放数据的缓存空间
poDstDS = poDriver->Create(fnDst,iXSize,iYSize,3,GDT_Byte,papsOptions);
GByte *abyByte = new GByte[iXSize*iYSize*bandCount];
int bandMap[3] = {1,2,3};

const char *pszSRS_WKT = poSrcDS->GetProjectionRef();
poDstDS->SetProjection(pszSRS_WKT);
poDstDS->SetGeoTransform(adfGeoTransform);

//进行裁切工作,读取原始的数据,写入目标文件
poSrcDS->RasterIO(GF_Read,0,0,iXSize,iYSize,abyRater,
iXSize,iYSize,GDT_Byte,bandCount,bandMap,iSize*bandCount,iSize*iXSize*3,iSize);
poDstDS->RasterIO(GF_Write,0,0,iXSize,iYSize,abyRater,
iXSize,iYSize,GDT_Byte,bandCount,bandMap,iSize*bandCount,iSize*iXSize*3,iSize);
////////////////////////////////////////////////////////////////

//数据重采样实现:

打开数据
GDALDataset *SrcDS =  (GDALDataset *)GDALOpen(fn,GA_ReadOnly);

为RasterIO设置一些必要参数:

const char *strWkt =pSrcDS->GetProjectionRef();
int bandCount = pSrcDS->GetRasterCount();
int iSize = GDALGetDataTypeSize(GDT_Byte)/8;
int bandMap = {1,2,3};

double adfGeoTransform[6];
pSrcDS->GetGeoTransformation(adfGeoTransform);
double dProj[4] ={0};
ImageRowCol2Projection(adfGeoTransform,0,0,dProj[0],dProj[2]);//具体参考李明录重采样博文
ImageRowCol2Projection(adfGeoTransform,pSrcDS->GetRasterXSize(),pSrcDS->GetRasterYSize(),dProj[1],dProj[3]);
double maxX = dProj[0] >dProj[1]?dProj[0]:dProj[1];
double minX = dProj[0]<dProj[1]?dProj[1]:dProj[0];
double maxY = dProj[2]>dProj[3]?dProj[2]:dProj[3];
double minY = dProj[2]<dProj[3]?dProj[2]:dProj[3];

double fResX = 2;
double fResY = 2;
adfGeoTransform[0] = maxX;
adfGeoTransform[3] = maxY;
adfGeoTransform[1] = adfGeoTransform[1]/fResX;
adfGeoTransform[4] = adfGeoTransform[5]/fResY;

//得到输出图像长宽
int iNewWidth = static_cast<int>((maxX-minX)/ABS(adfGeoTransform[1]) + 0.5);
int iNewHeight = static_cast<int>((maxY-minY)/ABS(adfGeoTransform[5]) + 0.5);
GByte *abyraster2= new GByte[iNewWidth*iNewHeight*bandCount];
创建输出文件:
GDALDataset *pDstDS2 = poDriver->Create("good.img",
iNewWidth,iNewHeight,3,GDT_Byte,NULL);

设置输出数据的投影:
pDstDS2->SetGeoTransform(adfGeoTransform);
pDstDS2->SetProjection(strWkt);
使用RasterIO实现数据读写:(重采样全在这读写之间,参考第一篇文献的 第四种方式 一节)
pSrcDS->RasterIO(GF_Read,0,0,pSrcDS->GetRasterXSize(),pSrcDS->GetRasterYSize(),abyraster2,
iNewWidth,iNewHeight,GDT_Byte,bandCount,bandMap,iSize*bandCount,
iSize*iNewWidth*3,iSize);
pDstDS->RasterIO(GF_Write,0,0,iNewWidth,iNewHeight,GDT_Byte,bandCount,bandMap,iSize*bandCount,
iSize*iNewWidth*3,iSize);
完成读写后关闭打开的数据集,释放占用的内存
if(pDstDS != NULL)
{
GDALClose((GDALDatasetH)pDstDS2);
}
GDALClose((GDALDatasetH)pSrcDS);

报错实例

没有注册驱动导致数据读取失败
GDALAllRegister();
ERROR 4'../image/result.img' not recognized as a supported format.

投影问题
setGeoTransform 无法为输出图像计算一个投影

参考文献

GDAL源码剖析(七)之GDAL RasterIO使用说明

如何使用GDAL重采样图像

如何使用GDAL进行AOI裁剪

GDAL切割重采样遥感图像的更多相关文章

  1. 【Keras】基于SegNet和U-Net的遥感图像语义分割

    上两个月参加了个比赛,做的是对遥感高清图像做语义分割,美其名曰"天空之眼".这两周数据挖掘课期末project我们组选的课题也是遥感图像的语义分割,所以刚好又把前段时间做的成果重新 ...

  2. ENVI【遥感图像预处理之图像的几何校正】

    ---恢复内容开始--- 一.图像几何校正的概述 1.几何校正方法: 1)利用卫星自带的地理定位文件进行几何校正.主菜单>>>Map>>Georeference传感器的名 ...

  3. ArcGIS二次开发之读取遥感图像像素值的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 首先是读取遥感图像的R.G.B波段数据的做法.读取R.G.B波段数据的像素值主要通过IRaster接口的Read方法在 ...

  4. 从二进制数据流中构造GDAL可以读取的图像数据

    在很多时候,我们的图像数据往往都不是文件方式存储在磁盘上,而是可能从网络或者数据库中获取的是二进制的图像数据流.最简单的方式和最容易想到的方式就是将这个文件流保存到磁盘上形成一个文件,然后再使用GDA ...

  5. python实现分水岭算法分割遥感图像

    1. 定义 分水岭算法(watershed algorithm)可以将图像中的边缘转化为"山脉",将均匀区域转化为"山谷",在这方面有助于分割目标. 分水岭算法 ...

  6. 从二进制数据流中构造GDAL可以读取的图像数据(C#)

    在上一篇博客中,讲了一下使用GDAL从文件流中构造一个GDAL可以识别的数据来进行处理.原以为这个接口在C#中没有,仔细看了下GDAL库中源码,发现C#版本也有类似的函数,下面是GDAL库中的一个C# ...

  7. ostu进行遥感图像的分割

    城市地区道路网的简单的阈值分割.采用的是单ostu(最佳阈值分割)算法,废话少说,如果不太清楚该算法,请参考文献[1]中的图像分割这一章的介绍.程序直接运行的效果如下.

  8. 利用matlab自带函数graycoprops 实现基于共生矩阵的遥感图像纹理特征分析

    close all;clear all;clc;I = imread('yaogan2.jpg');HSV = rgb2hsv(I);Hgray = rgb2gray(HSV);% 计算64位灰度共生 ...

  9. GDAL利用地理坐标读取图像像元值

    最近的一个项目需要在电子海图中下载已知水深点,导出点的地理坐标(经纬度).然后在arcgis中打开这些地理坐标输出为shp,利用GDAL读取不同波段的点对应的像元值,从而构建水深和像元值的对应关系. ...

随机推荐

  1. poj2531

    看了一下0ms,16ms,100ms左右过了的代码,思维量对我来说比較大,不是非常easy理解. 我的作法: 用并查集算权值和. 用dfs枚举两个点集的全部可能,因为是全然图,枚举一半的点就可以. # ...

  2. bonjour

    首先bonjour并非必须的,可是它的确非常方便,假设没有它我们须要指定ip地址进行局域网的传输,有了它就能够依据服务的详细的名称来选择服务,能够这样来理解bonjour就相当于hostname,我们 ...

  3. ABAP 向上取整和向下取整 CEIL & FLOOR

    下面是一段关于CEIL 和 FLOOR 的代码 DATA:a TYPE mseg-menge, b TYPE mseg-menge, c TYPE mseg-menge. a = '1.36'. b ...

  4. Mac Python路径总结

    Mac 下Python 可以多版本的并存,并且Python的目录也有好几个,不过总体来说,Mac 自带的有python 还是比较方便的 Mac 系统自带的又Python ,可能Python版本需要更新 ...

  5. c#1所搭建的核心基础之值类型和引用类型

    这个主题很重要,在.NET中做的一切其实都是在和一个值类型或者引用类型打交道. 现实世界中的值和引用 假定你在读一份非常棒的东西,希望一个朋友也去读他.于是你到复印室里复印了一份.这个时候他获得了属于 ...

  6. poj 3082多边形相交 'Roid Rage

    题意是判断多边形是否相交 主要的思路就是判断每一个点是否在另外的多变形内 判断一个点是否在另一个多边形内主要思路是: 判断的那个点向左边做射线,如果射线与多边形的交点为奇数个则在多边形内,偶数个则不在 ...

  7. Javascript实现简单的富文本编辑器

    <span style="font-size:14px;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T ...

  8. spring mvc 接受多对象的处置

    spring mvc 接受多对象的处理 spring mvc感觉非常好用,尤其是对接收对象參数的自己主动绑定非常简便,但对于同一时候传多个对象时有些困扰. 同一时候项目并没有直接使用spring的fo ...

  9. J2EE开发框架搭建(2) - springmvc4 + spring4 + hibernate4 整合

    1. 打开hqhop-framework-parent项目下的pom.xml文件.加入springmvc4 , spring4 , hibernate4 ,以及数据源druid的依赖包,插件,依赖包版 ...

  10. HDU 3478 Play with Chain (Splay树)

    这种高级数据结构太难搞了.........现在还是先照着别人的代码敲,做模板..........慢慢花时间来弄懂 #include <iostream> #include <algo ...