Python | Linux | 解析Himawari-8/9 | Standard Data

news/2024/9/18 13:37:52/ 标签: python, linux, java

写作前面

之前一个相关的工作需要解析Himawari-8/9 Standard Data文件,因为他是二进制的,之前没有处理过,导致完全摸不着头脑。在网上找了中英文搜索找了好久,虽然也找到了公开的解析代码,但是放在自己的数据这感觉总是有点问题。直到我点进了它的官网,发现官方早就给你提供了解决方案。这波属于是自己给自己上强度了,下面我来分享具体的解析过程。

注意

  • 该过程在linux系统上实现,因为需要编译
  • 需要提前安装好netcdf库

示例数据为:

  • HS_H09_20240823_1420_B13_FLDK_R20_S0710.DAT.bz2

编译

打开以下网址,拉到最下面,

  • https://www.data.jma.go.jp/mscweb/en/himawari89/space_segment/spsg_sample.html

看见一个关于c语言的相关信息,根据自己的数据类型下载相关的工具,我这里选择第一个 Standard data

使用wget命令下载到服务器上,再使用unzip对文件进行解压,得到下面的内容:

其实里面的readme也给了具体的编译过程,不过下面我还是仔细讲一下

首先打开makefile文件

大致是下面的内容:

这里需要修改的地方为:

  • CC
  • INC
  • LIB

第一个cc指定你的编译器,可能是gcc也可能是icc,可以使用which命令查看路径,我这里是gcc

python">
which gcc

第二和第三个替换为你的netcdf中的include和lib的安装路径,意思就是告诉系统你的netcdf库安装的位置。

如果已经成功安装上了netcdf,使用命令 nc-config --all,应该能看到你的安装路径:

所以我这里替换最终在为:

使用命令make进行编译,下面是编译过程中的日子:

很快,大概几秒钟后,得到下面的内容:

发现相比刚解压完,多出了一个hisd2netcdf的绿色的程序,说明编译成功了

运行找个程序,他会提醒你输入对应的参数:

这边这个程序就搞定了

示例

下面找一个具体的数据进行测试,这部分的代码我通过python来实现,在python中调用刚刚编译的程序

由于下载的 Himawari-8/9 | Standard 是一个压缩的 .bz2文件,需要将其先进行解压,可以使用python中的bz2解压库,

  • https://docs.python.org/zh-cn/3/library/bz2.html

我这里为了高效直接选择调用Linux 上的bzip2命令

python">def decompress_file(self, source_path, unzip_file_path):"""Decompresses a .bz2 file to a target path.Parameters:source_path (str): Path to the source .bz2 file.unzip_file_path (str): Path to the target decompressed file."""try:with open(unzip_file_path, 'wb') as output_file:subprocess.run([os.path.join(self.bin_path.strip(), 'bzip2'), '-d', '-k', '-c', source_path],check=True, shell=False, stdout=output_file)except subprocess.CalledProcessError as e:print(f"Error decompressing {source_path}: {e}")

对于解压后的数据,调用hist工具包进行数据解码:

需要提供几个信息:

  • 1、.bz文件的路径
  • 2、解压后的路径
  • 3、解析后的nc名称路径
  • 4、hisd2netcdf的完整路径
  • 5、经纬度区间以及分辨率,这是hisd2netcdf命令需要的参数
  • 6、 需要读取的波段名称,这个可有可无
python">import os
import re
import subprocessdef decompress_file(source_path: str, unzip_file_path: str) -> None:"""Decompresses a .bz2 file to a target path.Parameters:source_path (str): Path to the source .bz2 file.unzip_file_path (str): Path to the target decompressed file."""try:# Use subprocess to call bzip2 for decompressionsubprocess.run(["bzip2", "-d", "-k", "-c", source_path],check=True,stdout=open(unzip_file_path, 'wb'))except subprocess.CalledProcessError as e:print(f"Error decompressing {source_path}: {e}")def run_conversion_command(cmd: list[str]) -> None:"""Runs a conversion command using subprocess.Parameters:cmd (list): List containing the command and arguments."""try:subprocess.run(cmd, check=True)except subprocess.CalledProcessError:print(f"Error running command: {' '.join(cmd)}")def main():# Paths and parametersfile_path = r"/Datadisk/hia9/20230621/0000/Z_SATE_C_RJTD_20230621001239_HS_H09_20230621_0000_B01_FLDK_R10_S0110.DAT.bz2"unzip_file_path = r"/Datadisk/hia9/20230621/0000/Z_SATE_C_RJTD_20230621001239_HS_H09_20230621_0000_B01_FLDK_R10_S0110.DAT"output_file_path = r"/Datadisk/HS_H09_20230621_0000_B01_FLDK_R10_S0110.nc"# Decompress the filedecompress_file(file_path, unzip_file_path)# Determine output file name and extract band numberfile_basename = os.path.basename(unzip_file_path)output_file_name = re.search(r"HS_(.*)", file_basename).group(0).replace(".DAT", ".nc")band_number = re.search(r"B(\d{2})", output_file_name).group(0)# Define conversion parametersbands = ["B08", "B09", "B10", "B11", "B13", "B14", "B16"]lat_start = 0lat_end = 45lon_start = 100lon_end = 145grid_scale = 0.1# Conversion commandcmd = ["/Datadisk/code/bin/hisd2/hisd2netcdf","-width", "451","-height", "451","-lat", str(lat_end),"-lon", str(lon_start),"-dlat", str(grid_scale),"-dlon", str(grid_scale),"-i", unzip_file_path,"-o", output_file_path]# Run conversion commandrun_conversion_command(cmd)if __name__ == "__main__":main()

下面是解析的过程

解析后就是netcdf格式的文件,后续就可以正常读取了。

但是需要注意的是,一个时刻的文件包含的信息可能比较少,需要同时读取多个时刻的文件合成的nc文件才能获得有效的结果。说的比较含糊,总之是谁用谁知道。

以后推送的相关代码也会放到GitHub上:

  • https://github.com/Blissful-Jasper/jianpu_record

附上我曾搜到的一些其他解析方法:

https://github.com/ZPYin/Himawari-8_Visualizer

https://docs.com-swirls.org/auto_examples/read_h8.html

https://www.data.jma.go.jp/mscweb/en/himawari89/space_segment/spsg_sample.html


http://www.ppmy.cn/news/1516912.html

相关文章

Vue中使用el-table自定义序号翻页后又从1开始没有连续

在 ​​el-table​​​ 中,自定义序号列在翻页后会重新从 1 开始是因为每页的数据是重新渲染的,没有保留之前的序号。如果您希望在翻页后保持连续的序号,可以使用 ​​index​​ 属性来获取全局的行索引。 以下是一个示例,演示如…

如何在UE5.4中重新定位动画?

动画在游戏和电影制作中扮演着至关重要的角色,而在虚幻引擎5.4(UE5.4)这一强大的实时3D创作平台中,重新定位动画的能力更是将创意表达推向了新的高度。本文将引导您探索UE5.4中重新定位动画的技巧,确保您的动画作品不仅…

error on “nvm list available“, find the final solution by the Second error

error one Could not retrieve https://nodejs.org/dist/index.json. Get “https://nodejs.org/dist/index.json”: dial tcp 104.20.23.46:443: i/o timeout error two Error retrieving “http://npm.taobao.org/mirrors/node/index.json”: HTTP Status 404 PS D:\code…

基于Python的机器学习系列(13):Bagging

在上一篇文章中,我们讨论了决策树的原理及其在分类任务中的应用。然而,单一的决策树模型往往容易过拟合,导致泛化能力较差。为了减小模型的方差,我们可以通过构建多个决策树来提升模型的表现。这种方法被称为Bagging(B…

OPTICS算法原理及Python实践

OPTICS(Ordering Points To Identify the Clustering Structure)算法是一种基于密度的聚类算法,它的核心思想是通过计算数据点之间的密度关系,自动发现数据中的层次结构,而无需预先设定簇的数量。以下是OPTICS算法原理…

OpenCV入门12.2:SURF与SIFT比较及SURF示例

SIFT (Scale-Invariant Feature Transform): 提出时间: 1999年,由David Lowe提出。关键特点: 能够检测和描述图像中的关键点,这些关键点对旋转、缩放和部分亮度变化具有不变性。计算复杂度: 相对较高,因为SIFT使用了高斯差分核来检测关键点&…

C++ 136类和对象_面像对像_多态_虚析构和纯虚析构

136类和对象_面像对像_多态_虚析构和纯虚析构 学习内容 1.抽象类 2.虚函数 3.纯虚函数 /4.虚析构 和 纯虚析构 总结: 1.虚析构或纯虚析构就是用来解决通过父类指针释放子类对象 2.如果子类中没有堆区数据,可以不写为虚析构或纯虚析构 3.拥有纯虚析构函数的类也属于…

缓存三剑客(穿透,雪崩,击穿)理解

缓存穿透 概念理解 缓存穿透正如其名穿透,说明访问的数据在缓存和数据库里都没用,而且此时还大量的发起了访问,导致数据库崩溃 解决方法 一、第一种解决方法就是保存空值在数据库里面,但是这种情况会很消耗空间 二、第二种办…

利用Python对Excel数据进行条件筛选与排序

目录 一、Python与Excel数据处理的基础知识 1.1 Python中的Excel数据处理库 1.2 pandas库简介 二、使用pandas读取Excel数据 三、Excel数据的条件筛选 3.1 单条件筛选 3.2 多条件筛选 3.3 使用query方法 四、Excel数据的排序 4.1 单列排序 4.2 多列排序 五、案例分…

python模块05-json

3 请求数据提取:json 3.1 json类型数据 json对象:{key:calue} json数组:[1,2,3,4] 3.2 json模块 1) json.loads 把Json格式字符串解码转换成Python对象(json数组对应列表,json对象对应字典&#xff09…

Jenkins发邮件功能如何配置以实现自动化?

jenkins发邮件的设置指南?Jenkins怎么配置服务器? Jenkins作为一个流行的自动化服务器,其发邮件功能是通知团队成员构建状态的重要手段。AokSend将详细介绍如何配置Jenkins发邮件功能,以实现自动化通知。 Jenkins发邮件&#xf…

『 C++ 』线程库

文章目录 线程库线程的创建与销毁成员函数this_thread 命名空间线程的引用传值 互斥锁互斥锁的基本操作递归锁(可重入锁)定时互斥锁互斥锁管理器与互斥锁抛异常所引发的死锁问题 条件变量条件变量的等待条件变量的唤醒两个线程交替打印奇偶数 线程库 C标准库提供了一套完整的线…

探索 AWS Lightsail 与 EC2:如何选择适合你的云计算服务?

探索 AWS Lightsail 与 EC2:如何选择适合你的云计算服务? 随着云计算的广泛应用,AWS 提供了多种计算服务以满足不同的用户需求。对于初次接触 AWS 的用户来说,可能会在选择 AWS Lightsail 和 EC2 时感到困惑。这两者都提供了虚拟…

webpack打包优化方案

调试工具:安装webpack-bundle-analyzer打包可视化工具,可以看到打包文件大小,从而有针对性的优化。 npm install --save-dev webpack-bundle-analyzer。 方案一:将第三方依赖包使用cdn进行引入减小文件包体积(例&…

Git的使用教程及常用语法01

git安装可以到官网上下载并安装,一直点点点就行 安装成功后可以在任意地方右键以终端的形式打开。 打开命令终端,输入git -v 查看git版本 一.配置全局用户名和邮箱 配置全局用户名: git config --global user.name "your username&…

利用TeamCity实现maven项目的CI/CD

1.什么是TeamCity? TeamCity 是一款由 JetBrains 开发的强大的持续集成(Continuous Integration,CI)和持续部署(Continuous Deployment,CD)工具。它帮助开发团队自动化构建、测试和部署过程&am…

Scratch的无限可能:突破项目大小与复杂度的界限

Scratch的无限可能:突破项目大小与复杂度的界限 Scratch,这个由麻省理工学院媒体实验室开发的编程平台,以其独特的图形化编程方式,激发了全球数百万孩子的创造力和逻辑思维能力。然而,随着孩子们创意的不断扩展&#…

centos7解决病毒入侵 getty

首先使用top命令查看 找到文件地址 查看是否有自启动服务 关闭、停止、删除 tmp 病毒文件删除 清除标记 [roothost-192-168-0-66 bin]# chattr -ia /tmp/newsvc.sh [roothost-192-168-0-66 bin]# chattr -ia /tmp/redis2 [roothost-192-168-0-66 bin]# chattr -ia /tmp/svc* [r…

C++开发IDE用VisualStudio好还是QtCreator好?

在熟练使用了VisualStudio和QtCreator之后,我依然认为QtCreator作为C++项目开发IDE的便捷性真的相当杰出。 当然了,VisualStudio和QtCreator本身就不是一个量级,VS越做越大,庞大的插件库也使得他能够支持从嵌入式到手机端,从web到脚本,甚至游戏,仿真等等各个领域的开发…

Leetcode 1047-删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 题解 题目链接 //先进后出&a…