python读取气象雷达资料

通常拿到的雷达资料后缀名为“latlon”,如何将其处理为常用的nc格式呢,往下看看吧。

import os
import struct
import numpy as np
from netCDF4 import Dataset
#import sys


class Rada2nc:
    def __init__(self, filename):
        # print filename
        self.fp = open(filename, "rb")

    def __del__(self):
        # print 'close'
        self.fp.close()

    def __readString(self, length):
        bufr = self.fp.read(length)
        res = struct.unpack('' + str(len(bufr)) + 's', bufr)[0]
        res = res.replace('\xfe', '').replace('\x00', '')
        # print res
        return res

    def __readShort(self):
        bufr = self.fp.read(2)
        res = struct.unpack('h', bufr)[0]
        # print res
        return res

    def __readUShort(self):
        bufr = self.fp.read(2)
        res = struct.unpack('H', bufr)[0]
        # print res
        return res

    def __readInt(self):
        bufr = self.fp.read(4)
        res = struct.unpack('i', bufr)[0]
        # print res
        return res

    def __readUInt(self):
        bufr = self.fp.read(4)
        res = struct.unpack('I', bufr)[0]
        # print res
        return res

    def __readLongLong(self):
        bufr = self.fp.read(8)
        res = struct.unpack('q', bufr)[0]
        # print res
        return res

    def __readULongLong(self):
        bufr = self.fp.read(8)
        res = struct.unpack('Q', bufr)[0]
        # print res
        return res

    def __readFloat(self):
        bufr = self.fp.read(4)
        res = struct.unpack('f', bufr)[0]
        # print res
        return res

    def __readHead(self):
        self.dataName = self.__readString(128)
        self.varName = self.__readString(32)
        self.unitName = self.__readString(16)
        self.DataLabel = self.__readUShort()
        self.UnitLen = self.__readShort()
        self.Slat = self.__readFloat()
        self.Wlon = self.__readFloat()
        self.Nlat = self.__readFloat()
        self.Elon = self.__readFloat()
        self.Clat = self.__readFloat()
        self.Clon = self.__readFloat()
        self.Rows = self.__readInt()
        self.Cols = self.__readInt()
        self.dlat = self.__readFloat()
        self.dlon = self.__readFloat()
        self.nodata = self.__readFloat()
        self.levelbytes = self.__readInt()
        self.levelnum = self.__readShort()
        self.amp = self.__readShort()
        self.compmode = self.__readShort()
        self.dates = self.__readUShort()
        self.seconds = self.__readInt()
        self.min_value = self.__readShort()
        self.max_value = self.__readShort()
        # reserved1 = self.__readShort()
        # reserved1 = self.__readShort()
        # reserved1 = self.__readShort()
        # reserved1 = self.__readShort()
        # reserved1 = self.__readShort()
        # reserved1 = self.__readShort()
 
    def save2nc(self, outname):
        self.__readHead()
        Y = self.__readShort()
        X = self.__readShort()
        N = self.__readShort()
        img = np.zeros((self.Rows, self.Cols))
        img[:] = -1
        while (X > -1 and Y > -1 and N > -1):
            value = 0
            for i in range(N):
                value = self.__readShort()
                if value == -319:
                    value = 0
                img[Y, X + i] = value
            # print value
            Y = self.__readShort()
            X = self.__readShort()
            N = self.__readShort()

        ncfile = Dataset(outname, 'w')
        ncfile.createDimension('lat', self.Rows)
        ncfile.createDimension('lon', self.Cols)
        lon = ncfile.createVariable('lon', np.float, ('lon'))
        lat = ncfile.createVariable('lat', np.float, ('lat'))
        QREF = ncfile.createVariable('CREF', np.int16, ('lat', 'lon'))
        for i in range(self.Cols):
            lon[i] = self.Wlon + (i + 0.5) * self.dlon
        for i in range(self.Rows):
            lat[i] = self.Nlat - (i + 0.5) * self.dlat
        QREF[:] = img[:]
        ncfile.close()

if __name__ == "__main__":

        myRada = Rada2nc(infile)
        myRada.save2nc(outfile)

完结,撒花~~

有问题欢迎随时私我。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
A:Python可以使用开源气象数据处理软件包如MetPy、Xarray、Cartopy等来处理天气雷达数据。其中MetPy可以用于处理气象数据,Xarray可以用于处理多维数组的数据,Cartopy是一个图形可视化工具包。 可以使用如下代码获取天气雷达数据: ``` import metpy import xarray as xr # Replace `filename` with the filename of the radar data file radar_data = xr.open_dataset(filename) # Print basic information about the radar data print(radar_data) ``` 在获取数据之后,可以使用MetPy从雷达数据中分析天气信息,例如: ``` import metpy.calc as mpcalc # Select the reflectivity variable from the radar data refl = radar_data['Reflectivity'] # Compute the equivalent reflectivity factor z_e = mpcalc.calculate_z(refl) # Print the minimum and maximum reflectivity factor values print(z_e.min(), z_e.max()) ``` 通过上述代码,可以获取雷达数据中的等效反射率因子,该因子能够反映出不同云层的降水强度。 此外,你还可以使用Cartopy来可视化雷达数据: ``` import cartopy.crs as ccrs import matplotlib.pyplot as plt # Create a map projection centered on the radar location proj = ccrs.LambertConformal( central_latitude=radar_data.RadarLatitude, central_longitude=radar_data.RadarLongitude) # Plot the reflectivity data on the map fig = plt.figure(figsize=(8, 8)) ax = fig.add_subplot(1, 1, 1, projection=proj) ax.imshow(refl.values, extent=(xmin, xmax, ymin, ymax), origin='upper', cmap='pyart_HomeyerRainbow_r', interpolation='none') # Add the radar location to the plot ax.plot(radar_data.RadarLongitude, radar_data.RadarLatitude, 'k.', markersize=10, transform=ccrs.PlateCarree(), label='Radar') # Add a legend to the plot plt.legend() # Show the plot plt.show() ``` 通过上述代码,可以将雷达数据可视化为具有图像信息的地图,增强用户对天气雷达数据的理解和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值