用Python和Basemap搞定FY-2G卫星TBB云图:从HDF文件到可视化地图的保姆级教程

张开发
2026/4/21 4:12:32 15 分钟阅读

分享文章

用Python和Basemap搞定FY-2G卫星TBB云图:从HDF文件到可视化地图的保姆级教程
用Python和Basemap实现FY-2G卫星TBB云图可视化的完整指南风云卫星的TBB亮温数据是气象分析和灾害预警的重要依据。本文将带你从零开始使用Python的Basemap工具包将FY-2G卫星的HDF格式原始数据转化为专业级可视化云图。无论你是气象爱好者还是GIS开发者这套完整的工作流都能帮你快速上手卫星数据可视化。1. 环境准备与数据获取1.1 安装必要的Python库处理FY-2G卫星数据需要以下几个关键库pip install numpy h5py matplotlib basemap注意Basemap在Windows系统安装时可能会遇到依赖问题。如果安装失败可以尝试先安装预编译版本conda install -c anaconda basemap1.2 获取FY-2G卫星数据FY-2G卫星的原始数据通常包含两个关键文件HDF文件如FY2G_FDI_ALL_NOM_20190811_1200.hdf存储亮温观测值经纬度对照表如NOM_ITG_2288_2288(0E0N)_LE.dat提供每个像素点的地理坐标这些数据可以从中国气象局国家卫星气象中心官网获取或者通过API接口自动下载。2. 数据读取与预处理2.1 解析HDF文件中的亮温数据HDF5是风云卫星数据的标准存储格式我们可以使用h5py库高效读取import h5py import numpy as np def read_tbb_from_hdf(hdf_path): with h5py.File(hdf_path, r) as hdf: # 读取红外通道数据 calibration hdf[/CALChannelIR1][:] observation hdf[/NOMChannelIR1][:] # 初始化亮温矩阵 tbb np.zeros_like(observation, dtypenp.float32) # 将原始计数值转换为亮温 valid_pixels (observation ! 65535) (observation ! 65534) tbb[valid_pixels] calibration[0][observation[valid_pixels]] return tbb.T # 转置以匹配地理坐标2.2 处理经纬度对照表FY-2G的经纬度信息存储在二进制.dat文件中需要特殊处理def read_geo_coordinates(dat_path, satellite_longitude104.5): with open(dat_path, rb) as f: data np.fromfile(f, dtypefloat32) data data.reshape([2288, 2288, 2], orderF) lon data[:, :, 0] satellite_longitude lat data[:, :, 1] return lon, lat提示不同风云卫星的经度偏移值可能不同FY-2G通常为104.5度使用时请确认卫星的实际位置。3. 地图投影与可视化3.1 配置Basemap投影参数Basemap提供了多种地图投影方式对于东亚区域的卫星云图我们推荐使用等距圆柱投影from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt def setup_basemap(region[110, 140, 10, 40]): 设置地图投影参数 region格式: [min_lon, max_lon, min_lat, max_lat] m Basemap( projectioncyl, llcrnrlonregion[0], urcrnrlonregion[1], llcrnrlatregion[2], urcrnrlatregion[3], resolutioni ) return m3.2 绘制专业级云图结合前两步处理的数据我们可以生成完整的TBB云图def plot_tbb_map(lon, lat, tbb, save_pathNone): # 设置图形和投影 plt.figure(figsize(12, 8)) m setup_basemap() # 绘制地理要素 m.drawcoastlines(linewidth0.5) m.drawcountries(linewidth0.5) m.drawparallels(np.arange(10, 41, 5), labels[1,0,0,0]) m.drawmeridians(np.arange(110, 141, 5), labels[0,0,0,1]) # 转换坐标并绘制云图 x, y m(lon, lat) levels np.linspace(180, 300, 256) cs m.contourf(x, y, tbb, levelslevels, cmapjet) # 添加色标 cbar m.colorbar(cs, locationright, pad5%) cbar.set_label(Brightness Temperature (K)) # 添加标题 plt.title(FY-2G TBB Cloud Image, fontsize14) if save_path: plt.savefig(save_path, dpi300, bbox_inchestight) plt.show()4. 高级技巧与问题排查4.1 优化可视化效果默认的云图可能不够美观我们可以通过以下方式提升视觉效果色标调整使用离散化的色阶而非连续渐变levels np.arange(180, 301, 5) # 5K间隔 cs m.contourf(x, y, tbb, levelslevels, cmapnipy_spectral)添加地形阴影m.shadedrelief(scale0.2) # 在contourf之前添加标记关键区域shp_info m.readshapefile(china_coastline, coastline)4.2 常见问题解决方案问题1Basemap绘制速度慢解决方案降低分辨率或使用更简单的投影m Basemap(projectionmill, resolutionl, ...)问题2色标显示异常解决方案明确设置数值范围cs m.contourf(x, y, tbb, levelslevels, vmin180, vmax300)问题3内存不足解决方案处理前裁剪数据区域mask (lon 110) (lon 140) (lat 10) (lat 40) lon, lat, tbb lon[mask], lat[mask], tbb[mask]5. 自动化工作流构建对于需要定期处理卫星数据的用户可以建立自动化处理流程import os from datetime import datetime def process_fy2g_data(hdf_dir, dat_path, output_dir): 批量处理FY-2G数据 os.makedirs(output_dir, exist_okTrue) for hdf_file in os.listdir(hdf_dir): if hdf_file.endswith(.hdf): # 解析日期时间 dt_str hdf_file.split(_)[-2] dt datetime.strptime(dt_str, %Y%m%d%H%M) # 处理数据 tbb read_tbb_from_hdf(os.path.join(hdf_dir, hdf_file)) lon, lat read_geo_coordinates(dat_path) # 可视化并保存 output_path os.path.join(output_dir, fTBB_{dt_str}.png) plot_tbb_map(lon, lat, tbb, save_pathoutput_path)这套代码可以轻松集成到气象业务系统中实现FY-2G数据的自动下载、处理和可视化。

更多文章