Java实现基于GDAL将单波段影像转为三波段影像-唯一值渲染

在处理遥感影像的渲染时,经常需要处理单波段影像。单波段影像没有任何颜色,只有一个波段的值。渲染时只能采用色带拉伸、离散颜色、唯一值渲染这几种方式。直接将单波段影像转成三波段的影像,并将三个波段转为颜色对应的rgb值,这样可以加速渲染、切片的过程。这里我有一张单波段影像,需要按照唯一值的方式,进行渲染,这里记录一下实现过程。

Java依赖

        <dependency><groupId>org.gdal</groupId><artifactId>gdal</artifactId><version>3.5.0</version></dependency>

注意我本地部署的是gdal3以上的版本,不同版本的api会有不同

实现代码

package map.tile.server.tool;import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;import java.awt.*;import java.util.HashMap;
import java.util.Map;import static org.gdal.gdalconst.gdalconstConstants.GDT_Byte;public class RasterTool {public static void main(String[] args) throws Exception {// 注册所有支持的格式gdal.AllRegister();String inputFile = "E:\\栅格\\2023_20230430.tif";Dataset dataset = gdal.Open(inputFile, gdalconstConstants.GA_ReadOnly);if (dataset == null) {System.out.println("无法打开输入图像");return;}int width = dataset.GetRasterXSize();int height = dataset.GetRasterYSize();Band band = dataset.GetRasterBand(1);System.out.println(band.GetRasterDataType());//设立每类值对应样式,样色Color colorLevel1 = new Color(0, 92, 230);Color colorLevel2 = new Color(56, 168, 0);Color colorLevel3 = new Color(85, 255, 0);Color colorLevel4 = new Color(255, 170, 0);Map<Short, Color> styles = new HashMap<>(4);styles.put((short) 1, colorLevel1);styles.put((short) 2, colorLevel2);styles.put((short) 3, colorLevel3);styles.put((short) 4, colorLevel4);// 创建新的RGB图像对象Double[] noDataValue = new Double[1];band.GetNoDataValue(noDataValue);Driver driver = gdal.GetDriverByName("GTiff");Dataset rgbDataset = driver.Create("E:\\栅格\\output_rgb_image.tif", width, height, 3, GDT_Byte);rgbDataset.SetProjection(dataset.GetProjection());rgbDataset.SetGeoTransform(dataset.GetGeoTransform());for (int i = 0; i < 3; ++i) {Band outputBand = rgbDataset.GetRasterBand(i + 1);outputBand.SetNoDataValue(noDataValue[0]);short[] buffer = new short[width];//            一次读取一行,防止数据溢出for (int j = 0; j < height; j++) {band.ReadRaster(0, j, width, 1, buffer);// 转换颜色processData(buffer, i + 1, styles);outputBand.WriteRaster(0, j, width, 1, buffer);}outputBand.FlushCache();outputBand.delete();}rgbDataset.FlushCache();rgbDataset.delete();dataset.delete();}private static void processData(short[] buffer, int bandIndex, Map<Short, Color> styles) {if (bandIndex == 1) {for (int i = 0; i < buffer.length; i++) {Color color = styles.get(buffer[i]);if (color != null) {buffer[i] = (short) color.getRed();}}} else if (bandIndex == 2) {for (int i = 0; i < buffer.length; i++) {Color color = styles.get(buffer[i]);if (color != null) {buffer[i] = (short) color.getGreen();}}} else if (bandIndex == 3) {for (int i = 0; i < buffer.length; i++) {Color color = styles.get(buffer[i]);if (color != null) {buffer[i] = (short) color.getBlue();}}}}
}

效果对比

将转换后的文件,直接拖入拖入QGIS展示效果如下:

  • 转换前

转换前

  • 转换后
    转换后

注意,如果使用ArcGIS查看效果的话,需要将拉伸类型选择“无”,将应用Gamma拉伸取消勾选。

ArcGIS配置

感想

  1. GDAL的Java交互真的不太友好
  2. 太大的影像居然没有办法直接读取,整张影像读取,因为可能或超过数组的长度限制。

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

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

相关文章

贝塞尔曲线

贝塞尔曲线&#xff08;Bzier curve&#xff09;是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线&#xff0c;贝兹曲线由线段与节点组成&#xff0c;节点是可拖动的支点&#xff0c;线段像可伸缩的皮筋&#xff0c;我们在绘图工具上看到的钢笔工具…

网络安全B模块(笔记详解)- Web渗透测试

Web渗透测试 1.通过渗透机Kali1.0对服务器场景PYsystem20192进行Web渗透测试(使用工具w3af的对目标Web服务器进行审计),在w3af的命令行界面下,使用命令列出所有用于审计的插件,将该操作使用的命令作为Flag值提交; 进入kali命令控制台中使用命令w3af_console进入w3af命令…

经验分享:知识库系统这样搭建轻松又高效

我们工作中遇到过这样的情况吗&#xff1f;找不到组织结构图&#xff0c;找不到某个报告模板&#xff0c;找不到工作流程说明… 还或者看到同事忙绿在重复劳动&#xff0c;却没办法高效地共享你的经验和知识&#xff1f;这些都表明你的公司可能正急需一个知识库系统。 知识库系…

springCould中的Config-从小白开始【10 】

目录 &#x1f32d;1.spring cloud Config是什么&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️ &#x1f953;2.能干什么&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️ &am…

【算法Hot100系列】有效的数独

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

【Scala】——流程控制

1 if-else 分支控制 让程序有选择的的执行&#xff0c;分支控制有三种&#xff1a;单分支、双分支、多分支 1.1单分支 if (条件表达式) {执行代码块 }1.2 双分支 if (条件表达式) {执行代码块 1 } else {执行代码块 2 }1.3 多分支 if (条件表达式1) {执行代码块 1 } else …

【C/C++】轻量级跨平台 开源串口库 CSerialPort

文章目录 1、简介2、支持的平台3、已经支持的功能4、Linux下使用5、使用vcpkg安装CSerialPort6、交叉编译7、效果图8、基于CSerialPort的应用8.1、CommMaster通信大师8.2、CommLite串口调试器 1、简介 Qt 的QSerialPort 已经是跨平台的解决方案&#xff0c;但Qt开发后端需要 Q…

Java泛型:灵活多变的类型参数化工具

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、泛型1、什么是泛型2、泛型的语法 二、泛型类的使用1、泛型类的语法2、泛型如何编译的2.1、擦除机制2.2、为什么不能实例化泛…

低代码开发平台在工业领域的应用场景

随着科技的不断发展&#xff0c;低代码开发平台在工业场景中的应用越来越广泛。低代码开发平台通过提供可视化的界面和预构建的模块&#xff0c;使得开发人员能够快速地构建应用程序&#xff0c;而不需要编写大量的代码。这种技术的应用&#xff0c;不仅可以提高开发效率&#…

7+单细胞+空转+实验验证,如何根据内容开展相关经验给你启发

导语 今天给同学们分享一篇生信文章“CD8 tissue-resident memory T cells induce oral lichen planus erosion via cytokine network”&#xff0c;这篇文章发表在Elife期刊上&#xff0c;影响因子为7.7。 结果解读&#xff1a; 单细胞RNA测序揭示了具有不同临床亚型的OLP的细…

oracle11范围表空间实例

1.表分区&#xff1a;范围分区&#xff0c;散列分区&#xff0c;列表分区&#xff0c;组合分区&#xff0c;inetrval分区 范围分区&#xff1a;商品零售表&#xff0c;按照销售日期所在的季度创建4个分区 --先建立表空间&#xff1a;临时表空间是不可以存放数据的&#xff0c;…

网络原理OSI

目录 一、应用层 1、功能 2、协议的分类 二、UDP原理&#xff08;传输层&#xff09; 1、协议端格式 2、格式解释 三、TCP原理&#xff08;传输层&#xff09; 1、协议端格式 2、长度 3、可靠传输 &#xff08;1&#xff09;确认应答 &#xff08;2&#xff09;超时…