Räumliche Zusammenführungen

Sammlungen können sowohl nach geografischem Standort als auch nach Property-Werten zusammengeführt werden. Wenn Sie eine Verbindung basierend auf dem geografischen Standort herstellen möchten, verwenden Sie einen withinDistance()-Filter mit angegebenen .geo-Join-Feldern. Das Feld .geo gibt an, dass die Geometrie des Elements zum Berechnen des Entfernungsmesswerts verwendet werden soll. Angenommen, Sie möchten alle Kraftwerke in einem Umkreis von 100 Kilometern um den Yosemite-Nationalpark in den USA finden. Verwenden Sie dazu einen Filter für die Geometriefelder, bei dem die maximale Entfernung mit dem Parameter distance auf 100 Kilometer festgelegt ist:

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

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

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)

Im vorherigen Beispiel wird ein FeatureCollection mit einem anderen FeatureCollection verknüpft. Durch die saveAll()-Join-Operation wird für jedes Element in der Sammlung primary eine Property (points) festgelegt, in der eine Liste der Punkte gespeichert wird, die sich innerhalb von 100 km vom Element befinden. Die Entfernung jedes Punkts zum Element wird in der distance-Property jedes verbundenen Punkts gespeichert.

Mithilfe von räumlichen Joins können Sie auch ermitteln, welche Elemente in einer Sammlung sich mit denen in einer anderen überschneiden. Angenommen, Sie haben zwei Feature-Sammlungen: eine primary-Sammlung mit Polygonen, die die Grenzen von US-Bundesstaaten darstellen, und eine secondary-Sammlung mit Punktstandorten, die Kraftwerke darstellen. Angenommen, Sie müssen die Anzahl der Schnittpunkte mit den einzelnen Bundesländern ermitteln. Dies kann mit einem geografischen Join so erfolgen:

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

Beachten Sie im vorherigen Beispiel, dass der intersects()-Filter keinen Abstand speichert, wie es beim withinDistance()-Filter der Fall ist. Die Ausgabe sollte in etwa so aussehen wie in Abbildung 1.

CA WRS2-Join
Abbildung 1. Balkendiagramm mit der Anzahl der Kraftwerke, die sich in den einzelnen US-Bundesstaaten befinden.