Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def sub_arrays(proj1, proj2):
"""Substract two DataArrays and combine their attrs."""
attrs = combine_metadata(proj1.attrs, proj2.attrs)
if (attrs.get('area') is None
and proj1.attrs.get('area') is not None
and proj2.attrs.get('area') is not None):
raise IncompatibleAreas
res = proj1 - proj2
res.attrs = attrs
return res
The algorithm and the product are described in this
presentation :
http://www.ssec.wisc.edu/meetings/cspp/2015/Agenda%20PDF/Wednesday/Roquet_snow_product_cspp2015.pdf
For further information you may contact
Bernard Bellec at Bernard.Bellec@meteo.fr
or
Pascale Roquet at Pascale.Roquet@meteo.fr
"""
if len(projectables) != 5:
raise ValueError("Expected 5 datasets, got %d" %
(len(projectables), ))
# Collect information that is the same between the projectables
info = combine_metadata(*projectables)
# Update that information with configured information (including name)
info.update(self.attrs)
# Force certain pieces of metadata that we *know* to be true
info["wavelength"] = None
m07 = projectables[0] * 255. / 160.
m08 = projectables[1] * 255. / 160.
m09 = projectables[2] * 255. / 160.
m10 = projectables[3] * 255. / 160.
m11 = projectables[4] * 255. / 160.
refcu = m11 - m10
refcu = refcu.clip(min=0)
ch1 = m07 - refcu / 2. - m09 / 4.
ch2 = m08 + refcu / 4. + m09 / 4.
ch3 = m11 + m09
def sub_arrays(proj1, proj2):
"""Substract two DataArrays and combine their attrs."""
attrs = combine_metadata(proj1.attrs, proj2.attrs)
if (attrs.get('area') is None and
proj1.attrs.get('area') is not None and
proj2.attrs.get('area') is not None):
raise IncompatibleAreas
res = proj1 - proj2
res.attrs = attrs
return res
Additionally it performs the logical comparisons to produce the
following if they exist:
- start_time
- end_time
- start_orbit
- end_orbit
- satellite_altitude
- satellite_latitude
- satellite_longitude
- orbital_parameters
Also, concatenate the areas.
"""
combined_info = combine_metadata(*all_infos)
new_dict = self._combine(all_infos, min, 'start_time', 'start_orbit')
new_dict.update(self._combine(all_infos, max, 'end_time', 'end_orbit'))
new_dict.update(self._combine(all_infos, np.mean,
'satellite_longitude',
'satellite_latitude',
'satellite_altitude'))
# Average orbital parameters
orb_params = [info.get('orbital_parameters', {}) for info in all_infos]
if all(orb_params):
# Collect all available keys
orb_params_comb = {}
for d in orb_params:
orb_params_comb.update(d)
data = self._concat_datasets(projectables, mode)
# Skip masking if user wants it or a specific alpha channel is given.
if self.common_channel_mask and mode[-1] != 'A':
data = data.where(data.notnull().all(dim='bands'))
else:
data = projectables[0]
# if inputs have a time coordinate that may differ slightly between
# themselves then find the mid time and use that as the single
# time coordinate value
if len(projectables) > 1:
time = check_times(projectables)
if time is not None and 'time' in data.dims:
data['time'] = [time]
new_attrs = combine_metadata(*projectables)
# remove metadata that shouldn't make sense in a composite
new_attrs["wavelength"] = None
new_attrs.pop("units", None)
new_attrs.pop('calibration', None)
new_attrs.pop('modifiers', None)
new_attrs.update({key: val
for (key, val) in attrs.items()
if val is not None})
resolution = new_attrs.get('resolution', None)
new_attrs.update(self.attrs)
if resolution is not None:
new_attrs['resolution'] = resolution
new_attrs["sensor"] = self._get_sensors(projectables)
new_attrs["mode"] = mode
def __call__(self, projectables, *args, **kwargs):
"""Create the SAR QuickLook composite."""
(mhh, mhv) = projectables
blue = mhv / mhh
blue.attrs = combine_metadata(mhh, mhv)
return super(SARQuickLook, self).__call__((mhh, mhv, blue), *args, **kwargs)
flsalgo = DayFogLowStratusAlgorithm(**flsinput)
fls, mask = flsalgo.run()
(xrfls, xrmsk, xrvmask, xrcbh, xrfbh, xrlcth) = self._convert_ma_to_xr(
projectables, fls, mask, flsalgo.vcloudmask, flsalgo.cbh,
flsalgo.fbh, flsalgo.lcth)
ds = xarray.Dataset({
"fls_day": xrfls,
"fls_mask": xrmsk,
"vmask": xrvmask,
"cbh": xrcbh,
"fbh": xrfbh,
"lcthimg": xrlcth})
ds.attrs.update(satpy.dataset.combine_metadata(
xrfls.attrs, xrmsk.attrs, xrvmask.attrs,
xrcbh.attrs, xrfbh.attrs, xrlcth.attrs))
# NB: isn't this done somewhere more generically?
for k in ("standard_name", "name", "resolution"):
ds.attrs[k] = self.attrs.get(k)
return ds
"""Call the compositor."""
projectables = self.match_data_arrays(projectables)
# Get enhanced datasets
foreground = enhance2dataset(projectables[0])
background = enhance2dataset(projectables[1])
# Adjust bands so that they match
# L/RGB -> RGB/RGB
# LA/RGB -> RGBA/RGBA
# RGB/RGBA -> RGBA/RGBA
foreground = add_bands(foreground, background['bands'])
background = add_bands(background, foreground['bands'])
# Get merged metadata
attrs = combine_metadata(foreground, background)
if attrs.get('sensor') is None:
# sensor can be a set
attrs['sensor'] = self._get_sensors(projectables)
# Stack the images
if 'A' in foreground.attrs['mode']:
# Use alpha channel as weight and blend the two composites
alpha = foreground.sel(bands='A')
data = []
# NOTE: there's no alpha band in the output image, it will
# be added by the data writer
for band in foreground.mode[:-1]:
fg_band = foreground.sel(bands=band)
bg_band = background.sel(bands=band)
chan = (fg_band * alpha + bg_band * (1 - alpha))
chan = xr.where(chan.isnull(), bg_band, chan)
# no sharpening
r = p1
g = p2
b = p3
else:
r, g, b = p1, p2, p3
# combine the masks
mask = ~(da.isnull(r.data) | da.isnull(g.data) | da.isnull(b.data))
r = r.where(mask)
g = g.where(mask)
b = b.where(mask)
# Collect information that is the same between the projectables
# we want to use the metadata from the original datasets since the
# new r, g, b arrays may have lost their metadata during calculations
info = combine_metadata(*datasets)
info.update(new_attrs)
# Update that information with configured information (including name)
info.update(self.attrs)
# Force certain pieces of metadata that we *know* to be true
info.setdefault("standard_name", "true_color")
return super(RatioSharpenedRGB, self).__call__((r, g, b), **info)
def __call__(self, projectables, nonprojectables=None, **info):
"""Generate the composite."""
if len(projectables) != 2:
raise ValueError("Expected 2 datasets, got %d" % (len(projectables),))
projectables = self.match_data_arrays(projectables)
info = combine_metadata(*projectables)
info['name'] = self.attrs['name']
proj = projectables[0] - projectables[1]
proj.attrs = info
return proj