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

2024-08-27 00:04

本文主要是介绍Python | Linux | 解析Himawari-8/9 | Standard Data,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写作前面

之前一个相关的工作需要解析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


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命令

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、 需要读取的波段名称,这个可有可无
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

这篇关于Python | Linux | 解析Himawari-8/9 | Standard Data的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定