Java调用GDAL命令进行插值分析的一种方法
一、写在文章前
二、关于插值分析
1.概念
从地理信息系统的范畴内来说,插值分析可以简单狭义理解为通过离散的点状矢量空间数据(或分隔文本)、通过数学公式来推测点以外的区域内的某个位置上的值。
2.应用场景
比较典型的应用有降雨量模拟分析、植物生长范围推测等。
3.方法
invdist 幂的反距离 invdistnn 使用最近邻搜索的幂的反距离 average 移动平均算法 nearest 最近邻算法 linear 线性插值算法
三、具体实现
1.命令行示例及解释
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。
<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)。
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地址: 也可以官网下载)中可以找到。
路径为/GDAL/swig/java/apps/GDALGrid.java
将GDALGrid.java到项目中,编译后,调用其main方法即可,gdal_grid参数依次放在agrs数组中即可。