Source code for eemont.common

import ee
from box import Box

def _get_expression_map(img, platformDict):
    '''Gets the dictionary required for the map parameter in ee.Image.expression() method.
    
    Parameters
    ----------
    img : ee.Image
        Image to get the dictionary from.
    platformDict : dict
        Dictionary retrieved from the _get_platform() method.
        
    Returns
    -------
    dict
        Map dictionary for ee.Image.expression.
    '''        
    def lookupS2(img):
        return {
            'A': img.select('B1'),
            'B': img.select('B2'),
            'G': img.select('B3'),
            'R': img.select('B4'),
            'RE1': img.select('B5'),
            'RE2': img.select('B6'),
            'RE3': img.select('B7'),
            'N' : img.select('B8'),
            'RE4': img.select('B8A'),
            'WV' : img.select('B9'),            
            'S1': img.select('B11'),
            'S2': img.select('B12')
        }

    def lookupL8(img):
        return {
            'A': img.select('B1'),
            'B': img.select('B2'),
            'G': img.select('B3'),
            'R': img.select('B4'),
            'N': img.select('B5'),
            'S1': img.select('B6'),
            'S2': img.select('B7'),                
            'T1' : img.select('B10'),
            'T2': img.select('B11')
        }

    def lookupL457(img):
        return {
            'B': img.select('B1'),
            'G': img.select('B2'),
            'R': img.select('B3'),
            'N': img.select('B4'),
            'S1': img.select('B5'),
            'T1': img.select('B6'),
            'S2': img.select('B7')                
        }
    
    def lookupMOD09GQ(img):
        return {            
            'R': img.select('sur_refl_b01'),
            'N': img.select('sur_refl_b02')            
        }
    
    def lookupMOD09GA(img):
        return {            
            'B': img.select('sur_refl_b03'),
            'G': img.select('sur_refl_b04'),
            'R': img.select('sur_refl_b01'),
            'N': img.select('sur_refl_b02'),
            'S1': img.select('sur_refl_b06'),
            'S2': img.select('sur_refl_b07')           
        }
    
    def lookupMCD43A4(img):
        return {            
            'B': img.select('Nadir_Reflectance_Band3'),
            'G': img.select('Nadir_Reflectance_Band4'),
            'R': img.select('Nadir_Reflectance_Band1'),
            'N': img.select('Nadir_Reflectance_Band2'),
            'S1': img.select('Nadir_Reflectance_Band6'),
            'S2': img.select('Nadir_Reflectance_Band7')           
        }

    lookupPlatform = {
        'COPERNICUS/S2': lookupS2,
        'LANDSAT/LC08': lookupL8,
        'LANDSAT/LE07': lookupL457,
        'LANDSAT/LT05': lookupL457,
        'LANDSAT/LT04': lookupL457,
        'MODIS/006/MOD09GQ': lookupMOD09GQ,
        'MODIS/006/MYD09GQ': lookupMOD09GQ,
        'MODIS/006/MOD09GA': lookupMOD09GA,
        'MODIS/006/MYD09GA': lookupMOD09GA,
        'MODIS/006/MOD09Q1': lookupMOD09GQ,
        'MODIS/006/MYD09Q1': lookupMOD09GQ,
        'MODIS/006/MOD09A1': lookupMOD09GA,
        'MODIS/006/MYD09A1': lookupMOD09GA,
        'MODIS/006/MCD43A4': lookupMCD43A4
    }

    if platformDict['platform'] not in list(lookupPlatform.keys()):
        raise Exception("Sorry, satellite platform not supported for index computation!")

    return lookupPlatform[platformDict['platform']](img)

def _get_indices():
    '''Retrieves the dictionary of indices used for the index() method in ee.Image and ee.ImageCollection classes.
           
    Returns
    -------
    dict
        Indices.
    '''
    vegetationIndices = {
        'BNDVI' : {
            'formula' : '(N - B)/(N + B)',
            'description' : 'Blue Normalized Difference Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','B'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=135',
            'contributor' : 'davemlz'
        },
        'CIG' : {
            'formula' : '(N / G) - 1.0',
            'description' : 'Blue Normalized Difference Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','G'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=128',
            'contributor' : 'davemlz'
        },
        'CVI' : {
            'formula' : '(N * R) / (G ** 2.0)',
            'description' : 'Chlorophyll Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','R','G'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=391',
            'contributor' : 'davemlz'
        },
        'EVI' : {
            'formula' : 'g * (N - R) / (N + C1 * R - C2 * B + L)',
            'description' : 'Enhanced Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','g','R','C1','C2','B','L'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=16',
            'contributor' : 'davemlz'
        },
        'EVI2' : {
            'formula' : 'g * (N - R) / (N + 2.4 * R + L)',
            'description' : 'Two-Band Enhanced Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','g','R','L'],
            'reference' : 'https://doi.org/10.1016/j.rse.2008.06.006',
            'contributor' : 'davemlz'
        },  
        'GBNDVI' : {
            'formula' : '(N - (G + B))/(N + (G + B))',
            'description' : 'Green-Blue Normalized Difference Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','B','G'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=186',
            'contributor' : 'davemlz'
        }, 
        'GNDVI' : {
            'formula' : '(N - G)/(N + G)',
            'description' : 'Green Normalized Difference Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','G'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=401',
            'contributor' : 'davemlz'
        },
        'GRNDVI' : {
            'formula' : '(N - (G + R))/(N + (G + R))',
            'description' : 'Green-Red Normalized Difference Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','G','R'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=185',
            'contributor' : 'davemlz'
        }, 
        'MNDVI' : {
            'formula' : '(N - S2)/(N + S2)',
            'description' : 'Modified Normalized Difference Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','S2'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=245',
            'contributor' : 'davemlz'
        },  
        'NDVI' : {
            'formula' : '(N - R)/(N + R)',
            'description' : 'Normalized Difference Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','R'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=58',
            'contributor' : 'davemlz'
        },  
        'NGRDI' : {
            'formula' : '(G - R) / (G + R)',
            'description' : 'Normalized Green Red Difference Index',
            'type' : 'vegetation',
            'requires' : ['G','R'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=390',
            'contributor' : 'davemlz'
        },  
        'RVI' : {
            'formula' : 'N / R',
            'description' : 'Ratio Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','R'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=72',
            'contributor' : 'davemlz'
        },
        'SAVI' : {
            'formula' : '(1.0 + L) * (N - R) / (N + R + L)',
            'description' : 'Soil-Adjusted Vegetation Index',
            'type' : 'vegetation',
            'requires' : ['N','R','L'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=87',
            'contributor' : 'davemlz'
        },          
    }
    
    burnIndices = {
        'BAI' : {
            'formula' : '1.0 / ((0.1 - R) ** 2.0 + (0.06 - N) ** 2.0)',
            'description' : 'Burned Area Index',
            'type' : 'burn',
            'requires' : ['N','R'],
            'reference' : 'https://digital.csic.es/bitstream/10261/6426/1/Martin_Isabel_Serie_Geografica.pdf',
            'contributor' : 'davemlz'
        },        
        'BAIS2' : {
            'formula' : '(1.0 - ((RE2 * RE3 * RE4) / R) ** 0.5) * (((S2 - RE4)/(S2 + RE4) ** 0.5) + 1.0)',
            'description' : 'Burned Area Index for Sentinel 2',
            'type' : 'burn',
            'requires' : ['RE2','RE3','RE4','R','S2'],
            'reference' : 'https://doi.org/10.3390/ecrs-2-05177',
            'contributor' : 'davemlz'
        },  
        'CSIT' : {
            'formula' : 'N / (S2 * T1 / 10000.0)',
            'description' : 'Char Soil Index Thermal',
            'type' : 'burn',
            'requires' : ['N','S2','T1'],
            'reference' : 'https://doi.org/10.1080/01431160600954704',
            'contributor' : 'davemlz'
        }, 
        'NBR' : {
            'formula' : '(N - S2) / (N + S2)',
            'description' : 'Normalized Burn Ratio',
            'type' : 'burn',
            'requires' : ['N','S2'],
            'reference' : 'https://www.indexdatabase.de/db/i-single.php?id=53',
            'contributor' : 'davemlz'
        }, 
        'NBRT' : {
            'formula' : '(N - (S2 * T1 / 10000.0)) / (N + (S2 * T1 / 10000.0))',
            'description' : 'Normalized Burn Ratio Thermal',
            'type' : 'burn',
            'requires' : ['N','S2','T1'],
            'reference' : 'https://doi.org/10.1080/01431160500239008',
            'contributor' : 'davemlz'
        }, 
        'NDVIT' : {
            'formula' : '(N - (R * T1 / 10000.0))/(N + (R * T1 / 10000.0))',
            'description' : 'Normalized Difference Vegetation Index Thermal',
            'type' : 'burn',
            'requires' : ['N','R','T1'],
            'reference' : 'https://doi.org/10.1080/01431160600954704',
            'contributor' : 'davemlz'
        }, 
        'SAVIT' : {
            'formula' : '(1.0 + L) * (N - (R * T1 / 10000.0)) / (N + (R * T1 / 10000.0) + L)',
            'description' : 'Soil-Adjusted Vegetation Index Thermal',
            'type' : 'burn',
            'requires' : ['N','R','L','T1'],
            'reference' : 'https://doi.org/10.1080/01431160600954704',
            'contributor' : 'davemlz'
        },
    }
    
    waterIndices = {
        'MNDWI' : {
            'formula' : '(G - S1) / (G + S1)',
            'description' : 'Modified Normalized Difference Water Index',
            'type' : 'water',
            'requires' : ['G','S1'],
            'reference' : 'https://doi.org/10.1080/01431160600589179',
            'contributor' : 'davemlz'
        },        
        'NDWI' : {
            'formula' : '(G - N) / (G + N)',
            'description' : 'Normalized Difference Water Index',
            'type' : 'water',
            'requires' : ['G','N'],
            'reference' : 'https://doi.org/10.1080/01431169608948714',
            'contributor' : 'davemlz'
        },    
    }
    
    snowIndices = {
        'NDSI' : {
            'formula' : '(G - S1) / (G + S1)',
            'description' : 'Normalized Difference Snow Index',
            'type' : 'snow',
            'requires' : ['G','S1'],
            'reference' : 'https://doi.org/10.1109/IGARSS.1994.399618',
            'contributor' : 'davemlz'
        },   
    }
    
    indices = {**vegetationIndices, **burnIndices, **waterIndices, **snowIndices}
    
    return indices

[docs]def indices(): '''Gets the dictionary of available indices as a Box object. Returns ------- Box Dictionary of available indices. For each index, the keys 'description', 'formula', 'requires', 'reference' and 'contributor' can be checked. Examples -------- >>> import eemont >>> indices = eemont.indices() >>> indices.BAIS2.description 'Burned Area Index for Sentinel 2' >>> indices.BAIS2.formula '(1.0 - ((RE2 * RE3 * RE4) / R) ** 0.5) * (((S2 - RE4)/(S2 + RE4) ** 0.5) + 1.0)' >>> indices.BAIS2.reference 'https://doi.org/10.3390/ecrs-2-05177' ''' return Box(_get_indices(),frozen_box = True)
[docs]def listIndices(): '''Gets the list of available indices. Returns ------- list List of available indices. Examples -------- >>> import eemont >>> eemont.listIndices() ['BNDVI','CIG','CVI','EVI','EVI2','GBNDVI','GNDVI',...] ''' return list(_get_indices().keys())
def _get_platform(args): '''Gets the platform (satellite) of an image (or image collection) and wheter if it is a Surface Reflectance product. Parameters ---------- args : ee.Image | ee.ImageCollection Image to get platform. Returns ------- dict Platform and product of the image (or image collection). ''' platforms = [ 'COPERNICUS/S3', 'COPERNICUS/S2', 'LANDSAT/LC08', 'LANDSAT/LE07', 'LANDSAT/LT05', 'LANDSAT/LT04', 'MODIS/006/MCD43A4', 'MODIS/006/MCD43A3', 'MODIS/006/MOD09GQ', 'MODIS/006/MOD10A1', 'MODIS/006/MOD11A1', 'MODIS/006/MOD09GA', 'MODIS/006/MODOCGA', 'MODIS/006/MOD14A1', 'MODIS/006/MCD43A1', 'MODIS/006/MCD15A3H', 'MODIS/006/MOD09Q1', 'MODIS/006/MOD09A1', 'MODIS/006/MOD11A2', 'MODIS/006/MOD17A2H', 'MODIS/006/MOD16A2', 'MODIS/006/MOD13Q1', 'MODIS/006/MOD13A1', 'MODIS/006/MOD13A2', 'MODIS/061/MOD08_M3', 'MODIS/006/MOD17A3HGF', 'MODIS/006/MYD09GQ', 'MODIS/006/MYD10A1', 'MODIS/006/MYD11A1', 'MODIS/006/MYD09GA', 'MODIS/006/MYDOCGA', 'MODIS/006/MYD14A1', 'MODIS/006/MYD09Q1', 'MODIS/006/MYD09A1', 'MODIS/006/MYD11A2', 'MODIS/006/MYD17A2H', 'MODIS/006/MYD13Q1', 'MODIS/006/MYD13A1', 'MODIS/006/MYD13A2', 'MODIS/061/MYD08_M3', 'MODIS/006/MYD17A3HGF' ] if isinstance(args, ee.imagecollection.ImageCollection): imgID = args.first().get('system:id').getInfo() elif isinstance(args, ee.image.Image): imgID = args.get('system:id').getInfo() else: raise Exception("Sorry, just ee.Image or ee.ImageCollection classes supported!") plt = None for platform in platforms: if platform in imgID: plt = platform if '_SR' in imgID: platformDict = {'platform': plt, 'sr': True} else: platformDict = {'platform': plt, 'sr': False} if plt is None: raise Exception("Sorry, satellite platform not supported!") return platformDict def _get_scale_method(platformDict): '''Gets the scale algorithms for the scale() method in ee.Imge and ee.ImageCollection. Parameters ---------- platformDict : dict Dictionary retrieved from the _get_platform() method. Returns ------- dict Lookup dictionary for scale algorithms. ''' def S3(img): scalars = [ 0.0139465, 0.0133873, 0.0121481, 0.0115198, 0.0100953, 0.0123538, 0.00879161, 0.00876539, 0.0095103, 0.00773378, 0.00675523, 0.0071996, 0.00749684, 0.0086512, 0.00526779, 0.00530267, 0.00493004, 0.00549962, 0.00502847, 0.00326378, 0.00324118 ] scaled = img.select(['Oa.*']).multiply(scalars).addBands(img.select('quality_flags')) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def S2(img): scaled = img.select(['B.*']).divide(1e4) scaled = scaled.addBands(img.select(['Q.*'])) if platformDict['sr']: scaled = scaled.addBands(img.select(['AOT','WVP']).divide(1e3)) scaled = scaled.addBands(img.select(['T.*'])) scaled = scaled.addBands(img.select('SCL')) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def L8(img): if platformDict['sr']: scaled = img.select(['B[1-9]']).divide(1e4) scaled = scaled.addBands(img.select(['B10','B11']).divide(10)) scaled = scaled.addBands(img.select(['sr_aerosol','pixel_qa','radsat_qa'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) else: warnings.warn("TOA reflectance for Landsat 8 is already scaled!",Warning) pass def L457(img): if platformDict['sr']: scaled = img.select(['B[1-5]','B7']).divide(1e4) scaled = scaled.addBands(img.select(['B6']).divide(10)) scaled = scaled.addBands(img.select(['sr_atmos_opacity']).divide(1e3)) scaled = scaled.addBands(img.select(['sr_cloud_qa','pixel_qa','radsat_qa'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) else: warnings.warn("TOA reflectance for Landsat 4, 5 and 7 is already scaled!",Warning) pass def MCD43A4(img): scaled = img.select(['Nadir.*']).divide(1e4) scaled = scaled.addBands(img.select(['BRDF.*'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MCD43A3(img): scaled = img.select(['Albedo.*']).divide(1e3) scaled = scaled.addBands(img.select(['BRDF.*'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD09GQ(img): scaled = img.select(['sur.*']).divide(1e4) scaled = scaled.addBands(img.select(['obscov']).divide(100)) scaled = scaled.addBands(img.select(['num_observations','QC_250m','iobs_res','orbit_pnt','granule_pnt'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD10A1(img): scaled = img.select(['NDSI']).divide(1e4) scaled = scaled.addBands(img.select(['NDSI_Snow.*'])) scaled = scaled.addBands(img.select(['Snow.*'])) scaled = scaled.addBands(img.select(['orbit_pnt','granule_pnt'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD11A1(img): scaled = img.select(['LST.*']).multiply(0.02) scaled = scaled.addBands(img.select(['Day_view_time','Night_view_time']).multiply(0.1)) scaled = scaled.addBands(img.select(['Emis.*']).multiply(0.002)) scaled = scaled.addBands(img.select(['Clear.*']).multiply(0.0005)) scaled = scaled.addBands(img.select(['QC_Day','Day_view_angle','QC_Night','Night_view_angle'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD09GA(img): scaled = img.select(['sur.*']).multiply(0.0001) scaled = scaled.addBands(img.select(['Sensor.*']).multiply(0.01)) scaled = scaled.addBands(img.select(['Solar.*']).multiply(0.01)) scaled = scaled.addBands(img.select(['Range']).multiply(25)) scaled = scaled.addBands(img.select(['num_observations_1km','state_1km','gflags','orbit_pnt','granule_pnt','num_observations_500m','QC_500m','obscov_500m','iobs_res','q_scan'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MODOCGA(img): scaled = img.select(['sur.*']).multiply(0.0001) scaled = scaled.addBands(img.select(['num_observations','orbit_pnt','granule_pnt'])) scaled = scaled.addBands(img.select(['QC.*'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD14A1(img): scaled = img.select(['MaxFRP']).multiply(0.1) scaled = scaled.addBands(img.select(['FireMask','sample','QA'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MCD43A1(img): scaled = img.select(['BRDF_Albedo_Parameters.*']).multiply(0.001) scaled = scaled.addBands(img.select(['BRDF_Albedo_Band.*'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MCD15A3H(img): scaled = img.select(['Fpar','FparStdDev']).multiply(0.01) scaled = scaled.addBands(img.select(['Lai','LaiStdDev']).multiply(0.1)) scaled = scaled.addBands(img.select(['FparLai_QC','FparExtra_QC'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD09Q1(img): scaled = img.select(['sur.*']).divide(1e4) scaled = scaled.addBands(img.select(['State','QA'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD09A1(img): scaled = img.select(['sur.*']).divide(1e4) scaled = scaled.addBands(img.select(['SolarZenith','ViewZenith','RelativeAzimuth']).multiply(0.01)) scaled = scaled.addBands(img.select(['QA','StateQA','DayOfYear'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD11A2(img): scaled = img.select(['LST.*']).multiply(0.02) scaled = scaled.addBands(img.select(['Day_view_time','Night_view_time']).multiply(0.1)) scaled = scaled.addBands(img.select(['Emis.*']).multiply(0.002).add(0.49)) scaled = scaled.addBands(img.select(['Day_view_angl','Night_view_angl']).subtract(65)) scaled = scaled.addBands(img.select(['QC_Day','QC_Night','Clear_sky_days','Clear_sky_nights'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD17A2H(img): scaled = img.select(['Gpp','PsnNet']).multiply(0.0001) scaled = scaled.addBands(img.select(['Psn_QC'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD16A2(img): scaled = img.select(['ET','PET']).multiply(0.1) scaled = scaled.addBands(img.select(['LE','PLE']).multiply(0.0001)) scaled = scaled.addBands(img.select(['ET_QC'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD13Q1(img): scaled = img.select(['NDVI','EVI']).multiply(0.0001) scaled = scaled.addBands(img.select(['sur.*']).multiply(0.0001)) scaled = scaled.addBands(img.select(['ViewZenith','SolarZenith','RelativeAzimuth']).multiply(0.01)) scaled = scaled.addBands(img.select(['DetailedQA','DayOfYear','SummaryQA'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD13A1(img): scaled = img.select(['NDVI','EVI']).multiply(0.0001) scaled = scaled.addBands(img.select(['sur.*']).multiply(0.0001)) scaled = scaled.addBands(img.select(['ViewZenith','SolarZenith','RelativeAzimuth']).multiply(0.01)) scaled = scaled.addBands(img.select(['DetailedQA','DayOfYear','SummaryQA'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD13A2(img): scaled = img.select(['NDVI','EVI']).multiply(0.0001) scaled = scaled.addBands(img.select(['sur.*']).multiply(0.0001)) scaled = scaled.addBands(img.select(['ViewZenith','SolarZenith','RelativeAzimuth']).multiply(0.01)) scaled = scaled.addBands(img.select(['DetailedQA','DayOfYear','SummaryQA'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD08_M3(img): scaled = img.select(['Aerosol.*']).multiply(0.001) scaled = scaled.addBands(img.select(['Cirrus.*']).multiply(0.0001)) scaled = scaled.addBands(img.select(['Cloud_Optical_Thickness_Liquid_Log.*']).multiply(0.001)) scaled = scaled.addBands(img.select(['Cloud_Optical_Thickness_Liquid_Mean_Uncertainty']).multiply(0.01)) return ee.Image(scaled.copyProperties(img,img.propertyNames())) def MOD17A3HGF(img): scaled = img.select(['Npp']).multiply(0.0001) scaled = scaled.addBands(img.select(['Npp_QC'])) return ee.Image(scaled.copyProperties(img,img.propertyNames())) lookup = { 'COPERNICUS/S3': S3, 'COPERNICUS/S2': S2, 'LANDSAT/LC08': L8, 'LANDSAT/LE07': L457, 'LANDSAT/LT05': L457, 'LANDSAT/LT04': L457, 'MODIS/006/MCD43A4': MCD43A4, 'MODIS/006/MCD43A3': MCD43A3, 'MODIS/006/MOD09GQ': MOD09GQ, 'MODIS/006/MOD10A1': MOD10A1, 'MODIS/006/MOD11A1': MOD11A1, 'MODIS/006/MOD09GA': MOD09GA, 'MODIS/006/MODOCGA': MODOCGA, 'MODIS/006/MOD14A1': MOD14A1, 'MODIS/006/MCD43A1': MCD43A1, 'MODIS/006/MCD15A3H': MCD15A3H, 'MODIS/006/MOD09Q1': MOD09Q1, 'MODIS/006/MOD09A1': MOD09A1, 'MODIS/006/MOD11A2': MOD11A2, 'MODIS/006/MOD17A2H': MOD17A2H, 'MODIS/006/MOD16A2': MOD16A2, 'MODIS/006/MOD13Q1': MOD13Q1, 'MODIS/006/MOD13A1': MOD13A1, 'MODIS/006/MOD13A2': MOD13A2, 'MODIS/061/MOD08_M3': MOD08_M3, 'MODIS/006/MOD17A3HGF': MOD17A3HGF, 'MODIS/006/MYD09GQ': MOD09GQ, 'MODIS/006/MYD10A1': MOD10A1, 'MODIS/006/MYD11A1': MOD11A1, 'MODIS/006/MYD09GA': MOD09GA, 'MODIS/006/MYDOCGA': MODOCGA, 'MODIS/006/MYD14A1': MOD14A1, 'MODIS/006/MYD09Q1': MOD09Q1, 'MODIS/006/MYD09A1': MOD09A1, 'MODIS/006/MYD11A2': MOD11A2, 'MODIS/006/MYD17A2H': MOD17A2H, 'MODIS/006/MYD13Q1': MOD13Q1, 'MODIS/006/MYD13A1': MOD13A1, 'MODIS/006/MYD13A2': MOD13A2, 'MODIS/061/MYD08_M3': MOD08_M3, 'MODIS/006/MYD17A3HGF': MOD17A3HGF } return lookup