in sdap/processors/regrid1x1.py [0:0]
def process(self, in_filepath):
in_path = os.path.join('/', *in_filepath.split(os.sep)[0:-1])
out_filepath = os.path.join(in_path, self.filename_prefix + in_filepath.split(os.sep)[-1])
with Dataset(in_filepath) as inputds:
in_lon = inputds[self.longitude_var_name]
in_lat = inputds[self.latitude_var_name]
in_time = inputds[self.time_var_name]
lon1deg = np.arange(np.floor(np.min(in_lon)), np.ceil(np.max(in_lon)), 1)
lat1deg = np.arange(np.floor(np.min(in_lat)), np.ceil(np.max(in_lat)), 1)
out_time = np.array(in_time)
with Dataset(out_filepath, mode='w') as outputds:
outputds.createDimension(self.longitude_var_name, len(lon1deg))
outputds.createVariable(self.longitude_var_name, in_lon.dtype, dimensions=(self.longitude_var_name,))
outputds[self.longitude_var_name][:] = lon1deg
outputds[self.longitude_var_name].setncatts(
{attrname: inputds[self.longitude_var_name].getncattr(attrname) for attrname in
inputds[self.longitude_var_name].ncattrs() if
str(attrname) not in ['bounds', 'valid_min', 'valid_max']})
outputds.createDimension(self.latitude_var_name, len(lat1deg))
outputds.createVariable(self.latitude_var_name, in_lat.dtype, dimensions=(self.latitude_var_name,))
outputds[self.latitude_var_name][:] = lat1deg
outputds[self.latitude_var_name].setncatts(
{attrname: inputds[self.latitude_var_name].getncattr(attrname) for attrname in
inputds[self.latitude_var_name].ncattrs() if
str(attrname) not in ['bounds', 'valid_min', 'valid_max']})
outputds.createDimension(self.time_var_name)
outputds.createVariable(self.time_var_name, inputds[self.time_var_name].dtype,
dimensions=(self.time_var_name,))
outputds[self.time_var_name][:] = out_time
outputds[self.time_var_name].setncatts(
{attrname: inputds[self.time_var_name].getncattr(attrname) for attrname in
inputds[self.time_var_name].ncattrs()
if
str(attrname) != 'bounds'})
for variable_name in self.variables_to_regrid.split(','):
# If longitude is the first dimension, we need to transpose the dimensions
transpose_dimensions = inputds[variable_name].dimensions == (
self.time_var_name, self.longitude_var_name, self.latitude_var_name)
outputds.createVariable(variable_name, inputds[variable_name].dtype,
dimensions=inputds[variable_name].dimensions)
outputds[variable_name].setncatts(
{attrname: inputds[variable_name].getncattr(attrname) for attrname in
inputds[variable_name].ncattrs()})
if variable_name in self.variable_valid_range.keys():
outputds[variable_name].valid_range = [
np.array([self.variable_valid_range[variable_name][0]],
dtype=inputds[variable_name].dtype).item(),
np.array([self.variable_valid_range[variable_name][1]],
dtype=inputds[variable_name].dtype).item()]
for ti in range(0, len(out_time)):
in_data = inputds[variable_name][ti, :, :]
if transpose_dimensions:
in_data = in_data.T
# Produces erroneous values on the edges of data
# interp_func = interpolate.interp2d(in_lon[:], in_lat[:], in_data[:], fill_value=float('NaN'))
x_mesh, y_mesh = np.meshgrid(in_lon[:], in_lat[:], copy=False)
# Does not work for large datasets (n > 5000)
# interp_func = interpolate.Rbf(x_mesh, y_mesh, in_data[:], function='linear', smooth=0)
x1_mesh, y1_mesh = np.meshgrid(lon1deg, lat1deg, copy=False)
out_data = interpolate.griddata(np.array([x_mesh.ravel(), y_mesh.ravel()]).T, in_data.ravel(),
(x1_mesh, y1_mesh), method='nearest')
if transpose_dimensions:
out_data = out_data.T
outputds[variable_name][ti, :] = out_data[np.newaxis, :]
global_atts = {
'geospatial_lon_min': np.float(np.min(lon1deg)),
'geospatial_lon_max': np.float(np.max(lon1deg)),
'geospatial_lat_min': np.float(np.min(lat1deg)),
'geospatial_lat_max': np.float(np.max(lat1deg)),
'Conventions': 'CF-1.6',
'date_created': datetime.utcnow().replace(tzinfo=UTC).strftime(ISO_8601),
'title': getattr(inputds, 'title', ''),
'time_coverage_start': getattr(inputds, 'time_coverage_start', ''),
'time_coverage_end': getattr(inputds, 'time_coverage_end', ''),
'Institution': getattr(inputds, 'Institution', ''),
'summary': getattr(inputds, 'summary', ''),
}
outputds.setncatts(global_atts)
yield out_filepath