需求:对tiff文件进行按经纬度范围裁剪,在内存中裁剪,而gdal.Warp只能根据输入的shp文件进行裁剪。
网上很多对影像数据进行裁剪是用in_band.ReadAsArray(offx, offy, xsize, ysize)把数据读到内存,再用out_ds.GetRasterBand(1).WriteArray(out_band)将数据写到新的dataset,再用gdal.Translate出图,但是查了官方文档,ReadAsArray和WriteArray两个方法只有python才有,java没有这两个方法,java只能用ReadRaster和WriteRaster按行读写,这样效率极低。由于影像数据tiff一般都很大,所以急需一种效率高的影像裁剪方法。
经研究,gdal.Translate提供"-projwin"参数来指定左上角和右下角的坐标,"-projwin_srs"参数对裁剪坐标进行坐标转换,"-outsize"参数对影像进行像素压缩,直接上代码:
// 使用Translate出图
Vector vector = new Vector();
vector.add("-of");
vector.add("PNG");
vector.add("-ot");
vector.add("Byte");
vector.add("-scale");
vector.add("-outsize");
vector.add(sizeX);
vector.add(sizeY);
vector.add("-projwin");
vector.add(bbox.getXMin()+"");
vector.add(bbox.getYMax()+"");
vector.add(bbox.getXMax()+"");
vector.add(bbox.getYMin()+"");
if (StringUtils.hasText(bboxSR)){
vector.add("-projwin_srs");
vector.add("EPSG:"+bboxSR);
}
TranslateOptions options = new TranslateOptions(vector);
gdal.Translate(output,ds,options);