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