Junções espaciais

As coleções podem ser agrupadas por localização espacial e valores de propriedade. Para fazer a mesclagem com base na localização espacial, use um filtro withinDistance() com campos de mesclagem .geo especificados. O campo .geo indica que a geometria do item será usada para calcular a métrica de distância. Por exemplo, considere a tarefa de encontrar todas as usinas elétricas a até 100 quilômetros do Parque Nacional de Yosemite, nos EUA. Para isso, use um filtro nos campos de geometria, com a distância máxima definida como 100 quilômetros usando o 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);

Configuração do Python

Consulte a página Ambiente Python para informações sobre a API Python e o uso de geemap para desenvolvimento interativo.

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)

O exemplo anterior mescla uma FeatureCollection a outra FeatureCollection. A mesclagem saveAll() define uma propriedade (points) em cada elemento na coleção primary, que armazena uma lista dos pontos a até 100 km do elemento. A distância de cada ponto para o elemento é armazenada na propriedade distance de cada ponto associado.

As mesclagens espaciais também podem ser usadas para identificar quais elementos de uma coleção se cruzam com os de outra. Por exemplo, considere duas coleções de elementos: uma coleção primary contendo polígonos que representam os limites dos estados dos EUA e uma coleção secondary contendo locais de pontos que representam usinas hidrelétricas. Suponha que seja necessário determinar o número que cruza cada estado. Isso pode ser feito com uma mesclagem espacial da seguinte maneira:

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);

No exemplo anterior, o filtro intersects() não armazena uma distância, como o filtro withinDistance(). A saída será semelhante à Figura 1.

Reunião da CA WRS2
Figura 1. Gráfico de barras mostrando o número de usinas elétricas que cruzam cada estado dos EUA.