Uniones espaciales

Las colecciones se pueden unir por ubicación espacial y por valores de propiedad. Para unir según la ubicación espacial, usa un filtro withinDistance() con campos de unión .geo especificados. El campo .geo indica que se debe usar la geometría del elemento para calcular la métrica de distancia. Por ejemplo, considera la tarea de encontrar todas las plantas de energía dentro de un radio de 100 kilómetros del Parque Nacional de Yosemite, EE.UU. Para ello, usa un filtro en los campos de geometría, con la distancia máxima establecida en 100 kilómetros con el parámetro distance:

Editor de código (JavaScript)

// Load a primary collection: protected areas (Yosemite National Park).
var primary = ee.FeatureCollection("WCMC/WDPA/current/polygons")
  .filter(ee.Filter.eq('NAME', 'Yosemite National Park'));

// Load a secondary collection: power plants.
var powerPlants = ee.FeatureCollection('WRI/GPPD/power_plants');

// Define a spatial filter, with distance 100 km.
var distFilter = ee.Filter.withinDistance({
  distance: 100000,
  leftField: '.geo',
  rightField: '.geo',
  maxError: 10
});

// Define a saveAll join.
var distSaveAll = ee.Join.saveAll({
  matchesKey: 'points',
  measureKey: 'distance'
});

// Apply the join.
var spatialJoined = distSaveAll.apply(primary, powerPlants, distFilter);

// Print the result.
print(spatialJoined);

Configuración de Python

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

import ee
import geemap.core as geemap

Colab (Python)

# Load a primary collection: protected areas (Yosemite National Park).
primary = ee.FeatureCollection('WCMC/WDPA/current/polygons').filter(
    ee.Filter.eq('NAME', 'Yosemite National Park')
)

# Load a secondary collection: power plants.
power_plants = ee.FeatureCollection('WRI/GPPD/power_plants')

# Define a spatial filter, with distance 100 km.
dist_filter = ee.Filter.withinDistance(
    distance=100000, leftField='.geo', rightField='.geo', maxError=10
)

# Define a saveAll join.
dist_save_all = ee.Join.saveAll(matchesKey='points', measureKey='distance')

# Apply the join.
spatial_joined = dist_save_all.apply(primary, power_plants, dist_filter)

# Print the result.
display(spatial_joined)

Ten en cuenta que el ejemplo anterior une un FeatureCollection a otro FeatureCollection. La unión saveAll() establece una propiedad (points) en cada componente de la colección primary que almacena una lista de los puntos dentro de un radio de 100 km del componente. La distancia de cada punto a la función se almacena en la propiedad distance de cada punto unido.

Las uniones espaciales también se pueden usar para identificar qué componentes de una colección se cruzan con los de otra. Por ejemplo, considera dos colecciones de componentes: una colección primary que contiene polígonos que representan los límites de los estados de EE.UU. y una colección secondary que contiene ubicaciones de puntos que representan centrales eléctricas. Supongamos que es necesario determinar el número que se cruza con cada estado. Esto se puede lograr con una unión espacial de la siguiente manera:

Editor de código (JavaScript)

// Load the primary collection: US state boundaries.
var states = ee.FeatureCollection('TIGER/2018/States');

// Load the secondary collection: power plants.
var powerPlants = ee.FeatureCollection('WRI/GPPD/power_plants');

// Define a spatial filter as geometries that intersect.
var spatialFilter = ee.Filter.intersects({
  leftField: '.geo',
  rightField: '.geo',
  maxError: 10
});

// Define a save all join.
var saveAllJoin = ee.Join.saveAll({
  matchesKey: 'power_plants',
});

// Apply the join.
var intersectJoined = saveAllJoin.apply(states, powerPlants, spatialFilter);

// Add power plant count per state as a property.
intersectJoined = intersectJoined.map(function(state) {
  // Get "power_plant" intersection list, count how many intersected this state.
  var nPowerPlants = ee.List(state.get('power_plants')).size();
  // Return the state feature with a new property: power plant count.
  return state.set('n_power_plants', nPowerPlants);
});

// Make a bar chart for the number of power plants per state.
var chart = ui.Chart.feature.byFeature(intersectJoined, 'NAME', 'n_power_plants')
  .setChartType('ColumnChart')
  .setSeriesNames({n_power_plants: 'Power plants'})
  .setOptions({
    title: 'Power plants per state',
    hAxis: {title: 'State'},
    vAxis: {title: 'Frequency'}});

// Print the chart to the console.
print(chart);

En el ejemplo anterior, ten en cuenta que el filtro intersects() no almacena una distancia como lo hace el filtro withinDistance(). El resultado debería ser similar a la Figura 1.

Unión de WRS2 de CA
Figura 1: Gráfico de barras que muestra la cantidad de centrales eléctricas que se cruzan en cada estado de EE.UU.