gdal中的工具gdaladdo.exe,可以为大多数支持的格式建立或者重建(内)金字塔,可以使用几种重采样算法来进行重采样操作。
一、gdaladdo使用说明
用法:
gdaladdo [-r {nearest,average,gauss,cubic,cubicspline,lanczos,average_mp,average_magphase,mode}]
[-ro] [-clean] [-q] [-oo NAME=VALUE]* [-minsize val]
[--help-general] filename [levels]
参数:
- -r : {nearest,average,gauss,cubic,cubicspline,lanczos,average_mp,average_magphase,mode} 重采样算法。默认nearest。
- -ro : 以只读模式打开文件,创建外金字塔文件(特别是GeoTIFF格式)。
- -clean : 移除金字塔数据。
- -q : 关闭进度显示。
- -b : 创建指定波段的金字塔。(如不指定,创建所有波段)
- filename : 要建立金字塔的文件名。
- levels : 要建立金字塔的层号的列表。(使用-clean,此选项忽略)
配置参数 :
- –config USE_RRD YES : 创建Erdast (.aux)的图像格式的金字塔文件,可以直接在Erdas中或ArcGIS中使用.
下面配置参数,仅GeoTIFF格式的外部金字塔时可用。
- –config COMPRESS_OVERVIEW {JPEG,LZW,PACKBITS,DEFLATE} : TIFF compression
- –config PHOTOMETRIC_OVERVIEW {RGB,YCBCR,…} : TIFF photometric interp.
- –config INTERLEAVE_OVERVIEW {PIXEL|BAND} : TIFF interleaving method
- –config BIGTIFF_OVERVIEW {IF_NEEDED|IF_SAFER|YES|NO} : is BigTIFF used
使用例子:
gdaladdo -r average abc.tif
gdaladdo -r average abc.tif 2 4 8 16
gdaladdo --config COMPRESS_OVERVIEW JPEG
--config PHOTOMETRIC_OVERVIEW YCBCR
--config INTERLEAVE_OVERVIEW PIXEL -ro abc.tif
二、java调用jdal.jar实现
jdal.jar 可以下载编译好的jar及dll。
主要调用Dataset的BuildOverviews方法即可。
MyCallback是一个处理的回调class,通过调用run方法通知处理进度。
import org.apache.log4j.Logger;
import org.gdal.gdal.*;
import org.gdal.gdalconst.gdalconstConstants;
/**
* 生成金字塔
*/
public class GDALBuildOverview {
private static final Logger logger = Logger.getLogger(GDALBuildOverview.class);
public static void main(String[] args) {
String fileName_tif = "D:\\test\\dem.tif";
gdal.AllRegister();
Dataset hDataset = gdal.Open(fileName_tif, gdalconstConstants.GA_ReadOnly);
if (hDataset == null) {
System.err.println("GDALOpen failed - " + gdal.GetLastErrorMsg());
System.exit(1);
}
int bandNum = hDataset.getRasterCount();
logger.info("RasterCount is " + bandNum);
hDataset.BuildOverviews("average", new int[]{2, 4, 8, 16}, new BuildCallback());
hDataset.delete();
gdal.GDALDestroyDriverManager();
logger.info("completed");
}
}
class BuildCallback extends ProgressCallback {
private static final Logger logger = Logger.getLogger(BuildCallback.class);
public BuildCallback() {
}
@Override
public int run(double dfComplete, String pszMessage) {
if (pszMessage != null) {
logger.info(String.format("%s", pszMessage));
}
System.out.print(String.format("%.2f%%\r", dfComplete * 100));
return 1;
}
}