import ee
import warnings
from .common import _get_indices
from .common import _get_platform
from .common import _get_scale_method
from .common import _get_expression_map
def _extend_eeImage():
"""Decorator. Extends the ee.ImageCollection class."""
return lambda f: (setattr(ee.image.Image,f.__name__,f) or f)
@_extend_eeImage()
def __add__(self, other):
'''Computes the addition between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Addition of two images.
'''
return self.add(other)
@_extend_eeImage()
def __radd__(self, other):
'''Computes the addition between two images.
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Addition of two images.
'''
return self.add(other)
@_extend_eeImage()
def __sub__(self, other):
'''Computes the subtraction between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Subtraction of two images.
'''
return self.subtract(other)
@_extend_eeImage()
def __rsub__(self, other):
'''Computes the subtraction between two images.
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Subtraction of two images.
'''
return ee.Image(other).subtract(self)
@_extend_eeImage()
def __mul__(self, other):
'''Computes the multiplication between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Multiplication of two images.
'''
return self.multiply(other)
@_extend_eeImage()
def __rmul__(self, other):
'''Computes the multiplication between two images.
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Multiplication of two images.
'''
return self.multiply(other)
@_extend_eeImage()
def __truediv__(self, other):
'''Computes the division between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Division of two images.
'''
return self.divide(other)
@_extend_eeImage()
def __rtruediv__(self, other):
'''Computes the division between two images.
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Division of two images.
'''
return ee.Image(other).divide(self)
@_extend_eeImage()
def __floordiv__(self, other):
'''Computes the floor division of two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Floor division of two images.
'''
return self.divide(other).floor()
@_extend_eeImage()
def __rfloordiv__(self, other):
'''Computes the floor division of two images.
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Floor division of two images.
'''
return ee.Image(other).divide(self).floor()
@_extend_eeImage()
def __mod__(self, other):
'''Computes the modulo of two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Modulo of two images.
'''
return self.mod(other)
@_extend_eeImage()
def __rmod__(self, other):
'''Computes the modulo of two images.
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Modulo of two images.
'''
return ee.Image(other).mod(self)
@_extend_eeImage()
def __pow__(self, other):
'''Computes the base (left operand) to the power (right operand).
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Bsae to the power of two images.
'''
return self.pow(other)
@_extend_eeImage()
def __rpow__(self, other):
'''Computes the base (left operand) to the power (right operand).
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Base to the power of two images.
'''
return ee.Image(other).pow(self)
@_extend_eeImage()
def __lshift__(self, other):
'''Computes the left shift operation between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Left shift operation.
'''
return self.leftShift(other)
@_extend_eeImage()
def __rlshift__(self, other):
'''Computes the left shift operation between two images.
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Left shift operation.
'''
return ee.Image(other).leftShift(self)
@_extend_eeImage()
def __rshift__(self, other):
'''Computes the right shift operation between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Right shift operation.
'''
return self.rightShift(other)
@_extend_eeImage()
def __rrshift__(self, other):
'''Computes the right shift operation between two images.
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Right shift operation.
'''
return ee.Image(other).rightShift(self)
@_extend_eeImage()
def __and__(self, other):
'''Computes the binary operator AND between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Binary operator AND.
'''
return self.And(other)
@_extend_eeImage()
def __rand__(self, other):
'''Computes the binary operator AND between two images.
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Binary operator AND.
'''
return ee.Image(other).And(self)
@_extend_eeImage()
def __or__(self, other):
'''Computes the binary operator OR between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Binary operator OR.
'''
return self.Or(other)
@_extend_eeImage()
def __ror__(self, other):
'''Computes the binary operator OR between two images.
Parameters
----------
self : ee.Image
Right operand.
other : ee.Image | numeric | list[numeric]
Left operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Binary operator OR.
'''
return ee.Image(other).Or(self)
@_extend_eeImage()
def __lt__(self, other):
'''Computes the rich comparison LOWER THAN between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Rich comparison LOWER THAN.
'''
return self.lt(other)
@_extend_eeImage()
def __le__(self, other):
'''Computes the rich comparison LOWER THAN OR EQUAL between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Rich comparison LOWER THAN OR EQUAL.
'''
return self.lte(other)
@_extend_eeImage()
def __eq__(self, other):
'''Computes the rich comparison EQUAL between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Rich comparison EQUAL.
'''
return self.eq(other)
@_extend_eeImage()
def __ne__(self, other):
'''Computes the rich comparison NOT EQUAL THAN between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Rich comparison NOT EQUAL.
'''
return self.neq(other)
@_extend_eeImage()
def __gt__(self, other):
'''Computes the rich comparison GREATER THAN between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Rich comparison GREATER THAN.
'''
return self.gt(other)
@_extend_eeImage()
def __ge__(self, other):
'''Computes the rich comparison GREATER THAN OR EQUAL between two images.
Parameters
----------
self : ee.Image
Left operand.
other : ee.Image | numeric | list[numeric]
Right operand. If numeric, an ee.Image is created from its value. If list, an ee.Image with n bands (n = len(list)) is created from its values.
Returns
-------
ee.Image
Rich comparison GREATER THAN OR EQUAL.
'''
return self.gte(other)
@_extend_eeImage()
def __neg__(self):
'''Computes the unary operator NEGATIVE on an image.
Parameters
----------
self : ee.Image
Operand.
Returns
-------
ee.Image
Unary operator NEGATIVE.
'''
return self.multiply(-1)
@_extend_eeImage()
def __invert__(self):
'''Computes the unary operator NOT on an image.
Parameters
----------
self : ee.Image
Operand.
Returns
-------
ee.Image
Unary operator NOT.
'''
return self.Not()
[docs]@_extend_eeImage()
def index(self,index = 'NDVI',G = 2.5,C1 = 6.0,C2 = 7.5,L = 1.0):
'''Computes one or more spectral indices (indices are added as bands) for an image.
Parameters
----------
self : ee.Image [this]
Image to compute indices on. Must be scaled to [0,1]. Check the supported platforms in User Guide > Spectral Indices > Supported Platforms.
index : string | list[string], default = 'NDVI'
Index or list of indices to compute.\n
Available options:
- 'vegetation' : Compute all vegetation indices.
- 'burn' : Compute all burn indices.
- 'water' : Compute all water indices.
- 'snow' : Compute all snow indices.
- 'all' : Compute all indices listed below.
Vegetation indices:
- 'BNDVI' : Blue Normalized Difference Vegetation Index.
- 'CIG' : Chlorophyll Index - Green.
- 'CVI' : Chlorophyll Vegetation Index.
- 'EVI' : Enhanced Vegetation Index.
- 'EVI2' : Two-Band Enhanced Vegetation Index.
- 'GBNDVI' : Green-Blue Normalized Difference Vegetation Index.
- 'GNDVI' : Green Normalized Difference Vegetation Index.
- 'GRNDVI' : Green-Red Normalized Difference Vegetation Index.
- 'MNDVI' : Modified Normalized Difference Vegetation Index.
- 'NDVI' : Normalized Difference Vegetation Index.
- 'NGRDI' : Normalized Green Red Difference Index.
- 'RVI' : Ratio Vegetation Index.
- 'SAVI' : Soil-Adjusted Vegetation Index.
Burn and fire indices:
- 'BAI' : Burned Area Index.
- 'BAIS2' : Burned Area Index for Sentinel 2.
- 'CSIT' : Char Soil Index Thermal.
- 'NBR' : Normalized Burn Ratio.
- 'NBRT' : Normalized Burn Ratio Thermal.
- 'NDVIT' : Normalized Difference Vegetation Index Thermal
- 'SAVIT' : Soil-Adjusted Vegetation Index Thermal.
Water indices:
- 'MNDWI' : Modified Normalized Difference Water Index.
- 'NDWI' : Normalized Difference Water Index.
Snow indices:
- 'NDSI' : Normalized Difference Snow Index.
G : float, default = 2.5
Gain factor. Used just for index = 'EVI'.
C1 : float, default = 6.0
Coefficient 1 for the aerosol resistance term. Used just for index = 'EVI'.
C2 : float, default = 7.5
Coefficient 2 for the aerosol resistance term. Used just for index = 'EVI'.
L : float, default = 1.0
Canopy background adjustment. Used just for index = ['EVI','SAVI'].
Returns
-------
ee.Image
Image with the computed spectral index, or indices, as new bands.
Examples
--------
>>> import ee, eemont
>>> ee.Initialize()
>>> S2 = ee.ImageCollection('COPERNICUS/S2_SR').first().scale().index(['NDVI','EVI','GNDVI'])
See Also
--------
scale : Scales bands on an image collection.
'''
platformDict = _get_platform(self)
additionalParameters = {
'g': float(G),
'C1': float(C1),
'C2': float(C2),
'L': float(L),
}
spectralIndices = _get_indices()
indicesNames = list(spectralIndices.keys())
if not isinstance(index, list):
if index == 'all':
index = list(spectralIndices.keys())
elif index in ['vegetation','burn','water','snow']:
temporalListOfIndices = []
for idx in indicesNames:
if spectralIndices[idx]['type'] == index:
temporalListOfIndices.append(idx)
index = temporalListOfIndices
else:
index = [index]
for idx in index:
if idx not in list(spectralIndices.keys()):
warnings.warn("Index " + idx + " is not a built-in index and it won't be computed!",Warning)
else:
def temporalIndex(img):
lookupDic = _get_expression_map(img, platformDict)
lookupDic = {**lookupDic, **additionalParameters}
if all(band in list(lookupDic.keys()) for band in spectralIndices[idx]['requires']):
return img.addBands(img.expression(spectralIndices[idx]['formula'],lookupDic).rename(idx))
else:
warnings.warn("This platform doesn't have the required bands for " + idx + " computation!",Warning)
return img
self = temporalIndex(self)
return self
[docs]@_extend_eeImage()
def maskClouds(self, method = 'cloud_prob', prob = 60, maskCirrus = True, maskShadows = True, scaledImage = False, dark = 0.15, cloudDist = 1000, buffer = 250, cdi = None):
'''Masks clouds and shadows in an image (valid just for Surface Reflectance products).
Parameters
----------
self : ee.Image [this]
Image to mask. Check the supported platforms in User Guide > Masking Clouds and Shadows > Supported Platforms.
method : string, default = 'cloud_prob'
Method used to mask clouds.\n
Available options:
- 'cloud_prob' : Use cloud probability.
- 'qa' : Use Quality Assessment band.
This parameter is ignored for Landsat products.
prob : numeric [0, 100], default = 60
Cloud probability threshold. Valid just for method = 'prob'. This parameter is ignored for Landsat products.
maskCirrus : boolean, default = True
Whether to mask cirrus clouds. Valid just for method = 'qa'. This parameter is ignored for Landsat products.
maskShadows : boolean, default = True
Whether to mask cloud shadows. For more info see 'Braaten, J. 2020. Sentinel-2 Cloud Masking with s2cloudless. Google Earth Engine, Community Tutorials'.
scaledImage : boolean, default = False
Whether the pixel values are scaled to the range [0,1] (reflectance values). This parameter is ignored for Landsat products.
dark : float [0,1], default = 0.15
NIR threshold. NIR values below this threshold are potential cloud shadows. This parameter is ignored for Landsat products.
cloudDist : int, default = 1000
Maximum distance in meters (m) to look for cloud shadows from cloud edges. This parameter is ignored for Landsat products.
buffer : int, default = 250
Distance in meters (m) to dilate cloud and cloud shadows objects. This parameter is ignored for Landsat products.
cdi : float [-1,1], default = None
Cloud Displacement Index threshold. Values below this threshold are considered potential clouds.
A cdi = None means that the index is not used. For more info see 'Frantz, D., HaS, E., Uhl, A., Stoffels, J., Hill, J. 2018. Improvement of the Fmask algorithm for Sentinel-2 images:
Separating clouds from bright surfaces based on parallax effects. Remote Sensing of Environment 2015: 471-481'.
This parameter is ignored for Landsat products.
Returns
-------
ee.Image
Cloud-shadow masked image.
Examples
--------
>>> import ee, eemont
>>> ee.Initialize()
>>> S2 = ee.ImageCollection('COPERNICUS/S2_SR').first().maskClouds(prob = 75,buffer = 300,cdi = -0.5)
Notes
-----
This method may mask water as well as clouds for the Sentinel-3 Radiance product.
'''
def S3(args):
qa = args.select('quality_flags')
notCloud = qa.bitwiseAnd(1 << 27).eq(0);
return args.updateMask(notCloud)
def S2(args):
def cloud_prob(img):
clouds = ee.Image(img.get('cloud_mask')).select('probability')
isCloud = clouds.gte(prob).rename('CLOUD_MASK')
return img.addBands(isCloud)
def QA(img):
qa = img.select('QA60')
cloudBitMask = 1 << 10
isCloud = qa.bitwiseAnd(cloudBitMask).eq(0)
if maskCirrus:
cirrusBitMask = 1 << 11
isCloud = isCloud.And(qa.bitwiseAnd(cirrusBitMask).eq(0))
isCloud = isCloud.Not().rename('CLOUD_MASK')
return img.addBands(isCloud)
def CDI(img):
idx = img.get('system:index')
S2TOA = ee.ImageCollection('COPERNICUS/S2').filter(ee.Filter.eq('system:index',idx)).first()
CloudDisplacementIndex = ee.Algorithms.Sentinel2.CDI(S2TOA)
isCloud = CloudDisplacementIndex.lt(cdi).rename('CLOUD_MASK_CDI')
return img.addBands(isCloud)
def get_shadows(img):
notWater = img.select('SCL').neq(6)
if not scaledImage:
darkPixels = img.select('B8').lt(dark * 1e4).multiply(notWater)
else:
darkPixels = img.select('B8').lt(dark).multiply(notWater)
shadowAzimuth = ee.Number(90).subtract(ee.Number(img.get('MEAN_SOLAR_AZIMUTH_ANGLE')))
cloudProjection = img.select('CLOUD_MASK').directionalDistanceTransform(shadowAzimuth,cloudDist/10)
cloudProjection = cloudProjection.reproject(crs = img.select(0).projection(),scale = 10).select('distance').mask()
isShadow = cloudProjection.multiply(darkPixels).rename('SHADOW_MASK')
return img.addBands(isShadow)
def clean_dilate(img):
isCloudShadow = img.select('CLOUD_MASK')
if cdi != None:
isCloudShadow = isCloudShadow.And(img.select('CLOUD_MASK_CDI'))
if maskShadows:
isCloudShadow = isCloudShadow.add(img.select('SHADOW_MASK')).gt(0)
isCloudShadow = isCloudShadow.focal_min(20,units = 'meters').focal_max(buffer*2/10,units = 'meters').rename('CLOUD_SHADOW_MASK')
return img.addBands(isCloudShadow)
def apply_mask(img):
return img.updateMask(img.select('CLOUD_SHADOW_MASK').Not())
if method == 'cloud_prob':
S2Clouds = ee.ImageCollection('COPERNICUS/S2_CLOUD_PROBABILITY')
fil = ee.Filter.equals(leftField = 'system:index',rightField = 'system:index')
S2WithCloudMask = ee.Join.saveFirst('cloud_mask').apply(ee.ImageCollection(args),S2Clouds,fil)
S2Masked = ee.ImageCollection(S2WithCloudMask).map(cloud_prob).first()
elif method == 'qa':
S2Masked = QA(args)
if cdi != None:
S2Masked = CDI(S2Masked)
if maskShadows:
S2Masked = get_shadows(S2Masked)
S2Masked = apply_mask(clean_dilate(S2Masked))
return S2Masked
def L8(args):
cloudsBitMask = (1 << 5)
qa = args.select('pixel_qa')
mask = qa.bitwiseAnd(cloudsBitMask).eq(0)
if maskShadows:
cloudShadowBitMask = (1 << 3)
mask = mask.And(qa.bitwiseAnd(cloudShadowBitMask).eq(0))
return args.updateMask(mask)
def L457(args):
qa = args.select('pixel_qa')
cloud = qa.bitwiseAnd(1 << 5).And(qa.bitwiseAnd(1 << 7))
if maskShadows:
cloud = cloud.Or(qa.bitwiseAnd(1 << 3))
mask2 = args.mask().reduce(ee.Reducer.min());
return args.updateMask(cloud.Not()).updateMask(mask2);
def MOD09GA(args):
qa = args.select('state_1km')
notCloud = qa.bitwiseAnd(1 << 0).eq(0)
if maskShadows:
notCloud = notCloud.And(qa.bitwiseAnd(1 << 2).eq(0))
if maskCirrus:
notCloud = notCloud.And(qa.bitwiseAnd(1 << 8).eq(0))
return args.updateMask(notCloud);
def MCD15A3H(args):
qa = args.select('FparExtra_QC')
notCloud = qa.bitwiseAnd(1 << 5).eq(0)
if maskShadows:
notCloud = notCloud.And(qa.bitwiseAnd(1 << 6).eq(0))
if maskCirrus:
notCloud = notCloud.And(qa.bitwiseAnd(1 << 4).eq(0))
return args.updateMask(notCloud);
def MOD09Q1(args):
qa = args.select('State')
notCloud = qa.bitwiseAnd(1 << 0).eq(0)
if maskShadows:
notCloud = notCloud.And(qa.bitwiseAnd(1 << 2).eq(0))
if maskCirrus:
notCloud = notCloud.And(qa.bitwiseAnd(1 << 8).eq(0))
return args.updateMask(notCloud);
def MOD09A1(args):
qa = args.select('StateQA')
notCloud = qa.bitwiseAnd(1 << 0).eq(0)
if maskShadows:
notCloud = notCloud.And(qa.bitwiseAnd(1 << 2).eq(0))
if maskCirrus:
notCloud = notCloud.And(qa.bitwiseAnd(1 << 8).eq(0))
return args.updateMask(notCloud)
def MOD17A2H(args):
qa = args.select('Psn_QC')
notCloud = qa.bitwiseAnd(1 << 3).eq(0)
return args.updateMask(notCloud)
def MOD16A2(args):
qa = args.select('ET_QC')
notCloud = qa.bitwiseAnd(1 << 3).eq(0)
return args.updateMask(notCloud)
def MOD13Q1A1(args):
qa = args.select('SummaryQA')
notCloud = qa.bitwiseAnd(1 << 0).eq(0)
return args.updateMask(notCloud)
def MOD13A2(args):
qa = args.select('SummaryQA')
notCloud = qa.eq(0)
return args.updateMask(notCloud)
lookup = {
'COPERNICUS/S3': S3,
'COPERNICUS/S2': S2,
'LANDSAT/LC08': L8,
'LANDSAT/LE07': L457,
'LANDSAT/LT05': L457,
'LANDSAT/LT04': L457,
'MODIS/006/MOD09GA': MOD09GA,
'MODIS/006/MCD15A3H': MCD15A3H,
'MODIS/006/MOD09Q1': MOD09Q1,
'MODIS/006/MOD09A1': MOD09A1,
'MODIS/006/MOD17A2H': MOD17A2H,
'MODIS/006/MOD16A2': MOD16A2,
'MODIS/006/MOD13Q1': MOD13Q1A1,
'MODIS/006/MOD13A1': MOD13Q1A1,
'MODIS/006/MOD13A2': MOD13A2,
'MODIS/006/MYD09GA': MOD09GA,
'MODIS/006/MYD09Q1': MOD09Q1,
'MODIS/006/MYD09A1': MOD09A1,
'MODIS/006/MYD17A2H': MOD17A2H,
'MODIS/006/MYD16A2': MOD16A2,
'MODIS/006/MYD13Q1': MOD13Q1A1,
'MODIS/006/MYD13A1': MOD13Q1A1,
'MODIS/006/MYD13A2': MOD13A2
}
platformDict = _get_platform(self)
if platformDict['platform'] not in list(lookup.keys()):
raise Exception("Sorry, satellite platform not supported for cloud masking!")
maskedImage = lookup[platformDict['platform']](self)
return maskedImage
[docs]@_extend_eeImage()
def scale(self):
'''Scales bands on an image.
Parameters
----------
self : ee.Image [this]
Image to scale. Check the supported platforms in User Guide > Image Scaling > Supported Platforms.
Returns
-------
ee.Image
Scaled image.
Examples
--------
>>> import ee, eemont
>>> ee.Initialize()
>>> S2 = ee.ImageCollection('COPERNICUS/S2_SR').first().scale()
'''
platformDict = _get_platform(self)
lookup = _get_scale_method(platformDict)
if platformDict['platform'] not in list(lookup.keys()):
raise Exception("Sorry, satellite platform not supported for scaling!")
scaledImage = lookup[platformDict['platform']](self)
return scaledImage