整体思路
对栅格影像进行重采样用到的主要方法是gdal的内置方法gdal.ReprojectImage(),采样后的数据需要新生成一个栅格数据集进行保存
思路:
-
载入原始栅格,读取相关信息
包括投影信息,仿射变换六参数,波段信息,数据类型,驱动名称,影像分辨率,影像宽、高等
-
新建输出栅格数据集
根据获取到的原始栅格的相关信息,以及重采样的因子(采样前分辨率/采样后分辨率),新建一个栅格数据集。 在这一步,需要先根据重采样的因子计算出重采样后的栅格的尺寸大小,再进行Creat Creat之后给新建的栅格数据设定投影信息和六参数信息,这里的六参数需要写入重采样后的分辨率
-
进行重采样
gdal.ReprojectImage(dataset, outDataset, src_projection, dst_projection, gdalconstConstants.GRA_Cubic); dataset:输入数据集(要进行重采样的栅格) outDataset:输出数据集(重采样后的栅格) src_projection:源空间信息(输入数据集的空间信息) dst_projection:转换后的空间信息(如果只进行重采样,不进行重投影,则dst_projection=src_projection) gdalconstConstants.GRA_Cubic:重采样的方式(GRA_NearestNeighbour=0,GRA_Bilinear=1,GRA_Cubic=2,GRA_CubicSpline=3,GRA_Lanczos=4)
代码实现
/**
* 图像重采样
* @param inFilePath 输入栅格的路径
* @param outFilePath 重采样后生成的栅格的路径
* @param pixel 重采样的分辨率
* @return
*/
public static int resample(String inFilePath, String outFilePath,double pixel) {
//载入原始栅格
System.out.println("载入原始栅格");
Dataset dataset = gdal.Open(inFilePath, gdalconstConstants.GA_ReadOnly);
String projection = dataset.GetProjectionRef();//投影信息
double[] geoTransform = dataset.GetGeoTransform();//仿射变换参数
int width = dataset.GetRasterXSize();//影像的宽,高
int height = dataset.GetRasterYSize();
int bandCount = dataset.GetRasterCount();//波段数
int dataType = dataset.GetRasterBand(1).GetRasterDataType();//数据类型
String format = GetImgInfoOpt.getDriverName(dataset);//原始栅格是何种驱动
double p = GetImgInfoOpt.getPixel(dataset);
//创建输出栅格
System.out.println("创建输出栅格");
double resampleFactor = p/pixel;//重采样的比例
int outWidth = (int)Math.round(width*resampleFactor);//重采样后的影像的宽和高
int outHeight = (int)Math.round(height*resampleFactor);
Driver driver = gdal.GetDriverByName(format);
Dataset outDataset = driver.Create(outFilePath, outWidth, outHeight, bandCount, dataType);
if (outDataset == null) {
System.out.println("创建数据集【" + outFilePath + "】失败");
}
outDataset.SetProjection(projection);
geoTransform[1] = pixel;//重采样后的分辨率
geoTransform[5] = -pixel;
outDataset.SetGeoTransform(geoTransform);
//重采样(重投影方法里面可以选择重采样的方式)
System.out.println("开始重采样");
int result = gdal.ReprojectImage(dataset, outDataset, projection, projection, gdalconstConstants.GRA_Cubic);
outDataset.FlushCache();
return result;
}
public class GetImgInfoOpt {
//获取影像数据的驱动名称,如:GTiff
public static String getDriverName(Dataset dataset){
return dataset.GetDriver().getShortName();//缩写
// return dataset.GetDriver().getLongName();//全名
}
}