尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
FY-4A数据读取与处理:从HDF5到亮温云图
简介围绕风云四号FY4A卫星数据读取与解析的 Python 代码包面向气象、遥感及卫星数据处理初学者和开发者解决原始观测数据解析与预处理问题可用于气象预报、气候监测、环境灾害预警等场景。资源共含6个文件以 Python 脚本为主另附 XML 配置压缩包仅12KB轻量精简。目前已有2299人学习或下载具备一定参考热度。包内代码构建了从核心读取模块、通用工具函数、数据处理组件到主流程调度、测试脚本和配置文件的完整框架核心模块负责将原始二进制数据转为结构化信息工具函数覆盖数据校验、时间序列处理与预处理组件可组合完成复杂任务测试脚本用于验证多种场景下的正确性配置文件支持灵活调整数据源路径、解码参数与输出格式。借助这套框架读者能快速掌握 FY4A 数据读入与预处理思路并据此搭建自己的数据处理系统用于气象研究、环境监测及相关领域分析。1. FY4A数据读取代码到底解决了什么做遥感的人第一次拿到风云四号A星FY-4A的L1级数据最惊喜的不是一打开HDF5文件就能看到十几个大气通道而是被一堆嵌套数据集的路径绊住。这份代码包想解决的就是这个“绊住”的问题把FY4A数据从原始DN值一路处理成带经纬度的亮温图、反射率图和彩色云图。它适合两类人——刚接触静止轨道卫星数据、不想花一周时间啃文件格式说明的学生以及做气象可视化产品、只是想快速把底层读取逻辑跑通再改的开发者。代码包覆盖了文件打开、通道读取、辐射定标、地理定位和图像输出五个环节。你很快会发现读HDF5本身不值钱真正影响结果可靠性的是定标系数怎么拿、经纬度查找表怎么对齐这两件事。2. 工程结构拆解解压后先认清四类文件2.1 解压后的目录与文件职责一份给开发者用的数据读取代码包结构通常不会太复杂。这个 code 包解压后我一般会按下面的方式组织codes/ ├── read_fy4a.py # 主入口读取、定标、出图 ├── fy4a_utils.py # 辅助函数亮温/反射率/经纬度规整 ├── config.yaml # 输入文件、波段、输出路径配置 ├── requirements.txt # Python 依赖列表 └── samples/ ├── input/ # 放置待读取的 FY4A L1 HDF5 文件 └── output/ # 运行的输出图片和日志拿到代码包后不要急着跑。先按顺序确认三件事依赖装没装、samples/input 里有没有数据文件、output 目录是否存在。read_fy4a.py 是主脚本负责找文件、调函数、出图fy4a_utils.py 是把脏活集中起来的地方比如将无符号整数转成浮点辐射值、把开尔文温度转成摄氏度config.yaml 把输入输出路径从代码里剥离开方便每次换数据时只改一行配置。2.2 数据组织方式与脚本的对应关系FY-4A 的 L1 级产品一般以 HDF5 格式分发文件里并不仅仅是一张二维图像。除了各个波段的观测数组还带有一大堆属性卫星标识、观测时间、波段中心波长、定标系数以及用于地理定位的经纬度查找表。代码包里的脚本就是围绕着这份 HDF5 的层次结构写的。h5py 打开文件后顶层会出现若干数据集或组波段数据可能按通道号展开也可能放在某个子组下。规范的写法是先遍历一遍文件对象把 keys 打印出来确认实际路径再决定用哪个名字去取数。直接写死一个路径换一个数据版本就容易翻车。read_fy4a.py 里通常会写一个 inspect 函数干这件事它不做任何计算只是把文件的组织结构展示出来。2.3 依赖清单与推荐工具链依赖方面这份代码基于 Python核心只有三个库h5py 读 HDF5、numpy 做数组运算、matplotlib 出图。如果代码包还提供 GeoTIFF 输出功能则会额外依赖 rasterio如果产品文件是 NetCDF4 格式则会把 netCDF4 一起列进 requirements.txt。建议直接用 Anaconda 或 venv 建一个干净环境。下面这段命令是我拿到代码包后习惯性先执行的pip install h5py numpy matplotlib pyyaml rasterioPyYAML 不是读取数据必需的但它能让 config.yaml 真正被 load 出来。若代码包里没提供 config 读取也可以把配置直接写成函数参数。我更推荐保留配置文件因为后续要批量处理几十个文件时改动输入目录就会非常顺手。3. 核心代码逐段拆解从DN值到带经纬度的云图3.1 先摸清HDF5文件的真实结构数据读取的第一步不是“读”而是“看”。拿到一个没见过的 FY-4A 文件我从来不会直接去读某个猜出来的通道名而是先执行一个很短的探查脚本import h5py def inspect_fy4a(filepath): with h5py.File(filepath, r) as f: print(顶层条目:, list(f.keys())) for name, item in f.items(): if isinstance(item, h5py.Dataset): print(name, item.shape, item.dtype)这段代码的逻辑很直白以只读模式打开 HDF5遍历根组下的所有条目如果是 Dataset就打印它的形状和数据类型。参数 filepath 是 HDF5 文件路径返回的 shape 通常是一个二维数组例如 (2748, 2748)dtype 一般是 uint16也就是原始 DN 值。这里要留个心眼有的产品把波段数据放在名为 Data 的子组里有的直接摊在根组下。分发的版本不同布局会有差异。先跑一遍 inspect把真实路径打出来之后所有代码都以这个输出为准。这一步能省掉后面至少半小时的排查时间。3.2 从DN值到亮温辐射定标得到原始数组后下一个关键动作是辐射定标。L1 数据里的数值不是物理量定标公式在文件属性里以 scale 和 offset 的形式给出。对可见光通道最终目标是反射率对红外通道则是亮温。先看反射率部分的实现import numpy as np def dn_to_reflectance(dn, scale, offset, solar_zenithNone): refl dn.astype(np.float64) * scale offset if solar_zenith is not None: refl refl / np.cos(np.deg2rad(solar_zenith)) return np.clip(refl, 0, 1)这段代码先把 uint16 转成 float64再乘定标斜率加偏移量得到辐射亮度或反射率初值。参数 scale 和 offset 通常来自文件属性里的 CALIBRATION 字段solar_zenith 是观测时刻的太阳天顶角做太阳高度角修正时使用。这里我必须强调不要省略 dtype 转换uint16 直接参与浮点乘除法时会截断精度尤其在云图边缘容易出带状伪影。红外通道的定标则是先算辐射值再用普朗克函数的反函数求亮温def bt_from_radiance(rad, c11.191042e-16, c21.4387769e-2, wavelength1.04e-5): t c2 / (wavelength * np.log(c1 / (wavelength**5 * rad) 1.0)) return t - 273.15参数 rad 是前一步得到的辐射亮度wavelength 是波段中心波长这里 1.04e-5 米对应 10.4 微米左右的长波红外通道常用来反演云顶温度。c1、c2 是辐射公式里的两个常数除非做高精度研究否则保持默认即可。返回的是摄氏度比开尔文更直观。实际工程里不建议每个通道手动传波长而是在读文件属性时把中心波长短横线拉出来自动传给这个函数。3.3 地理定位经纬度查找表怎么对齐有了物理量还缺坐标。FY-4A 圆盘图每个像素对应哪个经纬度一般由文件内置的查找表提供。读取方式很简单lon f[NOM_LLPT_LON][:] lat f[NOM_LLPT_LAT][:]这个查找表的尺寸可能与波段数据完全一致也可能是降采样后的。如果遇到降采样版本需要先对查找表做插值或者直接用最近邻索引让纬度数组和亮温数组形状一致。查找表的值范围也有讲究有的经度是 0 到 360有的是 -180 到 180。我会在画图前先做个规整lon np.where(lon 180, lon - 360, lon)这是一个很实用的统一方式。先把经度范围压到 -180 到 180之后不管是用 Cartopy 画地图还是转成 GeoTIFF都不会出现坐标跑到地图另一侧的问题。参数 lon 是原始经度查找表np.where 做条件替换不改变数组形状。3.4 波段合成与图像渲染单通道亮温图是灰度图实际展示时往往需要把多个波段合成为彩色图像。核心是每个波段的拉伸和叠放def stretch(band_01, lo2, hi98): vmin, vmax np.percentile(band_01, [lo, hi]) band_01 np.clip(band_01, vmin, vmax) return (band_01 - vmin) / (vmax - vmin 1e-6) rgb np.stack([stretch(b_red), stretch(b_green), stretch(b_blue)], axis-1)stretch 函数的作用是把一个波段的数值范围压缩到 0 到 1。这里用百分比截断而不是直接最大最小归一化是为了防止个别极亮噪声点把整幅图拉暗。参数 lo 和 hi 分别控制截断的低百分位和高百分位云图场景里 2% 和 98% 是经验值。将三个波段分别拉伸后拼到最后一维就是一张 RGB 图。红外云图若要体现温度层次可以直接把亮温数组做线性映射再用 reversed 的 colormap 表示低温亮色。4. 跑通全流程配置参数、执行命令与结果验证4.1 配置参数把文件路径和波段号抽出去我第一次跑这类代码时最吃亏的就是把文件名写死在脚本里换个时次就得改代码。这个代码包用 config.yaml 管理输入输出我很认同这种设计input_file: FY4A-_AGRI_FULLEDISK_L1.HDF output_dir: ./output band: 12 mask_earth: trueinput_file 填测试数据的文件名output_dir 是出图目录band 决定读取第几通道mask_earth 控制是否把圆盘外部的空白区域置为 NaN。若代码包里没有 config 解析逻辑用一个简单的 yaml.safe_load 就可以加载import yaml cfg yaml.safe_load(open(config.yaml))这样每次换数据只需要改 yaml 文件。批处理时甚至可以写一个循环把 input_file 依次替换为不同时次的文件名。4.2 执行命令与常用参数主脚本运行方式通常是python read_fy4a.py --config config.yaml如果代码包支持命令行覆盖参数也可以临时指定波段和输出目录python read_fy4a.py --input FY4A_xxxx.HDF --band 12 --output result.png有的实现里每个参数都有默认值像 band 默认 12落到长波红外通道。表里面我把最常用的几个参数整理了一下参数类型说明--inputstrHDF5 文件路径--bandint波段号不同通道对应不同物理含义--outputstr输出图片路径--mask-earthbool是否裁剪地球圆盘外的无效区这里尤其要注意 --band 和通道物理含义的对应。可见光通道适合白天水汽通道看高空风场长波红外全天可用但分辨率相对低。出图时需要根据目标选择。4.3 结果验证不要只看图“像不像”跑出第一张图后先不要急着调色。我会用一小段代码验证数值合理性bt dn_to_radiance(...) print(亮温范围: %.2f ~ %.2f 摄氏度 % (np.nanmin(bt), np.nanmax(bt)))如果波段是 12也就是 10.4 微米左右夏季晴空地表亮温一般在 10 到 40 摄氏度云顶亮温可以低到 -60 摄氏度。看到这个范围基本能确认定标系数用对了。再进一步可以拿经纬度查找表叠加地图海岸线确认定位没有整体偏移。具体做法是把 lon、lat 和亮温数组用散点画在地图上若海岸线完全对不上多半是查找表读取路径或降采样对齐出了问题。5. 常见问题排查与避坑记录五个最容易翻车的点5.1 HDF5 文件打不开或报 EOF 错误现象h5py.File 打开文件后直接抛 OSError说文件不是 HDF5 格式或文件结尾异常。原因就两种一是文件下载不完整二是在 Windows 上把 7z 解压后拿到的文件被二次改名破坏了格式。解决先看文件大小是否和原始数据站点一致再确认文件头是不是 \x89HDF如果是从 FTP 断点下载的重新下完整文件。这类问题看似低级但占了我遇到的数据读取问题三成以上。5.2 亮温数值全部异常出现几万开尔文现象图像能出但亮温最大值是 30000 多明显不物理。原因基本是漏乘 scale 或 offset。L1 数据的 DN 值是 16 位整型范围 0 到 65535如果直接把 DN 当作辐射亮度代进普朗克公式结果会爆炸。解决仔细检查定标系数读取逻辑确认是从文件属性还是从外部参数表读取。我踩过一次坑是因为把 scale 和 offset 的顺序搞反了先加后乘结果低值区域全变成负辐射值亮温变成负几千度。从那以后我每换一种新产品都会先手动验证一个像素的换算过程。5.3 图像左右颠倒或经纬度错位现象云图整体看起来正常但叠加地图后大陆轮廓完全对不上或者图像像在镜子里看一样左右反了。原因是查找表的起始扫描方向和数据数组的行列方向不一致不同版本的产品可能不一样。解决先做一个极简验证找一个容易识别的海岸线像素读它的经纬度再把它画在地图上对比。全圆盘图常用 np.fliplr 或 np.flipud 修正方向。记住一个原则在配准这一步多做一次可视化验证永远比后面处理完再发现错误划算。5.4 一次加载多个通道把内存吃满现象同时读 14 个通道做合成机器直接卡死。原因是每个通道都是 float64 数组全圆盘数据 14 个波段叠一起对内存压力很大。解决不要一次性把全部波段读进内存。按需读取先明确到底需要哪几个波段做合成处理完一个通道立刻释放引用。若必须全波段分析可以采用分块读取用 h5py 的 memmap 或 dask 数组按块读入只做必要计算并累积统计量。参数上我会在 config.yaml 里加一个 process_channels 列表白名单之外的通道一律不读。5.5 多通道拼接出“花斑图”不同波段之间对不齐现象用可见光和长波红外做 RGB 合成云图边缘出现红蓝重影。原因是不同波段空间分辨率不一致FY-4A 部分通道分辨率存在差异直接按像素序号拼就会错位。解决先统一分辨率。以最高分辨率通道为基准其余通道用双线性插值重采样到同一尺寸。代码实现可以交给 scipy.ndimage.zoom也可以用 PyTorch 的 interpolate但注意保持经纬度查找表不变。重采样后做一次像素级对比保证轮廓对齐再进合成流程。6. 二次开发把读取代码变成批量处理工具代码包本身是一个可运行的 Demo但它真正值钱的地方在于可以被快速改造成生产管线。我自己的习惯是拿到这种项目先做三件事批量扫描、GeoTIFF 输出、配置外置。批处理改造很简单。把单文件入口包成一个函数参数是 input_path 和 output_path然后用 os.walk 扫描目录把所有 .HDF 文件全部处理一遍import glob files glob.glob(./data/*.HDF) for f in files: proc_one(f, cfg)若要对接 GIS 工具输出 GeoTIFF 是最常用的方向。借助 rasterio把亮温数组写到磁盘时需要把经纬度查找表写入地理变换信息import rasterio with rasterio.open(bt.tif, w, driverGTiff, heightbt.shape[0], widthbt.shape[1], count1, dtypefloat32) as dst: dst.write(bt.astype(float32), 1)这里把 float64 转成 float32 能省一半磁盘空间对云图产品足够。配合 PyYAML 的配置体系整个工具就变成一个可以接入定时任务的批处理管道输入目录下一有新文件处理完自动在 output 里新增一张带坐标的云图。还记得我第一次拿到某批 FY-4A 测试数据时因为想当然地写死了数据集路径结果换了文件版本就报 KeyError。从那以后我每次拿到一种新卫星数据哪怕再急也会先花十分钟把数据集列表和属性打印出来看一遍再决定要不要写死任何路径这个习惯帮我避开了不少坑。这份代码包直接下载解压后对照上面的流程就能跑出第一张带经纬度的云图希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

TinyML开发板选型指南:为什么现成板子不够用及自研硬件全流程

TinyML开发板选型指南:为什么现成板子不够用及自研硬件全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/21 1:45:38
气体传感模组低功耗物联网设计:从原理选型到功耗预算的工程实践

气体传感模组低功耗物联网设计:从原理选型到功耗预算的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/21 1:45:38
可视化分支与提交历史:Gitnuro 跨平台 Git 客户端

可视化分支与提交历史:Gitnuro 跨平台 Git 客户端

可视化分支与提交历史:Gitnuro 跨平台 Git 客户端 【免费下载链接】Gitnuro A FOSS Git multiplatform client for newbies and pros 项目地址: https://gitcode.com/GitHub_Trending/gi/Gitnuro Gitnuro 是一个基于 Compose Desktop 和 JGit 的跨平台 Git 客…

📅 2026/10/21 1:40:36
MORE NEWS

更多资讯

📰

DLMS/COSEM 蓝皮书解读(四十一):IEC 61334-4-32 LLC setup(class_id = 55)—— S-FSK 的 LLC 子层“参数本“

DLMS/COSEM 蓝皮书解读(四十一):IEC 61334-4-32 LLC setup(class_id 55)—— S-FSK 的 LLC 子层"参数本":帧长上限 RDR 待读清单系列说明:本系列基于 DLMS UA《Blue Book&#xff0…

📰

NVQLink:破解量子与经典计算互连瓶颈的开放式架构

量子计算这两年热度一直很高,不过大多数人聊的都是比特数、保真度、纠错阈值这些“芯片内部”的话题。真正把一台量子处理器装进数据中心机柜之后,你会发现最大的瓶颈其实不在量子比特本身,而在它和外面那套经典计算系统之间的互连层。NVQLin…

📰

ABS建模避坑指南:从滑移率物理一致性到制动器热-机耦合

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

ABAP 里的引路蜂,如何把业务带回可识别的起点

《仙剑奇侠传 1》的引路蜂有一个很明确的用途,使用后回到迷宫起点。把它放进企业系统,问题就变得有意思了。我们正在处理一张单据,页面已经跳过好几层,后台执行了校验,可能还调用了另一个系统。此时想要「回到起点」,究竟是让屏幕显示最初的页面,找出这张单据从哪里进入…

📰

YOLO模型从PyTorch到RKNN的完整转换链路:ONNX中转与量化部署指南

做边缘端部署的人,只要碰过瑞芯微的RKNN NPU,多半都绕不开这条链路:把Ultralytics框架训练好的YOLO模型,从PyTorch的.pt格式,转成ONNX,再转成RKNN格式。这篇内容就围绕这条转换链路展开,把每一步…

📰

CTGAN核心机制拆解:表格数据生成原理、应用与排坑指南

先说个我实际踩过的坑。有一段时间我接了个数据脱敏的活儿,对方要求在不泄露某些敏感字段的前提下,把一批几万行的表格数据整体“复制”一份出来,供开发和测试环境使用。我当时第一反应是上 GAN,因为在图像领域拟合效果已经很成熟…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬