Jointures spatiales

Les collections peuvent être jointes par emplacement spatial et par valeurs de propriété. Pour effectuer une jointure en fonction de l'emplacement spatial, utilisez un filtre withinDistance() avec des champs de jointure .geo spécifiés. Le champ .geo indique que la géométrie de l'élément doit être utilisée pour calculer la métrique de distance. Prenons l'exemple de la tâche consistant à trouver toutes les centrales électriques situées dans un rayon de 100 km du parc national de Yosemite, aux États-Unis. Pour ce faire, utilisez un filtre sur les champs de géométrie, avec une distance maximale définie sur 100 kilomètres à l'aide du paramètre distance:

Éditeur de code (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);

Configuration de Python

Consultez la page Environnement Python pour en savoir plus sur l'API Python et l'utilisation de geemap pour le développement interactif.

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)

Notez que l'exemple précédent joint un FeatureCollection à un autre FeatureCollection. La jointure saveAll() définit une propriété (points) sur chaque élément géographique de la collection primary, qui stocke une liste des points situés à moins de 100 km de l'élément géographique. La distance de chaque point à l'élément géographique est stockée dans la propriété distance de chaque point joint.

Les jointures spatiales peuvent également être utilisées pour identifier les éléments d'une collection qui se croisent avec ceux d'une autre. Prenons l'exemple de deux collections d'éléments géographiques: une collection primary contenant des polygones représentant les limites des États américains et une collection secondary contenant des emplacements de points représentant des centrales électriques. Supposons que vous deviez déterminer le nombre d'intersections avec chaque état. Pour ce faire, utilisez une jointure spatiale comme suit:

Éditeur de code (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);

Dans l'exemple précédent, notez que le filtre intersects() ne stocke pas de distance, contrairement au filtre withinDistance(). Le résultat devrait ressembler à la figure 1.

Association CA WRS2
Figure 1. Graphique à barres indiquant le nombre de centrales électriques dans chaque État des États-Unis