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实现栅格重采样的的思路,该方法若要用于生产环境还需要做出优化才行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/268669.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库开发表操作案例的详细解析

2.3.1.4 案例 需求&#xff1a;根据产品原型/需求创建表((设计合理的数据类型、长度、约束) 产品原型及需求如下&#xff1a; 步骤&#xff1a; 阅读产品原型及需求文档&#xff0c;看看里面涉及到哪些字段。 查看需求文档说明&#xff0c;确认各个字段的类型以及字段存储数据…

关于Python里xlwings库对Excel表格的操作(十七)

这篇小笔记主要记录如何【获取和设置单元格行高、列宽】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2&#xff09;如何在W…

【Python】pip管理Python包

命令&#xff1a;pip install <包名> 安装指定的包。 pip install ipython #或者 pip install ipython -i https://mirrors.aliyun.com/pypi/simple/ 命令&#xff1a;pip uninstall <包名> 删除指定的包。 pip uninstall ipython 命令&#xff1a;pip list 显…

SpringBoot2.x+mybatis plus3.x集成Activit7版本

文/朱季谦 在Activiti6版本当中&#xff0c;若要集成到Springboot里&#xff0c;需要写一些额外的配置类&#xff0c;我曾经在Activiti工作流框架学习笔记&#xff08;二&#xff09;之springboot2.0整合工作流Activiti6.0一文当中总结过相关配置过程&#xff0c;感兴趣的同学…

Leetcode162. 寻找峰值

Every day a Leetcode 题目来源&#xff1a;162. 寻找峰值 解法1&#xff1a;STL 代码&#xff1a; class Solution { public:int findPeakElement(vector<int>& nums) {return max_element(nums.begin(), nums.end()) - nums.begin();} };复杂度分析&#xff1…

【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调双向队列 二叉树 题目 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动…

Python 数据分析 Matplotlib篇 时间序列数据绘制折线图(第4讲)

Python 数据分析 Matplotlib篇 时间序列数据绘制折线图(第4讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

关于“Python”的核心知识点整理大全40

目录 alien_invasion.py game_functions.py 14.3.3 在外星人被消灭时更新得分 settings.py game_functions.py game_functions.py alien_invasion.py 14.3.4 将消灭的每个外星人的点数都计入得分 game_functions.py 14.3.5 提高点数 settings.py settings.py 注意…

swing快速入门(二十七)

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.为按钮指定图标 2. 列表框的并列 3.菜单项绑定快捷键 4.控件悬浮提示信息 5.菜单项设置小图标 6.五种布局风格右键选择切换 package swing21_30;import javax.swing.*; import java.awt.*; import java.awt.event.…

单聊和群聊

TCP协议单聊服务端&#xff1a; import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vec…

浅谈Springboot默认logger函数的使用

目录 前言1. logger日志2. 补充 前言 原先写过一篇logger日志函数的总结&#xff0c;不同的引用来源&#xff1a;java常见log日志的使用方法详细解析 但是为了不引入依赖包&#xff0c;更好的直接使用&#xff0c;总结了如下博文 1. logger日志 Spring Boot使用Spring框架中…

MySQL undo日志精讲2-undo日志写入

通用链表结构 在写入undo日志的过程中会使用到多个链表&#xff0c;很多链表都有同样的节点结构&#xff0c;如图所示&#xff1a;在某个表空间内&#xff0c;我们可以通过一个页的页号和在页内的偏移量来唯一定位一个节点的位置&#xff0c;这两个信息也就相当于指向这个节点…

SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库

文章目录 简介本地存储都有哪些&#xff1f;如何使用WebSQL打开数据库事务操作SQL执行 在浏览器端做一个英雄的查询页面如何删除本地存储参考文献 简介 WebSQL是一种操作本地数据库的网页API接口&#xff0c;通过它&#xff0c;我们可以操作客户端的本地存储。 WebSQL曾经是H…

Flutter windows 环境配置

Flutter windows 环境配置 从零开始&#xff0c;演示flutter环境配置到启动项目&#xff0c;同时支持 vscode 和 android studio 目录 Flutter windows 环境配置一、环境配置1. Flutter SDK2. Android Studio3. JDK4. 拓展安装5. Visual Studio 2022二、项目创建和启动1. vsco…

Midjourney V6 引爆社交媒体,AI图像与照片的差别消失;LangChain的2023AI发展状况总结

&#x1f989; AI新闻 &#x1f680; Midjourney V6 引爆社交媒体&#xff0c;AI图像与照片的差别消失 摘要&#xff1a;Midjourney V6 第二次社区评价震惊网友&#xff0c;神图细节逼真&#xff0c;光影效果逆天&#xff0c;皮肤质感细腻&#xff0c;已超越昨日版本。V6即将…

交友系统设计:哪种地理空间邻近算法更快?

小熊学Java&#xff1a;https://javaxiaobear.cn 交友与婚恋是人们最基本的需求之一。随着互联网时代的不断发展&#xff0c;移动社交软件已经成为了人们生活中必不可少的一部分。然而&#xff0c;熟人社交并不能完全满足年轻人的社交与情感需求&#xff0c;于是陌生人交友平台…

Go语言中的`sync`包同步原语

通过sync包掌握Go语言的并发 并发是现代软件开发的基本方面&#xff0c;而Go&#xff08;也称为Golang&#xff09;为并发编程提供了一套强大的工具。在Go中用于管理并发的基本包之一是sync包。在本文中&#xff0c;我们将概述sync包&#xff0c;并深入探讨其最关键的同步原语…

【adb】电脑通过ADB向手机设备传输文件

具体步骤如下&#xff1a; Step1 下载ADB工具 下载最新版本的 ADB工具 !!! 注意&#xff1a;一定要是最新版本的ADB&#xff0c;否则很可能导致无法识别到手机。 将下载的ADB解压以后的文件如下图所示&#xff1a; Step2 添加环境变量 将 ABD 的路径 D:\platformtools &am…

java进阶(二)-java小干货

java一些精干知识点分享 2. java小干货2.1循环遍历2.2可变参数2.3 list和数组转化2.3.1 数组转list2.3.2 list转数组 2.4 值传递和地址传递2.4.1值传递2.4.2 地址传递2.4.3易错点总结 2.5 数组数组帮助类Arrays 2.5 基本数据类型和包装类2.5集合2.6文件流2.7java代码块、内部类…

Nginx快速入门:实现企业安全防护|nginx部署https,ssl证书(七)

0. 引言 之前我们讲到nginx的一大核心作用就是实现企业安全防护&#xff0c;而实现安全防护的原理就是通过部署https证书&#xff0c;以此实现参数加密访问&#xff0c;从而加强企业网站的安全能力。 nginx作为各类服务的统一入口&#xff0c;只需要在入口处部署一个证书&…