Python:(Sentinel-1)如何解析SNAP输出的HDF5文件并输出为GeoTIFF?

博客已同步微信公众号:GIS茄子;若博客出现纰漏或有更多问题交流欢迎关注GIS茄子,或者邮箱联系(推荐-见主页).
微信公众号
Python:(Sentinel-1)如何解析SNAP输出的HDF5文件并输出为GeoTIFF?

01 前言

最近在了解sentinel-1的预处理过程,但是由于影响太大了,常规的GeoTIFF无法输出预处理结果,BigTIFF输出时似乎也遇到了一些问题(好在后面解决了,所以正好做一下HDF5文件输出的TIFF文件与BigTIFF文件的对比),对于输出的HDF5文件则完全没有问题。但是问题在于HDF5文件的结构尚不了解,因此对于其中的地理信息如何提取很关键(当然你可以使用ArcGIS或者ENVI打开其中的VV和VH波段,但是都无法自动读取到其中的地理信息或者坐标系信息)。

02 解析HDF5文件

由于我处理的Sentinel-1时IW的VV和VH,因此输出的HDF5文件存在两个波段:

VV和VH相关波段信息

下方是关于这个地理信息的参数(ps:找了我好久,里面的属性信息真的太多了,而且官方文档似乎对于这个HDF5文件的结构并没有说明,真的象拔蚌了🌿):

元数据

那么我们来解释一下其中关键的8个参数:
first_near_lat = 30.710711909958782; // double
first_near_long = 106.20485428671394; // double
first_far_lat = 30.710711909958782; // double
first_far_long = 109.12878070499457; // double
last_near_lat = 28.79451557740343; // double
last_near_long = 106.20485428671394; // double
last_far_lat = 28.79451557740343; // double
last_far_long = 109.12878070499457; // double

未必准确,但是目前从得到的结果与BigTIFF对比是几乎完全一致的地理位置(如果有更详细的文档或者准确信息,请微信公众号或者邮箱联系我,这对我帮助很大)。

first 表示第一行,last表示最后一行,near表示扫描线的起点,far表示扫描线的终点。

其实这里搞不懂为什么要有四个点位的信息?一般的角点信息只需要左上和右下两个点位就足够了,算了我不是这个方向的多说无益。

那么,其实说到这里其实已经搞定了,WGS84坐标系有了,仿射参数也已经有了,VV和VH波段数据也有了。

03 代码

# @Author   : ChaoQiezi
# @Time     : 2023/12/18  8:40
# @Email    : chaoqiezi.one@qq.com"""
This script is used to 读取HDF5、BigTIFF文件
"""import os.path
import h5py
from osgeo import gdal, osr# 准备
h5_path = r'H:\Datasets\Objects\TobacooLeafRecognition\Data\HDF5\S1A_IW_GRDH_1SDV_20220602T103546_20220602T103611_043483_05311F_8F62_NR_Orb_Cal_Spk_TC_dB.h5'
tiff_path = r'H:\Datasets\Objects\TobacooLeafRecognition\Data\BigTIFF\S1A_IW_GRDH_1SDV_20220602T103546_20220602T103611_043483_05311F_8F62_NR_Orb_Cal_Spk_TC_dB.tif'
out_dir = r'H:\Datasets\Objects\TobacooLeafRecognition\Data'
out_path = os.path.join(out_dir, 'vv_vh.tiff')
vh_name = 'bands/Sigma0_VH_db'
vv_name = 'bands/Sigma0_VV_db'
metadata_name = 'metadata/Abstracted_Metadata'
lon_min_name = 'first_near_long'
lon_max_name = 'last_far_long'
lat_min_name = 'last_far_lat'
lat_max_name = 'first_near_lat'
lon_res_name = 'lon_pixel_res'
lat_res_name = 'lat_pixel_res'# 探索HDF5文件
with h5py.File(h5_path) as h5:vh, vv = h5[vh_name][:], h5[vv_name][:]metadata = h5[metadata_name]lon_min = metadata.attrs[lon_min_name]lon_max = metadata.attrs[lon_max_name]lat_min = metadata.attrs[lat_min_name]lat_max = metadata.attrs[lat_max_name]lon_res = metadata.attrs[lon_res_name]lat_res = metadata.attrs[lat_res_name]
# 提取栅格信息
rows, cols = vv.shape
transform = [lon_min, lon_res, 0, lat_max, 0, -lon_res]
# 定义地理信息(WGS84)
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)  # WGS84
# 输出
driver = gdal.GetDriverByName('GTiff')
ds = driver.Create(out_path, cols, rows, 2, gdal.GDT_Float32)
ds.SetProjection(srs.ExportToWkt())  # 设置坐标系
ds.SetGeoTransform(transform)  # 设置仿射参数
[ds.GetRasterBand(_ix+1).WriteArray(_band) for _ix, _band in enumerate([vv, vh])]  # 写入数据
ds.FlushCache()
ds = None
# 探索BigTIFF文件
ds = gdal.Open(tiff_path)
bands = ds.ReadAsArray()
proj = ds.GetProjection()
tiff_transform = ds.GetGeoTransform()
print('HDF5的proj: {}'.format(srs.ExportToWkt()))
print('BigTIFF的proj: {}'.format(proj))
print('HDF5的仿射变换参数: {}'.format(transform))
print('BigTIFF的proj: {}'.format(tiff_transform))

输出:

HDF5的proj: GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]BigTIFF的proj: GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]HDF5的仿射变换参数: [106.20485428671394, 8.983152841195215e-05, 0, 30.710711909958782, 0, -8.983152841195215e-05]BigTIFF的proj: (106.20485428671394, 8.983152841195215e-05, 0.0, 30.710711909958782, 0.0, -8.983152841195215e-05)

基本上一致

HDF5输出与BigTIFF对比

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

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

相关文章

Spring之容器:IOC(1)

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

【Android Studio】各个版本下载地址

下载地址: https://developer.android.com/studio/archive?hlzh-cn

java期末大作业(星辰对决--五子棋AI)

星辰闪耀星空棋,璀璨洒满宇宙间。 Java编织智慧谱,FindYou翩舞奇妙规。 黑白对弈纵横展,人机较量激荡心。 星光指引胜利路,创造奇迹指尖舞。 代码: 等改好了再放上来 效果图: 日志: 2023/12/17 今天去网上学了一下AI下五子棋…

el-table表格中数据过长如何使用省略号

前提问题:当表格中某一个数据过长,不需要气泡提示,需要省略号显示解决过程:使用el-table时,el-table-column自带show-overflow-tooltip属性可以将不完全展示的内容通过气泡提示进行展示:show-overflow-tooltip"tr…

什么同源策略?

同源 同源指的是URL有相同的协议、主机名和端口号。 同源策略 同源策略指的是浏览器提供的安全功能,非同源的RUL之间不能进行资源交互 跨域 两个非同源之间要进行资源交互就是跨域。 浏览器对跨域请求的拦截 浏览器是允许跨域请求的,但是请求返回…

android 13.0 设置上网应用白名单(上网app白名单)

1.概述 在13.0的产品rom定制开发中,在对产品进行网络模块开发中,有功能需要要求设置某些app可以上网,某些app不可以上网,就是所谓的网络应用白名单功能 接下来就来分析下相关的网络模块,来具体实现相关功能的开发 2.设置上网应用白名单(上网app白名单)核心代码 framewor…

计算机网络(1):开始

计算机网络(1):开始 计算机网络在信息时代中的作用 21世纪的一些重要特征就是数字化、网络化和信息化,是一个以网络为核心的信息时代。要实现信息化就必须依靠完善的网络,因为网络可以非常迅速地传递信息。因此网络现…

人工智能原理课后习题(考试相关的)

文章目录 问答题知识表示一阶谓词逻辑表示法语义网络表示法 确定推理谓词公式永真和可满足性内容归结演绎推理 不确定推理主观贝叶斯可信度方法证据理论 搜索策略机器学习 问答题 什么是人工智能? 人工智能就是让机器看起来像人类表现出的智能水平一样 人工智能就是…

ElasticSearch单机或集群未授权访问漏洞

漏洞处理方法: 1、可以使用系统防火墙 来做限制只允许ES集群和Server节点的IP来访问漏洞节点的9200端口,其他的全部拒绝。 2、在ES节点上设置用户密码 漏洞现象:直接访问9200端口不需要密码验证 修复过程 2.1 生成认证文件 必须要生成…

Multimodal Chain-of-Thought Reasoning in Language Models语言模型中的多模态思维链推理

Abstract 大型语言模型 (LLM) 通过利用思维链 (CoT) 提示生成中间推理链作为推断答案的基本原理,在复杂推理方面表现出了令人印象深刻的性能。然而,现有的 CoT 研究主要集中在语言情态上。我们提出了 Multimodal-CoT,它将语言(文本…

c++期末复习总结语言基础

常用的输出设置 dex十进制、oct八进制、dec十六进制 语法cout<<hex<<17; 浮点数精度 Steprecision(n)n代表有效位数&#xff0c;包括小数和整数 Setw(n) n是输入数据占用屏幕的宽度的字符个数&#xff0c;输入数据默认右对齐 设置对齐方式 Setiosflags(ios:ri…

unity—UGUI 点击按钮后,持续点击空格键会持续出发按钮

在unity开发当中&#xff0c;使用UGUI开发&#xff0c;无论是你代码绑定按钮事件&#xff0c;还是在Inspector窗口直接拖拽绑定的事件&#xff0c;点击按钮事件后&#xff0c;按空格键都会再次执行相关的方法。 默认情况下&#xff0c;Unity将空格键映射为UI按钮的Submit提交操…

Python 爬虫之简单的爬虫(二)

爬取百度热搜榜 文章目录 爬取百度热搜榜前言一、展示哪些东西二、基本流程三、前期数据获取1.引入库2.请求解析获取 四、后期数据处理1.获取保存 总结 前言 每次打开浏览器&#xff0c;我基本上都会看一下百度热搜榜。这篇我就写一下如何获取百度的热搜榜信息吧。 如果到最后…

深度学习中的张量是什么意思,为什么要引入张量的概念。

问题描述&#xff1a;深度学习中的张量是什么意思&#xff0c;为什么要引入张量的概念。 问题解决&#xff1a;张量是一种特殊的数据结构&#xff0c;是矩阵的延申。矩阵是一种特殊的张量。 在数学世界中&#xff0c;需要用数据来描述现实世界中的存在的实物&#xff0c;比如用…

最近的进展

几天前&#xff0c;我还在老老实实的写着博客&#xff0c;突然晚上睡了一觉&#xff0c;发现左脚的脚踝特别疼&#xff0c;疼的无法直立行走&#xff0c;我想去医院&#xff0c;但是真的没办法走动&#xff0c;我没办法一个人去医院&#xff0c;这两天才好了一点&#xff0c;那…

C语言之双链表理解与应用

其实网上也有好多关于双链表理解&#xff0c;知乎上同样有写的很好文章。这里主要看双链表概念&#xff0c;应用场景&#xff0c;举例。 &#xff11;&#xff0c;双链表概念 双链表是一种更复杂的线性数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含数据元素…

C语言初学6:判断

一、if 语句 #include<stdio.h> int main() {// 定义局部变量int a 10;// 使用if语句检查布尔条件if(a < 20){/* 如果为真&#xff0c;输出下面语句 */printf("a 小于 20\n");}printf("a 的值是 %d\n", a);return 0; } 执行结果是&#xff1a;…

蓝桥杯time模块常用操作

#导入time模块import time #获取时间戳 start_time time.time () print ( "start_time ", start_time) time .sleep ( 3) end_time time.time () print ( "end_time ", end_time)#计算运行时间 print("运行时间 { :.0f } ".format(end_time …

(已解决)如何使用matplotlib绘制小提琴图

网上很多人使用seaborn绘制小提琴图&#xff0c;本人暂时不想学新的东西&#xff0c;就是懒。本文介绍如何使用matplotlib绘制小提琴图&#xff0c;很多其他博客只是使用最简单的语法&#xff0c;默认小提琴颜色会是蓝色&#xff0c;根本改不了。本文使用了一点高级的用法&…