GDAL切割重采样遥感图像
一个小测试程序开发全过程实录,完全新手入门级的实例,如果你还在为处理大影像而发愁,来试试这个称手的工具吧。
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切割重采样遥感图像的更多相关文章
- 【Keras】基于SegNet和U-Net的遥感图像语义分割
上两个月参加了个比赛,做的是对遥感高清图像做语义分割,美其名曰"天空之眼".这两周数据挖掘课期末project我们组选的课题也是遥感图像的语义分割,所以刚好又把前段时间做的成果重新 ...
- ENVI【遥感图像预处理之图像的几何校正】
---恢复内容开始--- 一.图像几何校正的概述 1.几何校正方法: 1)利用卫星自带的地理定位文件进行几何校正.主菜单>>>Map>>Georeference传感器的名 ...
- ArcGIS二次开发之读取遥感图像像素值的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 首先是读取遥感图像的R.G.B波段数据的做法.读取R.G.B波段数据的像素值主要通过IRaster接口的Read方法在 ...
- 从二进制数据流中构造GDAL可以读取的图像数据
在很多时候,我们的图像数据往往都不是文件方式存储在磁盘上,而是可能从网络或者数据库中获取的是二进制的图像数据流.最简单的方式和最容易想到的方式就是将这个文件流保存到磁盘上形成一个文件,然后再使用GDA ...
- python实现分水岭算法分割遥感图像
1. 定义 分水岭算法(watershed algorithm)可以将图像中的边缘转化为"山脉",将均匀区域转化为"山谷",在这方面有助于分割目标. 分水岭算法 ...
- 从二进制数据流中构造GDAL可以读取的图像数据(C#)
在上一篇博客中,讲了一下使用GDAL从文件流中构造一个GDAL可以识别的数据来进行处理.原以为这个接口在C#中没有,仔细看了下GDAL库中源码,发现C#版本也有类似的函数,下面是GDAL库中的一个C# ...
- ostu进行遥感图像的分割
城市地区道路网的简单的阈值分割.采用的是单ostu(最佳阈值分割)算法,废话少说,如果不太清楚该算法,请参考文献[1]中的图像分割这一章的介绍.程序直接运行的效果如下.
- 利用matlab自带函数graycoprops 实现基于共生矩阵的遥感图像纹理特征分析
close all;clear all;clc;I = imread('yaogan2.jpg');HSV = rgb2hsv(I);Hgray = rgb2gray(HSV);% 计算64位灰度共生 ...
- GDAL利用地理坐标读取图像像元值
最近的一个项目需要在电子海图中下载已知水深点,导出点的地理坐标(经纬度).然后在arcgis中打开这些地理坐标输出为shp,利用GDAL读取不同波段的点对应的像元值,从而构建水深和像元值的对应关系. ...
随机推荐
- python发送各类邮件的主要方法
更多详见: http://www.w3cschool.cc/python/python-email.html python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法 ...
- LLBL Gen Pro 5.0
LLBL Gen Pro 5.0 企业应用开发入门 Solutions Design 公司于2016年5月发布了LLBL Gen Pro 5.0,这个新版本的发布出乎于我的意料.我的猜想是从4.2升级 ...
- NM_CUSTOMDRAW 消息
When the control first starts to paint itself, in response to a WM_PAINT, you receive a NM_CUSTOMDRA ...
- 如何使用Gmail的别名功能?
Gmail真的是一个很好的邮箱,一直是我的最爱!它有一个很独特的功能-别名,用这个功能,我们就可以把一个 邮箱当成很多个邮箱来使用了! 1.Gmail 不提供传统别名 ,但是你可以收到发送到 your ...
- 关于WM_ERASEBKGND和WM_PAINT的深刻理解
一直以来,对于WM_PAINT和WM_ERASEBKGND消息不是很清楚,从书上和网上找了很多资料,大体上有以下几点说法:1>WM_PAINT先产生,WM_ERASEBKGND后产生 2.WM_ ...
- frame.bounds和center
CGPoint point=CGPoint(x,y); //表示位置 CGSize size=CGSzieMake(width,height); //表示大小 CGRect rect=CGRect ...
- 基础知识(10)- 部署应用程序和applet
10.1 JAR文件 10.1.1 清单文件 10.1.2 可运行JAR文件 10.1.3 资源 10.1.4 密封 10.2 Java Web Start 10.2.1 沙箱 10.2. ...
- .htaccess和license文件编写
1 .htaccess 1.1 文件的位置 默认情况下放置于根目录 1.2 .htaccess文件的编写 1.2.1 错误页面跳转 ErrorDocument + 错误码 + 跳转路径/提示文字 eg ...
- hdu 4704 同余定理+普通快速幂
此题往后推几步就可找到规律,从1开始,答案分别是1,2,4,8,16.... 这样就可以知道,题目的目的是求2^n%Mod的结果.....此时想,应该会想到快速幂...然后接着会发现,由于n的值过大, ...
- 【Demo 0011】多媒体播放器
本章学习要点: 1. 掌握AVAudioPlayer 基本使用; 2. 掌握AVPlayer 基本使用; 3. 掌握系统声音播放以及震动; 4. ...