Skip to content

Instantly share code, notes, and snippets.

@csaybar
Created February 4, 2020 21:30
Show Gist options
  • Select an option

  • Save csaybar/d10c67ada2506842247c9419320d5051 to your computer and use it in GitHub Desktop.

Select an option

Save csaybar/d10c67ada2506842247c9419320d5051 to your computer and use it in GitHub Desktop.
mastergisprop
@csaybar

csaybar commented Feb 19, 2020

Copy link
Copy Markdown
Author

3. Extraer los valores

#CREA UN SNIPPET!

import re

# Extraer valores en GEE por geometrias (puntos, lineas y poligonos) pareciera
# una tarea facil, sin embargo, es necesario un conocimiento claro de como 
# funciona la API.
def extract_values(x, y, fun = ee.Reducer.mean(), scale=1000,ID=None):
  
  # Hacemos un backup del id de la geometria
  if ID is None:
    y = ee.FeatureCollection(y).map(
        lambda x: x.set("ee_ID", x.get("system:index")))
  else:
    y = ee.FeatureCollection(y).map(
        lambda x: x.set("ee_ID", x.get(ID)))
  
  #Elimina la palabra "Reducer." para quedarte solo con el tipo de reductor
  fun_name = re.sub("Reducer.", "", fun.getInfo()["type"])

  #Reducimos por region a cada imagen de nuestro ImageCollection
  triplets = ee.ImageCollection(x).map(lambda image:image.reduceRegions(
      collection = y,
      reducer = fun,
      scale = scale
    ).map(lambda f: f.set("imageId", image.id()))).flatten()
  table = table_format(table = triplets,
                       rowId = "ee_ID", 
                       colId = "imageId",
                       val = fun_name)#.map(lambda f:f.setGeometry(None))
  return table



def table_format(table, rowId, colId,val):
    """Format a table of triplets into a 2D table of rowId x colId.
    Args:
        table: EE Image or ImageCollection
        rowID: ID unico de las geometrias.
        colID: ID unico de las imagenes.
        fun_name: Nombre de la funcion aplicada
    Returns:
        A EE table
    """
    # Obtenga la lista de todas las ID de geometrias unicas.
    rows = table.distinct(rowId)
    
    # Hasta aqui "table" esta agrupado por espacio es decir en el primer grupo
    # estan todas las geometrias para el mes de enero, en el segundo grupo para
    # febrero etc.
    # Con ee.Join.SaveAll cambiaremos este orden agrupando temporalmente es 
    # decir ahora el primer grupo tendra todos los meses de la primera 
    # geometria, el segun grupo todos los meses de la segunda geometria, etc.    
    joined = ee.Join.saveAll('matches').apply(
        primary =  rows,
        secondary = table,
        condition = ee.Filter.equals(
          leftField = rowId,
          rightField = rowId
        ))
    row = joined.first()
    def get_f(row):
        # Obtenga la lista de todas las grupos (geometrias) con un ID de fila unico y
        # Mapear una funcion sobre la lista de filas para devolver una lista de
        # ID de columna y valor.
        values = ee.List(row.get('matches')).map(lambda feature: [
          ee.Feature(feature).get(colId),
          ee.Feature(feature).get(val)]) # val es el resultado de la reduccion
        # Devuelve la fila con su propiedad ID y propiedades para
        # todas las ID de columnas coincidentes que almacenan la salida del reductor.
        # El constructor del diccionario está usando una lista de pares clave, valor.
        return row.select([rowId]).set(ee.Dictionary(values.flatten()))
    return joined.map(get_f)

@csaybar

csaybar commented Feb 19, 2020

Copy link
Copy Markdown
Author

Corre para pp y aet

4. Descargar los resultados (De Google Earth Engine a Google Drive)

Podrias juntar los resultados en un solo FC?

# Donde
# collection: es el FeatureCollection con la informacion climatica
# description: es el nombre que tendra el archivo SHP en Google Drive.
# folder: es la carpeta que se creara en Google Drive.
# fileFormat: es el formato del archivo de salida ('GeoJSON','KML','KMZ','SHP','CSV','TFRecord')

amazon_pp_result  = extract_values(terraclimate_clim.select('pr'), amazonas, fun = ee.Reducer.mean(), scale=1000)
amazon_aet_result  = extract_values(terraclimate_clim.select('aet'), amazonas, fun = ee.Reducer.mean(), scale=1000)

task = ee.batch.Export.table.toDrive(
    collection=amazon_pp_result,
    description='amazon_pp_climatic',
    folder='TareaMASTERGIS',
    fileFormat='SHP')
task.start()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment