"""
pyart.aux_io.rad4alp_bin_reader
===============================
Routines for putting MeteoSwiss operational radar data contained in binary
files into grid object.
.. autosummary::
:toctree: generated/
read_bin
"""
import os
import datetime
from warnings import warn
import numpy as np
from ..config import FileMetadata
from ..io.common import _test_arguments
from ..core.grid import Grid
BIN_FIELD_NAMES = {
'ACC': 'rainfall_accumulation',
'ARC': 'rainfall_accumulation'
}
[docs]def read_bin(filename, additional_metadata=None, chy0=255., chx0=-160.,
xres=1., yres=1., nx=710, ny=640, nz=1, **kwargs):
"""
Read a MeteoSwiss operational radar data binary file.
Parameters
----------
filename : str
Name of the file to read.
additional_metadata : dict of dicts, optional
Dictionary of dictionaries to retrieve metadata during this read.
This metadata is not used during any successive file reads unless
explicitly included. A value of None, the default, will not
introduct any addition metadata and the file specific or default
metadata as specified by the Py-ART configuration file will be used.
chy0, chx0 : float
Swiss coordinates position of the south-western point in the grid
xres, yres : float
resolution of each grid point [km]
nx, ny, nz : int
dimensions of the grid
Returns
-------
grid : Grid
Grid object containing data the data.
"""
# test for non empty kwargs
_test_arguments(kwargs)
try:
with open(filename, 'rb') as file:
file.readline()
data = np.fromfile(file, dtype=np.dtype('float32'), count=nx*ny*4)
data = np.ma.masked_equal(data, -1.)
data = np.transpose(np.reshape(data, [nx, ny], order='F'))[::-1, :]
except EnvironmentError as ee:
warn(str(ee))
warn('Unable to read file '+filename)
return None, None
# reserved_variables = [
# 'time', 'x', 'y', 'z',
# 'origin_latitude', 'origin_longitude', 'origin_altitude',
# 'point_x', 'point_y', 'point_z', 'projection',
# 'point_latitude', 'point_longitude', 'point_altitude',
# 'radar_latitude', 'radar_longitude', 'radar_altitude',
# 'radar_name', 'radar_time', 'base_time', 'time_offset',
# 'ProjectionCoordinateSystem']
# metadata
metadata = dict()
filemetadata = FileMetadata('BIN', BIN_FIELD_NAMES, additional_metadata)
# required reserved variables
time = filemetadata('grid_time')
origin_latitude = filemetadata('origin_latitude')
origin_longitude = filemetadata('origin_longitude')
origin_altitude = filemetadata('origin_altitude')
x = filemetadata('x')
y = filemetadata('y')
z = filemetadata('z')
x['data'] = 1000.*(np.arange(nx)*xres+chy0+xres/2.-600.)
y['data'] = 1000.*(np.arange(ny)*yres+chx0+yres/2.-200.)
z['data'] = np.array([0.])
# Origin of LV03 Swiss coordinates
origin_latitude['data'] = np.array([46.951082877])
origin_longitude['data'] = np.array([7.438632495])
origin_altitude['data'] = np.array([0.])
bfile = os.path.basename(filename)
# Time
prod_time = (
datetime.datetime.strptime(bfile[3:12], '%y%j%H%M') -
datetime.timedelta(minutes=1440))
time['units'] = 'seconds since '+prod_time.strftime('%Y-%m-%d %H:%M:%S')
time['data'] = np.array([1440.*60.])
# projection (Swiss Oblique Mercator)
projection = {
'proj': 'somerc',
'_include_lon_0_lat_0': True
}
# read in the fields
datatype = bfile[0:3]
fields = {}
field = filemetadata.get_field_name(datatype)
field_dict = filemetadata(field)
field_dict['data'] = np.broadcast_to(data, (nz, ny, nx))
fields[field] = field_dict
# radar variables
radar_latitude = None
radar_longitude = None
radar_altitude = None
radar_name = None
radar_time = None
return Grid(
time, fields, metadata,
origin_latitude, origin_longitude, origin_altitude, x, y, z,
projection=projection,
radar_latitude=radar_latitude, radar_longitude=radar_longitude,
radar_altitude=radar_altitude, radar_name=radar_name,
radar_time=radar_time)