Skip to content
Snippets Groups Projects
scene.py 3.46 KiB
Newer Older
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