Novedad: Un conector para acercar Earth Engine y BigQuery en el análisis geoespacial



Google ha anunciado una nueva función que simplifica la exportación de datos tabulares de Earth Engine a BigQuery. Earth Engine y BigQuery comparten el objetivo de hacer que el procesamiento de datos a gran escala sea accesible y utilizable por una variedad más amplia de personas y aplicaciones.  Earth Engine tiende a centrarse en el procesamiento de imágenes, mientras que BigQuery está optimizado para procesar grandes conjuntos de datos tabulares. Esta nueva conexión es el primer gran paso hacia una interoperabilidad más profunda entre las dos plataformas.

Este tiempo atrás los usuarios han trasladado los datos de Earth Engine a BigQuery, pero se requería una cuidadosa atención a las codificaciones, el almacenamiento intermedio y los tipos de datos. Ahora se ofrece más jugo por menos presión, con una invocación de una sola línea para transferir datos de Earth Engine a BigQuery. Esta nueva función ‘Export.table.toBigQuery()’ simplifica varios flujos de información nuevos como:

  • Combinar datos de Earth Engine con fuentes de datos de BigQuery para obtener una imagen más completa de un problema en particular

  • Usar las poderosas herramientas de análisis de BigQuery para extraer información de los datos de Earth Engine

  • Compartir datos de Earth Engine con usuarios compatibles con SQL de una manera que sea accesible para ellos

Esta guía recorre el proceso de exportación de datos de Earth Engine a BigQuery y crea un ejemplo real del uso de las herramientas geoespaciales de Google para identificar carreteras inundadas.

Ejemplo: Detección de un camino inundado

Los fenómenos meteorológicos extremos tienen un impacto devastador en todo el mundo. Las inundaciones, las olas de calor y las sequías tienen costes humanos, de infraestructuras y financieros bastante sustanciales. El siguiente ejemplo muestra cómo usar mosaicos de datos satélite de Earth Engine y conjuntos de datos abiertos de carreteras de BigQuery, procesando los datos en ambos entornos para determinar qué segmentos de carreteras se ven afectados por una inundación en el Reino Unido.

Los requisitos previos

  1. Crea un nuevo proyecto en la nube y habilita las API de BigQuery y Earth Engine.

  2. Configura el acceso a Earth Engine .

  3. Crea un conjunto de datos en tu espacio de trabajo de BigQuery. Este ejemplo usa uno llamado "su_conjunto de datos".

  4. Utiliza el Editor de código de Earth Engine o puedes seguir los mismos pasos en el entorno de Colab con Python, que es más o menos igual.

Seguir este ejemplo requiere que se habilite una cuenta de facturación en el proyecto y generará cargos por el cómputo de Earth Engine, el almacenamiento de BigQuery, el cómputo de BigQuery y el tráfico de red.

Identificar áreas inundadas en Earth Engine

El Earth Engine Data Catalog contiene la colección Copernicus Sentinel Synthetic Aperture Radar. Este conjunto de datos público se compone de imágenes de radar que miden cómo las superficies dispersan las ondas de luz hacia el sensor de un satélite. Las masas de agua estancadas actúan como espejos para las señales de radio, reflejando la luz del radar del satélite en lugar de dispersarla de vuelta al sensor de imágenes. La mayoría de las superficies naturales no tienen esta propiedad, lo que significa que se pueden diferenciar cuerpos de agua estancados de su entorno buscando parches "oscuros" en las imágenes (es decir, áreas con valores bajos de retrodispersión). Prepara los datos de entrada seleccionando un área de interés y filtrando imágenes con polarización vertical-vertical ("VV"), enviando luz polarizada verticalmente y midiendo la luz polarizada verticalmente que viene de vuelta:

Nota: el script completo de Earth Engine está disponible en este enlace.

1. Carga el Editor de Código y defina el área de interés y la colección filtrada:

// The area of interest ("AOI") polygon, can also be imported or hand-drawn.

var aoi = ee.Geometry.Polygon(

        [[[-2.92, 54.10],

          [-2.92, 53.99],

          [-2.67, 53.99],

          [-2.67, 54.10]]], null, false);

// Load the Sentinel-1 collection (log scaling, VV co-polar).

var collection = ee.ImageCollection('COPERNICUS/S1_GRD')

    .filterBounds(aoi)

    .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))

    .select('VV');

2. Identifica las áreas que han cambiado más significativamente usando un par de imágenes de antes y después de las fuertes lluvias. La diferencia entre las dos imágenes indica las regiones que se inundaron.

// Smooth the data to remove noise.

var SMOOTHING_RADIUS_METERS = 100;

// Filter by date (before and after)

var before = collection.filterDate('2017-11-01', '2017-11-17')

    .mosaic()

    .focalMedian(SMOOTHING_RADIUS_METERS, 'circle', 'meters');

var after = collection.filterDate('2017-11-18', '2017-11-23')

    .mosaic()

    .focalMedian(SMOOTHING_RADIUS_METERS, 'circle', 'meters');

// Threshold smoothed radar intensities to identify areas with standing water.

var DIFF_THRESHOLD_DB = -3;

var diffSmoothed = after.subtract(before);

var diffThresholded = diffSmoothed.lt(DIFF_THRESHOLD_DB);


3. Después utiliza el conjunto de datos Global Surface Water para eliminar el agua superficial persistente (como lagos, ríos, etc.) del resultado:

// Remove global surface water (oceans, lakes, etc.).

var jrcData0 = ee.Image('JRC/GSW1_0/Metadata')

    .select('total_obs')

    .lte(0);

var waterMask = ee.Image('JRC/GSW1_0/GlobalSurfaceWater')

    .select('occurrence')

    .unmask(0)

    .max(jrcData0)

    .lt(50);  // mask for persistent water (more than 50% of the time)

var floodedPixels = diffThresholded.updateMask(waterMask);


4. Busca las áreas inundadas en BigQuery, convirtiendo los datos de píxeles inundados a formato vectorial.

// Convert the patches of pixels to polygons (vectors).

var vectors = floodedPixels.reduceToVectors({

  geometry: aoi,

  scale: 10,

  geometryType: 'polygon',

  eightConnected: false  // only connect if pixels share an edge

});

// Eliminate large features in the dataset.

var MAX_AREA = 500 * 1000;  // m^2

vectors = vectors.map(function (f) {

  return f.set('area', f.geometry().area(10));

}).filter(ee.Filter.lt("area", MAX_AREA));


5. Muestra las áreas inundadas en el mapa:

Map.centerObject(aoi, 13);  // display our AOI at zoom level 13

Map.addLayer(before, {min: -30, max: 0}, 'Before rains');

Map.addLayer(after, {min: -30, max: 0}, 'After rains');

Map.addLayer(diffSmoothed, {min: -10, max: 10}, 'Difference', false);

Map.addLayer(vectors, {color: 'blue'}, 'Flooded areas');

6. Este es el el gran paso, donde el nuevo conector de Earth Engine a BigQuery simplifica la exportación a una sola llamada ‘Export.table.toBigQuery()’.

Export.table.toBigQuery({

  collection: vectors,

  description:'ee2bq_export_polygons',

  // Update with your existing project and dataset names, and a table name.

  table: 'your_project.your_dataset.your_table'

});

7. Haz clic en el botón "Ejecutar" en el Editor de código para ejecutar el script. Al hacerlo, se agregará una tarea a la sección "Tareas no enviadas" de la pestaña Tareas (ver más abajo). Para iniciar la tarea, clica en el botón "Ejecutar" en la tarea misma (ver más abajo).

8. Espera a que se complete la tarea y navegue a la tabla exportada haciendo clic en el botón "Abrir en BigQuery".


Artículo de Google Maps traducido por ExtraMile Cloud en España.

Síguenos para estar al día del sector geoespacial y conocernos un poco más puedes en nuetsra Newsletter, Twitter o Linkedin. Podemos asesorarte para lograr la mejor solución adaptada a tu empresa escríbenos a hello@extramc.com.

Comentarios