找回密码
 会员注册
查看: 193|回复: 0

雷达组网拼图3.0数据掌握和python解析处理

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64021
发表于 2024-9-13 16:15:43 | 显示全部楼层 |阅读模式
废话不多说,先展示雷达图以反射率为例:核对数据格式Z_RADA_C_BABJ_20240705043615_P_DOR_ACHN_CREF_20240705_043000.bin1数据分析认识1.组网产品分类: 组网产品包括组网混合扫描反射率(HSR),组网组合反射率(CR)、组网最大反射率高度(CRH)、组网回波顶高产品(ET)、组网垂直累积液态水含量(VIL)、组网一小时降水(OHP)、组网等高面反射率(CAP)。数据频次为10分钟2.文件名结构: Z_RADA_C_BABJ_{YYYYMMDDhhmmss}_P_DOR_{AREACODE}_{DTYPE}_{YYYYMMDD_hhmmss}.bin,{}内表示为命名规则中的变量,定义依次如下: YYYYMMDDhhmmss:产品生成时间,年月日时分秒 AREACODE:区域号,如全国区域:ACHN DTYPE:雷达产品类型简写,如QREF YYYYMMDD_hhmmss:资料观测时间,年月日_时分秒3.文件格式: 组网拼图产品文件格式定义为:文件头+数据块。文件头中定义了文件卷标(文件固定标识、文件格式版本代码、文件字节数)、 产品描述(拼图产品编号、坐标类型、产品代码、产品描述、产品数据起始位置、产品数据字节数)、数据时间(数据时钟、观测时间年、月、日等)、 数据区信息(数据区的南、西、北、东边界等),具体定义如下表所示。文件头共占用256字节,实际定义变量占176字节, 后面的80字节为预留空间。数据块为nX*nY(文件头中定义变量)个short类型数组,根据文件头中的Compress标志位判断是否压缩123456789101112131415总体数据包括文件头和数据块,数据为bin格式二进制,根据文件格式将二进制转化为实际的数据类型,其余不过多分析,到这里,我们基本了解了组网产品的基本情况,接下来我们直接读取和出雷达图。#雷达拼图3.0数据绘制雷达图*************#设置日志logger=logging.getLogger('RADA_L3_MST_CREF_QC')logging.basicConfig(level=logging.INFO)#假设雷达颜色映射表radarColoMap已定义,并且是Python列表格式defgroup(array,sub_group_length):foriinrange(0,len(array),sub_group_length):yieldarray[i:i+sub_group_length]defread_string(buffer,length,encoding='gb2312'):returnbuffer[:length].decode(encoding).replace('\x00','').replace('','')defunbzip2_decompress(data):try:returnbz2.decompress(data)exceptExceptionase:logger.error(f"Errordecompressingbz2data:{e}")returnNonedefget_path(path,path1):#找到path1在path中的结束位置end_index=path.find(path1)+len(path1)#截取从path1之后的部分sub_path=path[end_index:]returnsub_pathclassBinaryReader:def__init__(self,buffer,is_little_endian=True):self.buffer=bufferself.index=0self.is_little_endian=is_little_endiandefseek(self,offset,origin=0):iforigin==0:#Setabsolutepositionself.index=offseteliforigin==1:#Setrelativetocurrentpositionself.index+=offseteliforigin==2:#Setrelativetoendoffileself.index=len(self.buffer)+offsetdefread_bytes(self,length):data=self.buffer[self.index:self.index+length]self.index+=lengthreturndatadefread_string(self,length):returnread_string(self.read_bytes(length),length)defread_int(self):fmt='i'value,=struct.unpack_from(fmt,self.buffer,self.index)self.index+=struct.calcsize(fmt)returnvaluedefread_int16(self):fmt='h'value,=struct.unpack_from(fmt,self.buffer,self.index)self.index+=struct.calcsize(fmt)returnvaluedefreadHeader(br):#读取文件头信息label=br.read_string(4)#文件固定标识version=br.read_string(4)#文件格式版本代码file_bytes=br.read_int()#文件字节数mosaic_id=br.read_int16()#拼图产品编号coordinate=br.read_int16()varname=br.read_string(8)description=br.read_string(64)BlockPos=br.read_int()BlockLen=br.read_int()TimeZone=br.read_int()yr=br.read_int16()mon=br.read_int16()day=br.read_int16()hr=br.read_int16()min=br.read_int16()sec=br.read_int16()ObsSeconds=br.read_int()ObsDates=br.read_int16()GenDates=br.read_int16()GenSeconds=br.read_int()latMin=br.read_int()/1000lonMin=br.read_int()/1000latMax=br.read_int()/1000lonMax=br.read_int()/1000cx=br.read_int()/1000cy=br.read_int()/1000#读取数据区前的信息nX=br.read_int()#列数nY=br.read_int()#行数dx=br.read_int()/10000dy=br.read_int()/10000height=br.read_int16()compress=br.read_int16()num_of_radars=br.read_int()UnZipBytes=br.read_int()scale=br.read_int16()unUsed=br.read_int16()RgnID=br.read_string(8)units=br.read_string(8)reserved=br.read_string(8)returnyr,mon,day,nX,nY,latMin,latMax,lonMin,lonMax,scale#读取数据字节defreadData(buffer):#读取数据区#br.seek(256)#跳过未压缩的256字节头部compressed_data=unbzip2_decompress(buffer[256:])returncompressed_data#解压bz2数据defunbzip2_decompress(data):try:returnbz2.decompress(data)exceptExceptionase:logger.error(f"Errordecompressingbz2data:{e}")returnNoneclassRadarWarnRequest(BaseModel):filePath:AnyradarValue:AnylonMin:AnylonMax:AnylatMin:AnylatMax:AnyprovinceId:AnyclassRADA_L3_MST_CREF_QCstaticmethoddefparse(file_path,radarValue,lonMin,lonMax,latMin,latMax,provinceId):withopen(file_path,'rb')asf:buffer=f.read()br=BinaryReader(buffer,is_little_endian=True)yr,mon,day,nX,nY,lat_Min,lat_Max,lon_Min,lon_Max,scale=readHeader(br)compressed_data=readData(buffer)ifcompressed_data:data=np.frombuffer(compressed_data,dtype=np.int16)array_2d=data.reshape((nY,nX))array_2d=array_2d/scale#数据放大倍数array_2d=np.where((array_2d>=0)&(array_2d75)|(array_2d
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 01:04 , Processed in 0.327686 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表