You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sdap.apache.org by tl...@apache.org on 2021/04/09 01:17:48 UTC
[incubator-sdap-ingester] 29/33: add processor to make latitude
ascending
This is an automated email from the ASF dual-hosted git repository.
tloubrieu pushed a commit to branch ascending_latitudes
in repository https://gitbox.apache.org/repos/asf/incubator-sdap-ingester.git
commit e13d7ccd20f6721b2fd53b25acfa6db4d2a060c1
Author: thomas loubrieu <th...@jpl.nasa.gov>
AuthorDate: Wed Apr 7 22:36:43 2021 -0700
add processor to make latitude ascending
---
.../processors/ForceAscendingLatitude.py | 48 ++++++++++++++++++
.../processors/test_ForceAscendingLatitude.py | 58 ++++++++++++++++++++++
2 files changed, 106 insertions(+)
diff --git a/granule_ingester/granule_ingester/processors/ForceAscendingLatitude.py b/granule_ingester/granule_ingester/processors/ForceAscendingLatitude.py
new file mode 100644
index 0000000..01b2e88
--- /dev/null
+++ b/granule_ingester/granule_ingester/processors/ForceAscendingLatitude.py
@@ -0,0 +1,48 @@
+# 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 numpy as np
+
+from nexusproto.serialization import from_shaped_array, to_shaped_array
+from granule_ingester.processors.TileProcessor import TileProcessor
+
+class ForceAscendingLatitude(TileProcessor):
+
+ 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")
+
+ 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)
+
+ # Only reverse latitude ordering if current ordering is descending.
+ if len(latitudes) > 1:
+ delta = latitudes[1] - latitudes[0]
+ if delta < 0:
+ latitudes = np.flip(latitudes)
+ data = np.flip(data, axis=0)
+ the_tile_data.latitude.CopyFrom(to_shaped_array(latitudes))
+ the_tile_data.variable_data.CopyFrom(to_shaped_array(data))
+
+ return tile
diff --git a/granule_ingester/tests/processors/test_ForceAscendingLatitude.py b/granule_ingester/tests/processors/test_ForceAscendingLatitude.py
new file mode 100644
index 0000000..d593909
--- /dev/null
+++ b/granule_ingester/tests/processors/test_ForceAscendingLatitude.py
@@ -0,0 +1,58 @@
+import unittest
+
+import xarray as xr
+import numpy as np
+from os import path
+from nexusproto import DataTile_pb2 as nexusproto
+
+from nexusproto.serialization import from_shaped_array, to_shaped_array
+
+from granule_ingester.processors.ForceAscendingLatitude import ForceAscendingLatitude
+from granule_ingester.processors.reading_processors.GridReadingProcessor import GridReadingProcessor
+
+class TestForceAscendingLatitude(unittest.TestCase):
+
+ def read_tile(self):
+ reading_processor = GridReadingProcessor('B03', 'lat', 'lon', time='time')
+ granule_path = path.join(path.dirname(__file__),
+ '/Users/loubrieu/Documents/sdap/HLS/HLS.S30.T11SPC.2020001.v1.4.hdf.nc')
+ input_tile = nexusproto.NexusTile()
+ input_tile.summary.granule = granule_path
+
+ dimensions_to_slices = {
+ 'time': slice(0, 1),
+ 'lat': slice(0, 30),
+ 'lon': slice(0, 30)
+ }
+
+ with xr.open_dataset(granule_path) as ds:
+ return reading_processor._generate_tile(ds, dimensions_to_slices, input_tile)
+
+ def test_process(self):
+ processor = ForceAscendingLatitude()
+
+ tile = self.read_tile()
+
+ tile_type = tile.tile.WhichOneof("tile_type")
+ tile_data = getattr(tile.tile, tile_type)
+ latitudes = from_shaped_array(tile_data.latitude)
+ variable_data = from_shaped_array(tile_data.variable_data)
+ print(latitudes)
+ print(variable_data)
+
+
+ flipped_tile = processor.process(tile)
+
+ the_flipped_tile_type = flipped_tile.tile.WhichOneof("tile_type")
+ the_flipped_tile_data = getattr(flipped_tile.tile, the_flipped_tile_type)
+
+ flipped_latitudes = from_shaped_array(the_flipped_tile_data.latitude)
+ flipped_data = from_shaped_array(the_flipped_tile_data.variable_data)
+
+ print(flipped_latitudes[1])
+ np.testing.assert_almost_equal(flipped_latitudes[1], 38.72608, decimal=5, err_msg='', verbose=True)
+ print(flipped_data[1,1])
+ np.testing.assert_almost_equal(flipped_data[1,1], 0.3116, decimal=4, err_msg='', verbose=True)
+
+
+