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

目录

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.hqwc.cn/news/298010.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

顺序表的介绍与简单运用

1&#xff1a;解释与结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存 储。在数组上完成数据的增删查改。 顺序表一般可分为一下几类 1.1 静态顺序表 概念&#xff1a;使用定长数组存储元素。注意&#xff1a;这种是…

YOLOv8改进 | 主干篇 | 利用SENetV2改进网络结构 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫)&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何…

可靠度理论中“设计基准期”、“设计使用年限”、“使用寿命”几个概念的区分

文章目录 0. 背景1. 重现期2. 设计基准期3. 设计使用年限调整系数4. 一把杆秤5. 调整系数的补充说明Last 0. 背景 在可靠度理论中&#xff0c;经常遇见“设计基准期”、“设计使用年限”、“使用寿命”几个概念。这些概念搞不清楚对于梳理结构荷载组合而言就是致命的。本文也是…

第二十一章博客

计算机应用实现了多台计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c;相互之间可以交换数据。编写网络应用程序前&#xff0c;首先必须明确所要使用的网络协议…

C语言中常见的笔试题(二)

题目一&#xff1a; 问题&#xff1a; 在C语言中&#xff0c;const关键字有哪些用途&#xff1f;请列举出至少三种用途&#xff0c;并给出相应的代码示例。 答案&#xff1a; 定义常量&#xff1a;使用const关键字可以定义常量&#xff0c;它们的值在程序运行期间不能被修改…

SpringMVC核心处理流程梳理

1、处理流程图展示 当我拿出这张图&#xff0c;阁下又该如何应对呢&#xff1f;执行流程是不是一目了然了。 2、DispatcherServlet&#xff1a;中央处理器或者中央调度器 下图官方的解释应该最完善了。 3、SpringMVC三大核心组件 HandlerMapping 处理器映射器&#xff0c;…

[机器人-2]:开源MIT Min cheetah机械狗设计(二):机械结构设计

目录 1、四肢朝向的选择 2、电机布局形式的选择 3、电机的选型及测试&#xff08;非常重要&#xff09; 4、结构优化 5、尺寸效应 6、其他 1、四肢朝向的选择 机械狗的结构设计&#xff0c;第一个摆在我们面前的就说四肢的朝向问题&#xff0c;如下图&#xff0c;我们是…

Spark集群部署与架构

在大数据时代&#xff0c;处理海量数据需要分布式计算框架。Apache Spark作为一种强大的大数据处理工具&#xff0c;可以在集群中高效运行&#xff0c;处理数十TB甚至PB级别的数据。本文将介绍如何构建和管理Spark集群&#xff0c;以满足大规模数据处理的需求。 Spark集群架构…

SLAM算法与工程实践——SLAM基本库的安装与使用(6):g2o优化库(4)构建g2o的边

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

Kubernetes(K8S)快速入门

概述 在本门课程中&#xff0c;我们将会学习K8S一些非常重要和核心概念&#xff0c;已经操作这些核心概念对应组件的相关命令和方式。比如Deploy部署&#xff0c;Pod容器&#xff0c;调度器&#xff0c;Service服务&#xff0c;Node集群节点&#xff0c;Helm包管理器等等。 在…

​【C语言】乘法表

题目要求&#xff1a; 实现一个函数&#xff0c;打印乘法口诀表&#xff0c;口诀表的行数和列数自己指定 如&#xff1a;输入9&#xff0c;输出9 * 9口诀表&#xff0c;输出12&#xff0c;输出12 * 12的乘法口诀表。 题目分析&#xff1a; 我们观察乘法口诀表可以发现&#x…

力扣题目学习笔记(OC + Swift)17. 电话号码的字母组合

17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 关键字&#xff1a;所有组合 模式识别&#xff1a…