python处理卫星云图获取亮温值

在处理卫星云图hdf文件时,matlab非常好用,但随着python的流行,还是想学习一下python处理卫星云图数据获取亮温值。

我处理数据的前提是:

  1. 根据最佳路径数据集,获取经纬度和时间。
  2. 根据时间找对应的hdf文件,获取其中的经纬度,然后根据hdf文件中的经度确定是哪颗卫星的。
  3. 在全圆盘标对称文件经纬度对照表dat文件获取经纬度时加上相应的经度。
  4. 最后根据最佳路径的经纬度获取dat文件中最近格点的经纬度索引,再通过hdf文件获得亮温值。

1.处理hdf文件

import h5py
hdfFile = h5py.File('F:/新建文件夹/Satellite_Imagery/IR_data/韦森特/FY2D_FDI_ALL_NOM_20120723_1945.hdf', 'r')
db1 = hdfFile['/CALChannelIR1']
hw1 = hdfFile['/NOMChannelIR1']
db2 = hdfFile['/CALChannelIR2']
hw2 = hdfFile['/NOMChannelIR2']
db3 = hdfFile['/CALChannelIR3']
hw3 = hdfFile['/NOMChannelIR3']
db4 = hdfFile['/CALChannelIR4']
hw4 = hdfFile['/NOMChannelIR4']
infoh = hdfFile['/NomFileInfo']

a = hdfFile['NomFileInfo'][()]
print(a[0][3])  # 获取纬度
print(a[0][4])  # 获取经度

对于风云卫星的数据格式,可以查阅相应的资料,获取静止气象卫星的数据格式。这里不再详细描述。

亮温值的获取分为四个IR通道和一个可见光通道,不同通道的用处不同,根据自己的需求选取数据。
在这里插入图片描述
对于获取卫星经纬度等数据,需要,根据NomFileInfo的数据集分析。

a = hdfFile['NomFileInfo'][()]
print(a)

[(b'FY2D', b'NOM', b'Nomalized Projection Full Disc Image', 0., 86.5, 35785864., b'fit', 2012, 7, 10, 12, 34, 0, 2012, 7, 23, 19, 45, 1, 2012, 7, 23, 19, 58, 58, 2012, 7, 23, 20, 0, 27, 6378137., 3.5e-05, 0.00014, 298.25722356, b'NOM Fit HDF5')]

对应信息见下图数据集。
在这里插入图片描述在这里插入图片描述
获取亮温值:

获取通道1的亮温值,代码如下:

hw = hw1[()]  # 通道IR1,定标表
db = db1[()]  # 获取定标表的值
tb = np.zeros(shape=(2288, 2288))  # 2288*2288的图像每个具体的亮温值
for i in range(2288):
    for j in range(2288):
        if hw[i][j] == 65535 or hw[i][j] == 65534:  # 判断缺省值
            tb[i][j] = 0
        else:
            a = hw[i][j]
            tb[i][j] = db[0][a]
print(tb)
tb = tb.T  # 注意需要转置

2. 处理dat文件

对于FY2气象卫星而言,经纬度查找表文件(NOM_ITG_2288_2288(0E0N)_LE.zip)可以从网上下载。数据解压之后,里面有三个文件,分别是:
在这里插入图片描述在数据说明文件中,详细说明了经纬度查找表数据的使用方法,同时针对FY2系列卫星的经度进行了说明,由于上述经纬度数据是以中心点为0度经度生成的,所以对于FY2的数据,需要在经度数据上加上卫星所在的经度。

在这里插入图片描述

5FY-2G104.5°E
6FY-2H79°E

对于不同的星可以根据hdf文件中的经度,判断对应的查找表的经度。

下面以H星为例,读取dat文件,获取网格经纬度

lonlatfile = 'F:/Satellite_Imagery/Code/NOM_ITG_2288_2288(0E0N)_LE.dat'
    with open(lonlatfile, 'rb') as f:
        #lon_fy = np.fromfile(f, count=2288 * 2288, dtype='float32') + 79  # 先存经度,根据卫星的不同加上对应的经度值
        #lat_fy = np.fromfile(f, count=2288 * 2288, dtype='float32')  # 再存纬度
        data = np.fromfile(f, dtype='float32')
        data = data.reshape([2288, 2288, 2], order='F')
    #lon = lon_fy.reshape([2288, 2288], order='F')
    #lat = lat_fy.reshape([2288, 2288], order='F')
    lon = data[:, :, 0] + 104.5
    lat = data[:, :, 1]

这里需要注意的是,需要先取出来经度,再取出纬度,这是经纬度在dat文件中的存储顺序,然后加上卫星的经度,这里是79,故经度加79,获取经纬度。

# 经度表
[[379. 379. 379. ... 379. 379. 379.]
 [379. 379. 379. ... 379. 379. 379.]
 [379. 379. 379. ... 379. 379. 379.]
 ...
 [379. 379. 379. ... 379. 379. 379.]
 [379. 379. 379. ... 379. 379. 379.]
 [379. 379. 379. ... 379. 379. 379.]]
# 纬度表 
 [[300. 300. 300. ... 300. 300. 300.]
 [300. 300. 300. ... 300. 300. 300.]
 [300. 300. 300. ... 300. 300. 300.]
 ...
 [300. 300. 300. ... 300. 300. 300.]
 [300. 300. 300. ... 300. 300. 300.]
 [300. 300. 300. ... 300. 300. 300.]]

这样就获取了dat文件中的网格经纬度,即2288*2288的对照表,这样根据最佳路径数据集中的经纬度,找到网格中最近的经纬度。
在这里插入图片描述
注:因为网格存储的经纬度不是等间距的,所以不能直接近似找最近的点,需要根据角度计算距离,找到网格上离所求经纬度最近的网格点,找到对应的索引值,再根据索引值找到亮温值。

以上就是我通过python读取hdf,dat文件,根据经纬度获取卫星云图的亮温值的过程,欢迎大家讨论。

绘制登陆时的卫星云图亮温值请参考python绘制登陆时的卫星云图(TBB)

  • 14
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要绘制卫星云图,需要使用Python中的一些科学计算和可视化库。下面是一些步骤和代码示例来实现这个目标: 1. 安装必要的库 你需要安装以下库: - numpy: 用于处理数组和矩阵 - matplotlib: 用于绘制图形 - basemap: 用于绘制地图和投影坐标系 - pillow: 用于处理图像 你可以使用pip install命令来安装这些库。 2. 下载数据 卫星云图通常是从气象卫星获取的。你可以从以下网站下载一些示例数据: - https://www.ncdc.noaa.gov/satellite-data/satellite-data-access-viewer - https://www.goes.noaa.gov/f_himawari-8.html 下载数据后,你需要将它们保存在本地。 3. 加载数据 使用numpy库中的load函数来加载数据。例如,如果你的数据保存在文件名为data.npy的文件中,你可以使用以下代码来加载数据: ```python import numpy as np data = np.load('data.npy') ``` 4. 绘制图像 使用matplotlib库来绘制图像。你可以使用imshow函数来显示图像。例如,下面的代码将显示data中的图像: ```python import matplotlib.pyplot as plt plt.imshow(data) plt.show() ``` 5. 添加地图 使用basemap库来添加地图和投影坐标系。例如,下面的代码将在图像上添加地图: ```python from mpl_toolkits.basemap import Basemap m = Basemap(projection='mill', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180) m.drawcoastlines() m.drawcountries() plt.imshow(data, origin='upper', extent=[-180, 180, -90, 90]) plt.show() ``` 6. 保存图像 最后,你可以使用savefig函数将图像保存到本地。例如,下面的代码将保存图像为png格式的文件: ```python plt.savefig('cloud_map.png', dpi=300, bbox_inches='tight') ``` 这是一个完整的示例代码: ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap # 加载数据 data = np.load('data.npy') # 创建地图 m = Basemap(projection='mill', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180) # 添加地图 m.drawcoastlines() m.drawcountries() # 绘制图像 plt.imshow(data, origin='upper', extent=[-180, 180, -90, 90]) # 保存图像 plt.savefig('cloud_map.png', dpi=300, bbox_inches='tight') ``` 运行这段代码,你将得到一个卫星云图,并将它保存到本地。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值