ESA SNAP工具包Java接口的使用

2024-05-02 14:08

本文主要是介绍ESA SNAP工具包Java接口的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


版权声明:本文为博主原创文章,转载请注明原文出处!

写作时间:2010年4月10日晚


ESA SNAP工具包Java接口的使用

欧盟的SNAP工具包提供了对Sentinel卫星数据的处理功能。

SANP使用Java编写,UI界面使用了NetBeans框架。

如果要进行批处理的话,还提供了基于图的Graph Processing Framework (GPF)处理模式。

此外,SNAP还贴心的提供了Python接口snappy(对Java API的封装)。

参考资料:https://senbox.atlassian.net/wiki/spaces/SNAP/overview

但是我使用官方提供的安装包安装好以后,Python接口用不了,所以我想着还不如就用原生的Java接口。

首先,从GitHub下载SNAP的源码进行编译,主要下载了snap-engine,snap-desktop,s1tbx和s2tbx这四个工程,依次进行编译(最新版本为8.0.0-SNAPSHOT)。

例如对snap-engine的编译命令如下:

cd snap
git clone https://github.com/senbox-org/snap-engine.git
cd snap-engine
mvn clean install -DskipTests=true

编译中主要问题是一些第三方库下载特别慢或者根本下载不下来,这时候你需要科学上网手动下载需要的依赖包,再次进行编译。

编译完这四个包以后,我们新建Maven工程进行代码测试。下面代码使用Better Java (Kotlin)进行示范,我把注释加进了代码中方便理解。

package cn.demoimport java.nio.file.Paths
import org.esa.snap.core.dataio.ProductIOfun main(args: Array<String>) {val path = Paths.get("S2B_MSIL1C_20200304T032629_N0209_R018_T48SYC_20200304T075000.zip")// 通过文件获得读取数据的Readerval reader = ProductIO.getProductReaderForInput(path.toFile())// 通过这个Reader对象来读取Sentinel数据产品Productval product = reader.readProductNodes(path.toFile(), null)// 通过这个Product对象来读取波段中存储的数据val band = product.getBand("B1")// 数据不是自动加载的,需要手动加载一下if (!band.hasRasterData()) {band.loadRasterData()}// 获取波段数据,数据是以一维数组的形式存储的,主要使用PixelInterleavedSampleModel这类进行控制像素交替方式存储// 有兴趣的可以参考java.awt.image.PixelInterleavedSampleModelval data = band.rasterDataassert(band.rasterHeight * band.rasterWidth == data.numElems)
}

代码运行过程中,提示找不到OpenJPEG的库(Sentinel-2 SAFE格式的文件中是以JPG图像格式保存各个波段的观测数据的),最后我通过代码调试发现,SNAP中对OpenJPEG库的路径定义在~/.snap/auxdata/openjpeg/8.0.0-SNAPSHOT/目录下,而我的本地没有该目录(虽然/usr/local/bin 目录中有OpenJPEG库,但是SNAP不是在这个目录中寻找的),所以程序会报错。

解决的方案是我由于本来安装的SNAP桌面版(7.0.0),该版本在~/.snap/auxdata/openjpeg/7.0.0/目录下存放了OpenJPEG库,所以拷贝该版本的库修改名称为8.0.0-SNAPSHOT即可,程序正常运行。

总得来说,SNAP提供的参考资料不多,有问题只能取Forum中提问。所以我觉得还是使用GDAL读取Sentinel数据,然后再进行进一步操作方便些。

这篇关于ESA SNAP工具包Java接口的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954427

相关文章

deepseek本地部署使用步骤详解

《deepseek本地部署使用步骤详解》DeepSeek是一个开源的深度学习模型,支持自然语言处理和推荐系统,本地部署步骤包括克隆仓库、创建虚拟环境、安装依赖、配置模型和数据、启动服务、调试与优化以及... 目录环境要求部署步骤1. 克隆 DeepSeek 仓库2. 创建虚拟环境3. 安装依赖4. 配置模型

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

在idea中使用mysql数据库超详细教程

《在idea中使用mysql数据库超详细教程》:本文主要介绍如何在IntelliJIDEA中连接MySQL数据库,并使用控制台执行SQL语句,还详细讲解了如何使用MyBatisGenerator快... 目录一、连接mysql二、使用mysql三、快速生成实体、接口、sql文件总结一、连接mysql在ID

Sentinel 断路器在Spring Cloud使用详解

《Sentinel断路器在SpringCloud使用详解》Sentinel是阿里巴巴开源的一款微服务流量控制组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、... 目录Sentinel 介绍同类对比Hystrix:Sentinel:微服务雪崩问题问题原因问题解决方案请

Spring IOC的三种实现方式详解

《SpringIOC的三种实现方式详解》:本文主要介绍SpringIOC的三种实现方式,在Spring框架中,IOC通过依赖注入来实现,而依赖注入主要有三种实现方式,构造器注入、Setter注入... 目录1. 构造器注入(Cons编程tructor Injection)2. Setter注入(Setter

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.