java版GDAL学习之路—影像重采样

整体思路

对栅格影像进行重采样用到的主要方法是gdal的内置方法gdal.ReprojectImage(),采样后的数据需要新生成一个栅格数据集进行保存
思路:

  1. 载入原始栅格,读取相关信息

    包括投影信息,仿射变换六参数,波段信息,数据类型,驱动名称,影像分辨率,影像宽、高等
    
  2. 新建输出栅格数据集

    根据获取到的原始栅格的相关信息,以及重采样的因子(采样前分辨率/采样后分辨率),新建一个栅格数据集。
    在这一步,需要先根据重采样的因子计算出重采样后的栅格的尺寸大小,再进行Creat
    Creat之后给新建的栅格数据设定投影信息和六参数信息,这里的六参数需要写入重采样后的分辨率
    
  3. 进行重采样

    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();//全名
    }
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值