java调用GDAL实现栅格数据的重采样的一种方法

news/2024/12/29 16:57:16/

目录

1.关于重采样

1.1概念

1.2用途

1.3常见算法

2.关于GDAL

2.1GDAL中的重采样算法 

3.实现重采样

3.1思路

3.2完整代码

3.3使用QGIS验证效果


1.关于重采样

1.1概念

重采样是以原始图像的像元值或者导出的值填充到新的图像的每个像元的的过程。

1.2用途

在地理信息栅格数据的处理中有着比较重要的用途,如地图制图中不同比例尺下需要有不同 的分辨率显示;在卫星遥感影像的数据的处理中,重采样也是必不可少的一个环节;在空间分析时,保持不同来源的数据的分辨率一致也是必要的操作。

1.3常见算法

重采样常用的算法有:邻近点插值、双线性插值、三次卷积插值等。他们各自有其应用场景。这里暂时不对这些算法展开深入讨论。

2.关于GDAL

GDAL的Warp程序不仅能实现栅格数据的重投影和镶嵌,也可以实现栅格数据的重采样。本文简单介绍一个使用java调用GDAL的API实现栅格数据的重投影的方法。 

2.1GDAL中的重采样算法 

根据GDAL的文档介绍,其支持的重采样算法有以下类型:

near为邻近点插值,它是将最近的原始像元值赋值给新像元。

bilinear为双线性插值,它是通过4个相邻像元的距离加权平均值估算新像元值的方法。

cubic为三次卷积插值,它是通过16个相邻像元的距离加权平均值估算新像元值的方法。

其他方法暂时不介绍。

3.实现重采样

3.1思路

在GDAL的java绑定库中,gdal.Warp允许传入Dataset、Dataset[]、WarpOptions对像作为入参来进行调用,结合GDAL中对C语言的GDALWarp函数的描述文档,再经过验证,可以确认Dataset为要输出的栅格数据集,Dataset[]是输入的栅格数据集,包含原栅格和要输出的栅格。

  public static int Warp(Dataset dstDS, Dataset[] object_list_count, WarpOptions warpAppOptions) {return gdalJNI.Warp__SWIG_2(Dataset.getCPtr(dstDS), dstDS, object_list_count, WarpOptions.getCPtr(warpAppOptions), warpAppOptions);}

根据上述参数,我们可以根据输入文件路径读取源文件为Dataset,根据输出文件路径创建Dataset,创建一个Vector对象来构建WarpOptions,Vector的内容按照gdalwarp命令行程序的参数要求来输入,最后调用gdal.Warp来给新创建的数据集填充数据,填充数据后保存即可。

以下代码是对上述文字描述的代码的一个示例(省去了创建数据集的代码)。

        Vector<String> vector = new Vector<>();vector.add("-r");vector.add("bilinear");//执行双线性插值法重采样WarpOptions warpOptions = new WarpOptions(vector);gdal.Warp(datasetWarp, new Dataset[]{dataset}, warpOptions);

3.2完整代码

以下代码是一个完整的方法,输入要重采样的栅格数据的路径文本、要输出的栅格数据的路径文本、输入东西、南北方向的分辨率,其中南北方向的分辨率需要输入负数。

 /*** 对栅格重采样** @param inputPath  输入的栅格路径* @param outputPath 输出的栅格路径* @param r1         东西方向像元大小(地图单位)* @param r2         南北方向像元大小(地图单位)*/public static void reSample(String inputPath, String outputPath, double r1, double r2) {// 打开输入栅格文件Dataset dataset = gdal.Open(inputPath, gdalconst.GA_ReadOnly);double[] gt1 = dataset.GetGeoTransform();int xSize = new Double(dataset.getRasterXSize() * gt1[1] / r1).intValue();int ySize = new Double(dataset.getRasterYSize() * gt1[5] / r2).intValue();ySize = Math.abs(ySize);double[] gt2 = {gt1[0], r1, 0.0, gt1[3], 0.0, r2};Driver driver = gdal.GetDriverByName("GTiff");Dataset datasetWarp = driver.Create(outputPath, xSize, ySize, gdalconst.GA_Update, gdalconst.GDT_Float32);datasetWarp.SetGeoTransform(gt2);datasetWarp.SetSpatialRef(dataset.GetSpatialRef());Vector<String> vector = new Vector<>();vector.add("-r");vector.add("bilinear");//执行双线性插值法重采样WarpOptions warpOptions = new WarpOptions(vector);gdal.Warp(datasetWarp, new Dataset[]{dataset}, warpOptions);datasetWarp.FlushCache();datasetWarp.delete();dataset.delete();}

 3.3使用QGIS验证效果

30m分辨率的源数据显示效果
12m分辨率的重采样数据显示效果

经过验证,该方法将低分辨率的栅格重采样为高分辨率的数据栅格效果相对较好,反之,容易产生空间范围缩小的问题、所以,本文只提供了java调用GDAL实现栅格重采样的的思路,该方法若要用于生产环境还需要做出优化才行。


http://www.ppmy.cn/news/1280597.html

相关文章

ECMAScript基础入门

ECMAScript 是 JavaScript 语言的官方标准和规范。JavaScript 是一种广泛用于网页开发的脚本语言&#xff0c;而 ECMAScript 提供了这门语言的核心语法和特性。下面是一份 ECMAScript 的基础入门指南&#xff1a; 基本概念 变量和数据类型&#xff1a; 变量可以通过 var, le…

java实现深度优先搜索 (DFS) 算法

度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;算法是一种用于遍历或搜索图或树的算法。这种算法从一个节点开始&#xff0c;沿着一条路径尽可能深地搜索&#xff0c;直到遇到不能继续前进的节点时返回上一个节点&#xff0c;然后继续搜索其他路径。具体…

深入理解.net运行时方法表

在.net运行时&#xff0c;每一个类型在创建第一个实例&#xff0c;或者静态成员被第一次访问&#xff0c;或者被反射创建时&#xff0c;就会创建一个与该类型关联的方法表&#xff1a; 基本结构大概如下&#xff1a; -------------------------- | Method Table …

模型性能评估-混淆矩阵简介

混淆矩阵 Positive - 正例Negative (N) - 负例 结果: 预测为正类别 预测为负类别 真实为正类别 True Positive (TP) False Negative (FN) 真实为负类别 False Positive (FP) True Negative (TN)TP - 预测 P, 实际 P, 模型预测正确FP - 预测 P, 实际 N, 模…

HarmonyOS - 鸿蒙开发入门

文章目录 HarmonyOS核心资源特性&#xff1a;全场景终端HarmonyOS 版本 HarmonyOS 和 OpenHarmony教程资源开发环境开发工具 - DevEco开发语言 - ArkTS核心框架 - ArkUI 考证 HarmonyOS 开发交流秋秋群&#xff1a;23458659&#xff0c;V : ez-code&#xff0c;期待交流和合作 …

光耦继电器

光耦继电器(光电继电器) AQW282SX 282SZ 280SX 280SZ 284SX 284SZ 212S 212SX 21 2SZ 文章目录 光耦继电器(光电继电器)前言一、光耦继电器是什么二、光耦继电器的类型三、光电耦合器的应用总结前言 光耦继电器在工业控制、通讯、医疗设备、家电及汽车电子等领域得到广泛应…

k8s学习 — (运维)第九章 Helm 包管理器

k8s学习 — &#xff08;运维&#xff09;第九章 Helm 包管理器 学习资料1 什么是 Helm&#xff1f;2 Helm 架构2.1 重要概念2.2 组件2.2.1 Helm 客户端2.2.2 Helm 库 3 安装 Helm4 Helm 的常用命令5 chart 详解5.1 目录结构5.2 Redis chart 实践5.2.1 修改 helm 源5.2.2 搜索 …

【Android 13】使用Android Studio调试系统应用之Settings移植(二):构建settings app项目目录

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、准备工作3.1 创建目录3.2 初始化 git 仓库四、提取settings原始代码4.1 提取目标4.2 源码路径4.2.1 settings app4.2.2 SettingsLib4.3 存放位置