Join spaziali

Le raccolte possono essere unite in base alla posizione spaziale e ai valori delle proprietà. Per eseguire l'unione in base alla posizione spaziale, utilizza un filtro withinDistance() con i campi di join .geo specificati. Il campo .geo indica che la geometria dell'elemento deve essere utilizzata per calcolare la metrica della distanza. Ad esempio, considera l'attività di ricerca di tutte le centrali elettriche nel raggio di 100 chilometri del Parco nazionale di Yosemite, negli Stati Uniti. A questo scopo, utilizza un filtro sui campi della geometria con la distanza massima impostata su 100 chilometri utilizzando il parametro distance:

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

Per informazioni sull'API Python e sull'utilizzo di geemap per lo sviluppo interattivo, consulta la pagina Ambiente Python.

import ee
import geemap.core as geemap
# 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)

Tieni presente che l'esempio precedente unisce un FeatureCollection a un altro FeatureCollection. L'unione saveAll() imposta una proprietà (points) su ogni elemento della raccolta primary che memorizza un elenco di punti entro 100 km dall'elemento. La distanza di ogni punto dalla caratteristica viene memorizzata nella proprietà distance di ogni punto unito.

Le unioni spaziali possono essere utilizzate anche per identificare quali elementi di una raccolta intersecano quelli di un'altra. Ad esempio, considera due raccolte di elementi: una raccolta primary contenente poligoni che rappresentano i confini degli stati degli Stati Uniti e una raccolta secondary contenente posizioni puntiformi che rappresentano centrali elettriche. Supponiamo che sia necessario determinare il numero che interseca ogni stato. Questo può essere ottenuto con un join spaziale come segue:

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

Nell'esempio precedente, tieni presente che il filtro intersects() non memorizza una distanza come fa il filtro withinDistance(). L'output dovrebbe essere simile alla Figura 1.

Join CA WRS2
Figura 1. Grafico a barre che mostra il numero di centrali elettriche che intersecano ogni stato degli Stati Uniti.