一、写在文章前
从GDAL的官网可知,GDAL关于java的文档相对较少。作者根据官网上的信息,想到了调用命令行的方法,解决了批量插值分析的需求。在此仅介绍了如何用“命令行的方式”调用GDAL的有关程序进行反距离加权等方法的插值分析。愚以为本文只适用于数据分析、或简单地实现通用插值分析功能。若有个性化较强的需求,还需要对源代码深入研究,理解后再自行编码。
二、关于插值分析
1.概念
从地理信息系统的范畴内来说,插值分析可以简单狭义理解为通过离散的点状矢量空间数据(或分隔文本)、通过数学公式来推测点以外的区域内的某个位置上的值。
2.应用场景
比较典型的应用有降雨量模拟分析、植物生长范围推测等。
3.方法
作者知道的插值分析方法有线性、双线性、薄板样条、移动平均、趋势面分析、泰森多边形等等,每种插值的方法都有其使用场景。GDAL提供了gdal_grid来完成插值分析,它可以从从分散的数据创建规则网格,根据文档目前有5中插值分析方法:
invdist 幂的反距离
invdistnn 使用最近邻搜索的幂的反距离
average 移动平均算法
nearest 最近邻算法
linear 线性插值算法
三、具体实现
1.命令行示例及解释
关于gdal_grid的参数解释,详细可以参考原文 (gdal_grid.html),这里列举一种常用的参数组合并解释:
gdal_grid -zfield "rain" -a invdist:power=2.0 -txe 87.78 90.02 -tye 30.28 31.54 -tr 0.01 0.01 -of GTiff -ot Float64 -l rainTest rain.vrt rain.tiff
以上命令中gdal_grid是程序名。
-zfield是指定了使用名字为rain的字段来分析。
invdist:power=2.0是指定了插值方法及其参数。
-txe 87.78 90.02是指定X坐标范围为87.78至90.02度。
-tye 30.28 31.54是指定Y坐标范围为30.28至31.54度。
-tr 0.01 0.01是指定输出栅格的分辨率为0.01度。
of GTiff 指定输出栅格格式是GTiff。
-ot Float64 指定输出栅格值为Float64
-l rainTest 指定用于分析的图层为rainTest(本文基础数据是ShapeFile,所以需要和文件名保持一样)
rain.vrt rain.tiff 输入文件路径为rain.vrt,输出路径为rain.tiff。
需要注意的是gdal_grid不能直接读取矢量图层,需要通过虚拟格式(VRT)文件来读取,文件详解可以参考原文(VRT – Virtual Format — GDAL documentation),这里使用的rain.vrt的文件内容如下:
<OGRVRTDataSource>
<OGRVRTLayer name="rainTest">
<SrcDataSource>rainTest.shp</SrcDataSource>
<GeometryType>wkbPoint</GeometryType>
</OGRVRTLayer>
</OGRVRTDataSource>
SrcDataSource是矢量文件的相对路径。GeometryType是地理空间数据的类型。
文件结构如下:
以下官网对invdist的参数解释(即我们理解的反距离加权法)
power
: 幂的权重(默认为2.0)smoothing
: 平滑参数(默认 0.0)radius1
: 搜索椭圆的第一个半径(如果旋转角度为 0,则为 X 轴)。 将此参数设置为零以使用整个点数组。 默认值为 0.0。radius2
: 搜索椭圆的第二个半径(如果旋转角度为 0,则为 Y 轴)。 将此参数设置为零以使用整个点数组。 默认值为 0.0。angle
: 搜索椭圆旋转的角度,以度为单位(逆时针,默认 0.0)。max_points
: 要使用的最大数据点数。 不要搜索比这个数字更多的点。 这仅在设置了搜索椭圆时使用(两个半径都非零)。 零意味着使用所有找到的点。 默认值为 0。min_points
: 要使用的最小数据点数。 如果发现的点数量较少,则认为网格节点为空,并将用 NODATA 标记填充。 这仅在设置了搜索椭圆时使用(两个半径都非零)。 默认值为 0。nodata
: NODATA 标记填充空点(默认 0.0)。
本文以invdist为例,使用其余方法,需要先理解其原理及参数意义,关于插值参数的解释可以参考原文(gdal_grid.html)。
2.调用
1)可以用Runtime来调用命令行程序
public void execute(String command) throws Exception {
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream(), "UTF-8"));
String line = null;
while ((line = input.readLine()) != null) {
System.out.println(line);
}
int exitValue = pr.waitFor();
System.out.println("Exited with error code " + exitValue);
}
execute方法的command参数填写编辑好的gdal_grid命令。
2)可以调用GDALGrid类的main方法
这个类在GDAL的源码(git地址:https://github.com/OSGeo/gdal.git 也可以官网下载Download — GDAL documentation)中可以找到。
路径为/GDAL/swig/java/apps/GDALGrid.java
将GDALGrid.java到项目中,编译后,调用其main方法即可,gdal_grid参数依次放在agrs数组中即可。