通常拿到的雷达资料后缀名为“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)
完结,撒花~~
有问题欢迎随时私我。