SNAP Java API处理Sentinel-1数据
版权声明:本文为博主原创文章,转载请注明原文出处!
作者:阿振
写作时间:2020年4月14日 周二
使用SNAP JAVA API处理Sentinel-1数据
SNAP软件使用Java语言开发,提供了Python接口snappy,官方教程中也多以Python接口进行示范。但是我在使用Python接口过程中,发现并不是很好用,你必须要同时懂Java语言才能很好地使用Python接口,在IDEA中使用Python接口的代码基本上没有提示,报错了也是Java的错误提示。而且,Java本来是运行在虚拟机上的语言,效率不高,再用Python包一层,更加降低了运行效率。
所以,对于我来说,SNAP的Python接口就是鸡肋,没有使用的必要。直接使用Java接口,方便程序直接进行调试,有问题可以直接去看源代码,解决了官方资料不足的问题。
SNAP GPF的使用范式
SNAP推荐使用GPF(Graph Processing Framework)进行数据处理。GPF的使用也很简单,首先基于Operation创建Product,然后写入Product。在写入过程中会自动执行Operation完成你想要的数据处理流程,处理的算法是封装在Operation中的。
使用GPF的好处是你可以进行多个Operation的流程处理,前一个处理结果直接进入后一个处理,不需要写入磁盘,可以减少磁盘IO带来的时间消耗。
对Sentinel-1 GRD数据的处理案例
下面以对Sentinel-1 GRD数据进行一系列预处理流程演示SNAP Java接口的使用。
预处理的流程包括:首先对GRD各个极化波进行段辐射校正输出后向散射系数(Sigma nought),然后进行数据裁剪,最后进行地形校正的。
下面是使用Better Java (Kotlin)进行entinel-1 GRD数据处理的源码。其中,GPF.createProduct
方法需要传入Operation的名称和参数,这些信息都可以通过查看Java源代码的方式找到。
代码运行过程中需要下载DEM数据,可能会比较耗时。如果不对数据裁剪,由于原始数据太大,可能会造成内存溢出。我的笔记本根本跑不动。
package cn.demo
import java.nio.file.Paths
import org.apache.commons.io.FilenameUtils
import kotlin.collections.HashMap
import org.esa.snap.core.dataio.ProductIO
import org.esa.snap.core.gpf.GPF
import com.bc.ceres.core.PrintWriterConciseProgressMonitor
import org.locationtech.jts.io.WKTReader
fun main() {
val srcPath =
Paths.get("/Users/Demo/Desktop/S1A_IW_GRDH_1SDV_20200301T104455_20200301T104520_031481_03A00B_0A9F.zip")
val srcProduct = ProductIO.readProduct(srcPath.toFile())
val outDir = "/Users/Demo/Desktop"
val baseName = FilenameUtils.getBaseName(srcPath.toString())
GPF.getDefaultInstance().operatorSpiRegistry.loadOperatorSpis()
for (polar in arrayOf("VV", "VH")) {
// 首先进行辐射校正(CALIBRATION)
// 对应是的org.esa.s1tbx.calibration.gpf.CalibrationOp类
var parameters = HashMap<String, Any>()
parameters["outputSigmaBand"] = true
parameters["selectedPolarisations"] = polar
val caliProduct = GPF.createProduct("Calibration", parameters, srcProduct)
// 然后进行裁剪,如果不裁剪,图像太大,容易OutOfMemory
// 对应的是org.esa.snap.core.gpf.common.SubsetOp类
val wktRect = "POLYGON((108.175 33.873,108.782 33.873,108.782 33.129,108.175 33.129,108.175 33.873))"
parameters["geoRegion"] = WKTReader().read(wktRect)
parameters["bandNames"] = "Sigma0_${polar}"
val subsetProduct = GPF.createProduct("Subset", parameters, caliProduct)
// 然后进行地形校正(TERRAIN CORRECTION)
// 对应的是org.esa.s1tbx.sar.gpf.geometric.RangeDopplerGeocodingOp
val corrPath = "${outDir}/${baseName}_Corrected_${polar}"
parameters.clear()
parameters["pixelSpacingInMeter"] = 10.0
parameters["sourceBands"] = "Sigma0_${polar}"
val corrProduct = GPF.createProduct("Terrain-Correction", parameters, subsetProduct)
ProductIO.writeProduct(
corrProduct, corrPath, "GeoTIFF",
PrintWriterConciseProgressMonitor(System.out)
)
// 最后进行对象销毁,释放内存空间
caliProduct.dispose()
subsetProduct.dispose()
corrProduct.dispose()
}
srcProduct.dispose()
}
- Redis整合Spring项目搭建实例
- SpringMVC+Hibernate +MySql+ EasyUI实现POI导出Excel(二)
- Nginx+Tomcat+Redis负载均衡Session共享实现超级简单(CentOS6.9系统 Java版本)
- Apache Ignite——新一代数据库缓存系统
- 微信JSSDK接入Java版--步骤及问题处理和解决
- 微信企业号回调模式配置讲解 Java Servlet+Struts2版本 echostr校验失败解决
- Android Material Design系列之RecyclerView和CardView
- 在Linux安装ASP.Net Core的运行时(Runtime)
- 使用xUnit为.net core程序进行单元测试(下1)
- Otto开发初探——微服务依赖管理新利器
- Apache Eagle——eBay开源分布式实时Hadoop数据安全方案
- Spring/Hibernate 应用性能优化的7种方法
- 浅谈应用型机器学习作为一种搜索问题
- 自相关和偏自相关的简单介绍
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Django实现列表页商品数据返回教程
- 实验9 OpenGL光照
- Python实现多线程下载脚本的示例代码
- Android自定义控件仿iOS滑块SwitchButton
- kotlin gson反序列化默认值失效深入讲解
- Android使用Volley实现上传文件功能
- 工作中使用jasmine遇到的一个html element和Component绑定属性失去同步的问题
- Android使用Volley框架定制PostUploadRequest上传文件
- Android实现横向滑动卡片效果
- 在jasmine beforeEach里修改UI元素的一个side effect
- Android实现头像上传功能
- 关于jasmine里debugElement.query和fixture.detectChanges的依赖关系
- 使用python批量转换文件编码为UTF-8的实现
- rxjs operator学习笔记
- python实现将两个文件夹合并至另一个文件夹(制作数据集)