最近来到新的环境里,分配的第一个任务是学习gdal,对不同地区、不同影响分辨率的tif图像重采样再剪切生成相同大小、分辨率的tif影像。我用的编译器是VS2010,环境配置请自行参考网上的教程,这里就不在讨论。
对于相同分辨率的遥感影像,很容易对相同像元进行处理,难得是对不同分辨率的影像处理。
强大的gdal当然封装了可用的方法来实现,聪明的你肯定想到了,RasterIO函数可以实现啊,RasterIO函数怎样使用,请转到李明录老师的博客,老师写的很详细。
下面贴上我自己写的函数,完全是源码,写的足够详细,也配有注释,不足是没有考虑效率问题,大家耐住性子看一看吧
// GDAl_ResampleAndCut.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "gdal_priv.h"
#include "ogrsf_frmts.h"
#include "gdalwarper.h"
#include <iostream>
using namespace std;
int gdalResample(vector <char*> pszSrcFile,vector<char*> pszOutFile)
{
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
int iCount = pszSrcFile.size();
pszSrcFile.resize(iCount);
int i=0;
int j=0;
vector<GDALDataset* > pDSrc;
pDSrc.resize(iCount);
for (i=0;i<iCount;i++)
{
pDSrc[i] = (GDALDataset*)GDALOpen(pszSrcFile[i],GA_ReadOnly);
}
pszOutFile.resize(iCount);
GDALDriver *poDriver=GetGDALDriverManager()->GetDriverByName("GTiff");
if (poDriver==NULL)
{
for ( j =0;j< iCount ; j++ )
{
GDALClose((GDALDatasetH)pDSrc[j]);
}
return -2;
}
int *width=new int[iCount];
int *heigh=new int[iCount];
int *nBandCount = new int[iCount];
GDALDataType *dataType = new GDALDataType[iCount];
double (*dGeoTrans)[6]=new double[iCount][6];
vector<char *> pszWKT;
pszWKT.resize(iCount);
for ( j = 0 ; j < iCount ; j++ )
{
dataType[j]=pDSrc[j]->GetRasterBand(1)->GetRasterDataType();
width[j]=pDSrc[j]->GetRasterXSize();
heigh[j]=pDSrc[j]->GetRasterYSize();
nBandCount[j]=pDSrc[j]->GetRasterCount();
pDSrc[j]->GetGeoTransform(dGeoTrans[j]);//获取放射变换系数
pszWKT[j] = const_cast<char*>(pDSrc[j]->GetProjectionRef());
}
//重采样到栅格单元的最大分辨率
//横向分辨率。。。
double maxX = dGeoTrans[0][1];
for (i = 0;i<iCount;i++)
{
if (maxX