FY-3G双频单极化Ku波段一维相控阵降水测量雷达二级产品

FY-3G降水测量雷达的二级产品按照雷达以及轨道进行划分,分为Ku雷达升轨、Ku雷达降轨、Ka雷达升轨、Ka雷达降轨以及DPR升轨和DPR降轨。二级产品里包含了亮带检测、降水分类,三维滴谱廓线、三维降水率廓线以及三维等效雷达反射率因子廓线等。轨道产品未做投影处理,为原始轨道分辨率。

FY3G_PMR--_ORBA_L2_KuR_MLT_NUL_YYYYMMDD_HHmm_5000M_V0.HDF 升轨
FY3G_PMR--_ORBD_L2_KuR_MLT_NUL_YYYYMMDD_HHmm_5000M_V0.HDF 降轨

值得注意的是SLV反演数据集中使用的环境参数来自于ERA5再分析资料。

VER环境参数模块包含了:binZero 0°C距离库、 DegattenuationNP 非降水粒子衰减系数、piaNP 非降水粒子路径积分衰减、 sigmaZeroNPCorrected 非降水粒子衰减订正后的地表后向散射截面、heightZeroDeg 0°C层高度

估计地表衰减订正后的雷达反射率因子(zFactorCorrectedESurfacefloat32,维数:nscan×nray)单位为dBZ,有效值范围070

地理信息数据集为每个波束分别计算了地球椭球表面(第一维)和地球椭球之上约 18km 高度(第二维)两个位置的瞬时视场中心的地球经纬度。level默认使用第二维18km高度层地理信息。

"""Test Reader for the FY-3G PMR L2"""

import os
import glob
import h5py
import numpy as np
from datetime import datetime

def autodecode(string, encoding="gbk"):
    return string.decode(encoding) if isinstance(string, bytes) else string

class PMRReader(object):
    """The base class reading FY-3G PMR L2 data.

    Args:
        fname: PMR data path.
        datafield: Scientific datasets field.
        dataset: Scientific dataset.
        level: The first(0) and second(1) dimensions respectively store the geolocation on the ground and at level of 18km above ground.
    """

    def __init__(self, fname, datafield="SLV", dataset="zFactorCorrectedESurface", level=1):
        self.file = h5py.File(fname, "r")
        self.attrs = {k: autodecode(v) for k, v in self.file.attrs.items()}
        self.datafield = datafield
        self.dataset = dataset
        self.level = level
        try:
            if self.attrs["Satellite Name"] == "FY-3G":
                self._reader()
            else:
                raise Exception(f"Unable to decode data:\n{fname}")
        except Exception as e:
            raise e

    def _reader(self):
        lons, lats = self.file["Geo_Fields"]["Longitude"][:], self.file["Geo_Fields"]["Latitude"][:]
        lons[lons==-9999.9] = np.nan
        lats[lats==-9999.9] = np.nan
        dataset = self.file[self.datafield][self.dataset]
        data = dict()
        data["lons"] = lons[:,:,self.level]
        data["lats"] = lats[:,:,self.level]
        data["dataset"] = dataset
        self.data = data

    def all_available_datasets(self, datafield="SLV"):
        return list(self.file[datafield].keys())

    def all_available_datafields(self):
        return list(self.file.keys())

    @property
    def start_time(self):
        start_time = self.attrs["Observing Beginning Date"] + "T" + self.attrs["Observing Beginning Time"] + "Z"
        try:
            return datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%S.%fZ")
        except ValueError:
            return datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%SZ")

    @property
    def end_time(self):
        end_time = self.attrs["Observing Ending Date"] + "T" + self.attrs["Observing Ending Time"] + "Z"
        try:
            return datetime.strptime(end_time, "%Y-%m-%dT%H:%M:%S.%fZ")
        except ValueError:
            return datetime.strptime(end_time, "%Y-%m-%dT%H:%M:%SZ")

if __name__ == "__main__":
    fname = "C:/Users/Administrator/Desktop/FY3G_PMR--_ORBA_L2_KuR_MLT_NUL_20240528_0026_5000M_V0.HDF"
    io = PMRReader(fname, datafield="SLV", dataset="zFactorCorrectedESurface")
    print(io.all_available_datasets())

寂静在喧嚣里低头不语,沉默在黑夜里与目光结交