granule_ingester/granule_ingester/processors/ForceAscendingLatitude.py (46 lines of code) (raw):

# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import logging import numpy as np from nexusproto.serialization import from_shaped_array, to_shaped_array from granule_ingester.processors.TileProcessor import TileProcessor logger = logging.getLogger(__name__) class ForceAscendingLatitude(TileProcessor): def __init__(self, default_latitude_axis=0): self.__default_latitude_axis = default_latitude_axis self.__latitude_keywords = {'lat', 'latitude', 'latitudes', 'yc', 'ydim_grid'} def __get_latitude_axis(self, axis_tuple): if axis_tuple is None: logger.debug(f'axis_tuple is None. using the default axis') return self.__default_latitude_axis for i, k in enumerate(axis_tuple): if k.lower() in self.__latitude_keywords: logger.debug(f'found the latitude axis: {i}') return i logger.debug(f'cannot find one of latitude keywords from {self.__latitude_keywords} in axis_tuple: {axis_tuple}. using the default axis') return self.__default_latitude_axis def process(self, tile, *args, **kwargs): """ This method will reverse the ordering of latitude values in a tile if necessary to ensure that the latitude values are ascending. ​ :param self: :param tile: The nexus_tile :return: Tile data with altered latitude values """ the_tile_type = tile.tile.WhichOneof("tile_type") logger.debug(f'processing granule: {tile.summary.granule}') the_tile_data = getattr(tile.tile, the_tile_type) latitudes = from_shaped_array(the_tile_data.latitude) data = from_shaped_array(the_tile_data.variable_data) if len(latitudes) < 2: logger.debug(f'Not enough latitude in data to flip. No need to do so..') if 'dataset' in kwargs: kwargs['dataset'].attrs['_FlippedLat'] = (False, None) return tile delta = latitudes[1] - latitudes[0] if delta >= 0: logger.debug(f'Only reverse latitude ordering if current ordering is descending.. No need to do so..') if 'dataset' in kwargs: kwargs['dataset'].attrs['_FlippedLat'] = (False, None) return tile logger.debug(f'flipping latitudes') latitudes = np.flip(latitudes) latitude_axis = self.__get_latitude_axis(tile.summary.data_dim_names) logger.debug(f'flipping data on axis: {latitude_axis}') data = np.flip(data, axis=latitude_axis) if 'dataset' in kwargs: kwargs['dataset'].attrs['_FlippedLat'] = (True, latitude_axis) the_tile_data.latitude.CopyFrom(to_shaped_array(latitudes)) the_tile_data.variable_data.CopyFrom(to_shaped_array(data)) return tile