From 955ae585e79702ae3189a22f046e77493c485dad Mon Sep 17 00:00:00 2001 From: Paolo Veglio <paolo.veglio@ssec.wisc.edu> Date: Mon, 20 Jun 2022 22:13:28 +0000 Subject: [PATCH] initial draft of the function that defines the scene based on ancillary inputs and geolocation --- scene.py | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 scene.py diff --git a/scene.py b/scene.py new file mode 100644 index 0000000..8e1ac1a --- /dev/null +++ b/scene.py @@ -0,0 +1,100 @@ +import numpy as np + +# lsf: land sea flag +_scene_list = ['ocean_day', 'ocean_night', 'land_day', 'land_night', 'snow_day', 'coast_day', + 'desert_day', 'antarctic_day', 'polar_day_snow', 'polar_day_desert', + 'polar_day_desert_coast', 'polar_day_coast', 'polar_day_land', 'polar_night_snow', + 'polar_night_land', 'polar_ocean_night'] +_flags = ['day', 'night', 'land', 'coast', 'sh_lake', 'sh_ocean', 'water', 'polar', 'sunglint', + 'greenland', 'high_elevation', 'antarctica', 'desert', 'vrused', 'map_snow', 'map_ice', + 'ndsi_snow', 'ice', 'new_zealand'] + +# I'm defining here the flags for difference scenes. Eventually I want to find a better way of doing this +land = 1 +coast = .2 +sh_lake = .3 +sh_ocean = .4 +water = 5 +polar = 60 +sunglint = 70 +day = 100 +night = 200 + + +def find_scene(data): + eco = data['eco'].values + lsf = data['land_water_mask'].values + lat = data['latitude'].values + lon = data['longitude'].values + sza = data['solar_zenith'].values + day = np.zeros((3232, 3200)) + day[sza <= 85] = 1 + + tmp = np.ones((3232, 3200)) + + tmp[day == 1] = day + tmp[day == 0] = night + + scene = {scn: np.zeros((3232, 3200)) for scn in _scene_list} + scene_flag = {flg: np.zeros((3232, 3200)) for flg in _flags} + + scene_flag['day'][sza <= 85] = 1 + scene_flag['visusd'][sza <= 85] = 1 + scene_flag['night'][sza > 85] = 1 + + scene_flag[np.abs(lat) > 60]['polar'] = 1 + ################## need to pass refang (once I figure out what it is) and sunglint_angle. The latter + # comes from the thresholds file. In the C code is snglnt_bounds[3] + idx = np.nonzero((scene_flag['day'] == 1) & (refang <= sunglint_angle)) + scene_flag['sunglint'][idx] = 1 + + ################################## + # CONTINUE FROM HERE # + ################################## + + # Force consistency between lsf and ecosystem type for water + idx = np.nonzero((lsf == 0) | ((lsf >= 5) & (lsf <= 7))) + eco[idx] = 14 + + idx = np.nonzero((lsf == 1) | (lsf == 4)) + tmp[idx] = tmp[idx] + land + + idx = np.nonzero(eco == 14) + + # fix-up for missing ecosystem data in eastern Greenland and north-eastern Siberia. + # Without this, these regions become completely "coast". + idx1 = np.nonzero((eco == 14) & (lat < 64)) + idx2 = np.nonzero((eco == 14) & (lat >= 67.5) & (lon > -168.5) & (lon < -40)) + idx3 = np.nonzero((eco == 14) & (lat >= 67.5) & (lon > -30)) + idx4 = np.nonzero((eco == 14) & (lat >= 64) & (lat < 67.5) & (lon > -168.5) & (lon < -40)) + idx5 = np.nonzero((eco == 14) & (lat >= 64) & (lat < 67.5) & (lon > -30)) + tmp[idx1] = tmp[idx1] + coast + tmp[idx2] = tmp[idx2] + coast + tmp[idx3] = tmp[idx3] + coast + tmp[idx4] = tmp[idx4] + coast + tmp[idx5] = tmp[idx5] + coast + + tmp[lsf == 2] = tmp[lsf == 2] + land + coast + # need shallow lakes to be processed as "coast" for day, but not night + tmp[(lsf == 3) & (day == 1)] = tmp[(lsf == 3) & (day == 1)] + land + sh_lake + coast + tmp[(lsf > 4) & (lsf != 255)] = tmp[(lsf > 4) & (lsf != 255)] + water + sh_ocean + + # need to cover the case where eco is 255 and I use te vis ratio between gbnd065 and gbnd086 + # to determine if land or water + + greenland_flag = 0 + hi_elevation_flag = 0 + antarctic_flag = 0 + desert_flag = 0 + vrused = 0 # visible ratio test used based on eco_type. Check C code + + map_snow_flag = 0 + map_ice_flag = 0 + ndsi_snow_flag = 0 + ice_flag = 0 + new_zealand_flag = 0 + + return scene + + + -- GitLab