一、环境准备
Java开发环境下使用gdal.jar,必须要有对应操作系统的动态库才可以(windows是dll库,linux是so库),因为gdal是c++的源码编写的,底层实现都是c++语言,因此gdal.jar实际上最主要的是其中的native方法。
因此我们拿到gdal源码之后,需要通过编译Java库,来获取自己需要的动态库和jar,
好在Windows的jar库已经有组织帮我们编译好了,具体见https://www.gisinternals.com/
Linux下的需要我们自己编译,后续我会专门发一篇实际操作的文章,并亲测可用后,分享出来。
二、gdal读取tiff
gdal读取栅格tiff,主要有以下几步,详见代码如下:
package org.java.gdal.test;
import org.apache.commons.lang3.StringUtils;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.ProgressCallback;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;
import java.util.Arrays;
public class GdalReadTifTest {
/**
* 必须注册
*/
static{
gdal.AllRegister();
}
private static final String FILE_PATH = "F:\\Gis开发\\数据\\raster\\tiff\\world.tif";
public static void main(String[] args) {
readTif(FILE_PATH);
}
private static void readTif(String file){
Dataset dataset = gdal.Open(file, gdalconstConstants.GA_ReadOnly);
//获取到六参数数组
double[] ori_transform = dataset.GetGeoTransform();
//最小x
double minX = ori_transform[0];
//x方向分辨率
double resoutionX = ori_transform[1];
//x方向旋转角度
double angleX = ori_transform[2];
//最大y
double maxY = ori_transform[3];
//Y方向旋转角度
double angleY = ori_transform[4];
//y方向分辨率
double resoutionY = ori_transform[5];
//x方向的像素数
int pixelX = dataset.getRasterXSize();
//y方向像素
int pixelY = dataset.getRasterYSize();
}
}
三、gdal生成金字塔
如果是安装版本的gdal工具,则可以使用gdaladdo.exe工具类实现,具体详见:https://www.osgeo.cn/gdal/programs/gdaladdo.html。
Java代码操作主要是这个方法:
public int BuildOverviews(String resampling, int[] overviewlist, ProgressCallback callback) { return gdalJNI.Dataset_BuildOverviews__SWIG_0(swigCPtr, this, resampling, overviewlist, callback); }
-
其中参数resampling 重采样方法
nearest 临近采样
average 计算所有非NODATA贡献像素的平均值。从gdal3.1开始,这是一个加权平均值,适当地考虑了源像素的权重对目标像素的影响
bilinear 应用双线性卷积核。
-
参数overviewlist
Int[]{2,4,6,8,16} 比如2就是基础层分辨率的1/2,以此类推。
-
参数ProgressCallback
生成金字塔的回调函数,一般重写其中的run()方法,用来处理进度、
具体操作代码见
package org.java.gdal.test; import org.apache.commons.lang3.StringUtils; import org.gdal.gdal.Dataset; import org.gdal.gdal.ProgressCallback; import org.gdal.gdal.gdal; import org.gdal.gdalconst.gdalconstConstants; import java.util.Arrays; public class GdalReadTifTest { /** * 必须注册 */ static{ gdal.AllRegister(); } private static final String FILE_PATH_1 = "F:\\Gis开发\\数据\\raster\\xian18.tif"; public static void main(String[] args) { buildOverview(FILE_PATH_1); } private static void buildOverview(String file){ Dataset dataset = gdal.Open(file, gdalconstConstants.GA_ReadOnly); //调用构建金字塔接口 dataset.BuildOverviews("nearest",new int[]{2,4,6,8,16},new buildOverViewCallBack()); } //进度回调 static class buildOverViewCallBack extends ProgressCallback{ @Override public int run(double dfComplete, String pszMessage) { if (StringUtils.isNotBlank(pszMessage)){ System.out.println(pszMessage); } System.out.println(String.format("%.2f",dfComplete*100)); return 1; } } }
好了,以上就是gdal的简单操作,后面还会持续研究java的gdal版本的api操作。