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