Source code for ee_extra.STAC.core
import json
import os
import re
import urllib.request
import warnings
from typing import Optional, Union
import ee
import pkg_resources
from ee_extra.STAC.utils import _get_platform_STAC
from ee_extra.utils import _load_JSON
[docs]def getSTAC(x: Union[ee.Image, ee.ImageCollection]) -> dict:
"""Gets the STAC of the specified platform.
Args:
x : Image or image collection to get the STAC from.
Returns:
STAC of the ee.Image or ee.ImageCollection dataset.
Examples:
>>> import ee
>>> from ee_extra.STAC.core import getSTAC
>>> ee.Initialize()
>>> S2 = ee.ImageCollection("COPERNICUS/S2_SR")
>>> getSTAC(S2)
"""
platformDict = _get_platform_STAC(x)
eeDict = _load_JSON()
# With requests:
# STAC = requests.get(eeDict[platformDict["platform"]]["href"]).json()
# With urllib:
with urllib.request.urlopen(eeDict[platformDict["platform"]]["href"]) as url:
STAC = json.loads(url.read().decode())
return STAC
[docs]def getScaleParams(x: Union[ee.Image, ee.ImageCollection]) -> dict:
"""Gets the scale parameters for each band of the image or image collection.
Args:
x : Image or image collection to get the scale parameters from.
Returns:
Dictionary with the scale parameters for each band.
Examples:
>>> import ee
>>> from ee_extra.STAC.core import getScaleParams
>>> ee.Initialize()
>>> S2 = ee.ImageCollection("COPERNICUS/S2_SR")
>>> getScaleParams(S2)
"""
platformDict = _get_platform_STAC(x)
eeDict = _load_JSON("ee-catalog-scale.json")
platforms = list(eeDict.keys())
if platformDict["platform"] not in platforms:
warnings.warn("This platform is not supported for getting scale parameters.")
return None
else:
return eeDict[platformDict["platform"]]
[docs]def getOffsetParams(x: Union[ee.Image, ee.ImageCollection]) -> dict:
"""Gets the offset parameters for each band of the image or image collection.
Args:
x : Image or image collection to get the offset parameters from.
Returns:
Dictionary with the offset parameters for each band.
Examples:
>>> import ee
>>> from ee_extra.STAC.core import getOffsetParams
>>> ee.Initialize()
>>> S2 = ee.ImageCollection("COPERNICUS/S2_SR")
>>> getOffsetParams(S2)
"""
platformDict = _get_platform_STAC(x)
eeDict = _load_JSON("ee-catalog-offset.json")
platforms = list(eeDict.keys())
if platformDict["platform"] not in platforms:
warnings.warn("This platform is not supported for getting offset parameters.")
return None
else:
return eeDict[platformDict["platform"]]
[docs]def scaleAndOffset(
x: Union[ee.Image, ee.ImageCollection]
) -> Union[ee.Image, ee.ImageCollection]:
"""Scales and offsets bands on an Image or Image Collection.
Args:
x : Image or Image Collection to scale.
Returns:
Scaled image or image collection.
Examples:
>>> import ee
>>> from ee_extra.STAC.core import scaleAndOffset
>>> ee.Initialize()
>>> S2 = ee.ImageCollection("COPERNICUS/S2_SR")
>>> scaleAndOffset(S2)
"""
scaleParams = getScaleParams(x)
offsetParams = getOffsetParams(x)
if scaleParams is None or offsetParams is None:
warnings.warn("This platform is not supported for scaling and offsetting.")
return x
else:
scaleParams = ee.Dictionary(scaleParams).toImage()
offsetParams = ee.Dictionary(offsetParams).toImage()
def scaleOffset(img):
bands = img.bandNames()
scaleList = scaleParams.bandNames()
bands = bands.filter(ee.Filter.inList("item", scaleList))
SOscaleParams = scaleParams.select(bands)
SOoffsetParams = offsetParams.select(bands)
scaled = img.select(bands).multiply(SOscaleParams).add(SOoffsetParams)
return ee.Image(scaled.copyProperties(img, img.propertyNames()))
if isinstance(x, ee.image.Image):
scaled = scaleOffset(x)
elif isinstance(x, ee.imagecollection.ImageCollection):
scaled = x.map(scaleOffset)
return scaled
[docs]def getDOI(x: Union[ee.Image, ee.ImageCollection]) -> str:
"""Gets the DOI of the specified platform, if available.
Args:
x : Image or Image Collection to get the DOI from.
Returns:
DOI of the ee.Image or ee.ImageCollection dataset.
Examples:
>>> import ee
>>> from ee_extra.STAC.core import getDOI
>>> ee.Initialize()
>>> S2 = ee.ImageCollection("COPERNICUS/S2_SR")
>>> getDOI(S2)
"""
platformDict = _get_platform_STAC(x)
eeDict = _load_JSON()
return eeDict[platformDict["platform"]]["sci:doi"]
[docs]def getCitation(x: Union[ee.Image, ee.ImageCollection]) -> str:
"""Gets the citation of the specified platform, if available.
Args:
x : Image or Image Collection to get the citation from.
Returns:
Citation of the ee.Image or ee.ImageCollection dataset.
Examples:
>>> import ee
>>> from ee_extra.STAC.core import getCitation
>>> ee.Initialize()
>>> S2 = ee.ImageCollection("COPERNICUS/S2_SR")
>>> getCitation(S2)
"""
platformDict = _get_platform_STAC(x)
eeDict = _load_JSON()
return eeDict[platformDict["platform"]]["sci:citation"]
[docs]def listDatasets() -> list:
"""Returns all datasets from the GEE STAC as a list.
Returns:
List of all datasets from the GEE STAC.
Examples:
>>> import ee
>>> from ee_extra.STAC.core import listDatasets
>>> ee.Initialize()
>>> listDatasets()
"""
eeDict = _load_JSON()
return list(eeDict.keys())