一、写在文章前

从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是地理空间数据的类型。

文件结构如下:

java 线性规划如何给变量加范围_java 线性规划如何给变量加范围

以下官网对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数组中即可。