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读取不同波段的点对应的像元值,从而构建水深和像元值的对应关系. ...
随机推荐
- Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就 ...
- JS - 6款鼠标悬停效果
下载地址:http://www.lanrentuku.com/js/tupian-1093.html
- ASP.NET - 上传图片方法(单张)
/// <summary> /// 上传图片 /// </summary> /// <param name="fileupload">上传的控件 ...
- [置顶] Java字节码文件剖析
Java为什么能够支持跨平台,其实关键就是在于其*.class字节码文件,因为*.class字节码文件有一个统一标准的规范,里面是JVM运行的时需要的相关指令,各家的JVM必须能够解释编译执行标准字节 ...
- exception in thread main java.lang.NoClassDefFoundError wrong name解决方法
当不含包层次的HelloWorld.java代码(此时程序运行正常) public class HelloWorld{ public static void main(String[] args) ...
- SQL--存储过程+触发器 对比!
一.存储过程 一:存储过程:存储过程是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中. 可以用存储过程名字和参数来调用存储过程,这样可以避免代码重复出现,用起来也方便. 例: 下面 ...
- CentOS 如何修改mysql 用户root的密码
源地址:http://blog.sina.com.cn/s/blog_6756f85201019zv7.html 第一步:用帐号登录mysql[root@CentOs5 ~]# mysql -u ro ...
- 利用PHP SOAP扩展实现简单Web Services
原文:利用PHP SOAP扩展实现简单Web Services WebServices能干什么? WebServices 可以将应用程序转换为网络应用程序. 通过使用 WebServices,您的应用 ...
- 论javascript模块化的优缺
如今backbone.emberjs.spinejs.batmanjs 等MVC框架侵袭而来.CommonJS.AMD.NodeJS.RequireJS.SeaJS.curljs等模块化的JavaSc ...
- IT痴汉的工作现状16-职业发展
回首多年来的工作经历.发现自己的职业发展真是太平庸只是了.就像我的名字张伟,平淡无奇.而我,还是几年前刚入职模样的我,仍然像个涉世未深的矛头小子,相信技术能够改变世界.真是一入IT深似海,为伊消得人憔 ...