in analysis/webservice/algorithms/Tomogram.py [0:0]
def do_subset(self, ds, parameter, bounds, margin):
tile_service = self._get_tile_service()
# bounds = self.__slice_bounds
if isinstance(bounds['lat'], slice):
min_lat = bounds['lat'].start
max_lat = bounds['lat'].stop
else:
min_lat = bounds['lat'] - margin
max_lat = bounds['lat'] + margin
if isinstance(bounds['lon'], slice):
min_lon = bounds['lon'].start
max_lon = bounds['lon'].stop
else:
min_lon = bounds['lon'] - margin
max_lon = bounds['lon'] + margin
if isinstance(bounds['elevation'], slice):
min_elevation = bounds['elevation'].start
max_elevation = bounds['elevation'].stop
else:
min_elevation = bounds['elevation'] - margin
max_elevation = bounds['elevation'] + margin
# In case slices are unbounded (ie, start/stop is None) replace the associated values with max/min for coord
min_lat, min_lon, max_lat, max_lon = [v if v is not None else d for v, d in
zip([min_lat, min_lon, max_lat, max_lon], [-90, -180, 90, 180])]
tiles = tile_service.find_tiles_in_box(
min_lat, max_lat, min_lon, max_lon,
ds=ds,
min_elevation=min_elevation,
max_elevation=max_elevation,
fetch_data=False
)
logger.info(f'Matched {len(tiles):,} tiles from Solr')
if len(tiles) == 0:
raise NoDataException(reason='No tiles matched the selected parameters')
data = []
for i in range(len(tiles)-1, -1, -1):
tile = tiles.pop(i)
tile_id = tile.tile_id
logger.info(f'Processing tile {tile_id} | {i=}')
tile = tile_service.fetch_data_for_tiles(tile)[0]
tile = tile_service.mask_tiles_to_bbox(min_lat, max_lat, min_lon, max_lon, [tile])
tile = tile_service.mask_tiles_to_elevation(min_elevation, max_elevation, tile)
if len(tile) == 0:
logger.info(f'Skipping empty tile {tile_id}')
continue
tile = tile[0]
for nexus_point in tile.nexus_point_generator():
data_vals = nexus_point.data_vals if tile.is_multi else [nexus_point.data_vals]
data_val = None
for value, variable in zip(data_vals, tile.variables):
if parameter is None or variable == parameter:
data_val = value
break
if data_val is None:
logger.warning(f'No variable {parameter} found at point {nexus_point.index} for tile {tile.tile_id}')
data_val = np.nan
data.append({
'latitude': nexus_point.latitude,
'longitude': nexus_point.longitude,
'elevation': nexus_point.depth,
'data': data_val
})
if len(data) == 0:
raise NoDataException(reason='No data fit the selected parameters')
return data