Pour agréger les données dans les propriétés d'un FeatureCollection
, utilisez featureCollection.reduceColumns()
. Par exemple, pour vérifier les propriétés d'aire dans les bassins versants FeatureCollection
, ce code calcule la racine carrée de l'erreur quadratique moyenne (RMSE) par rapport à la zone calculée par Earth Engine:
Éditeur de code (JavaScript)
// Load watersheds from a data table and filter to the continental US. var sheds = ee.FeatureCollection('USGS/WBD/2017/HUC06') .filterBounds(ee.Geometry.Rectangle(-127.18, 19.39, -62.75, 51.29)); // This function computes the squared difference between an area property // and area computed directly from the feature's geometry. var areaDiff = function(feature) { // Compute area in sq. km directly from the geometry. var area = feature.geometry().area().divide(1000 * 1000); // Compute the difference between computed area and the area property. var diff = area.subtract(ee.Number.parse(feature.get('areasqkm'))); // Return the feature with the squared difference set to the 'diff' property. return feature.set('diff', diff.pow(2)); }; // Calculate RMSE for population of difference pairs. var rmse = ee.Number( // Map the difference function over the collection. sheds.map(areaDiff) // Reduce to get the mean squared difference. .reduceColumns(ee.Reducer.mean(), ['diff']) .get('mean') ) // Compute the square root of the mean square to get RMSE. .sqrt(); // Print the result. print('RMSE=', rmse);
import ee import geemap.core as geemap
Colab (Python)
# Load watersheds from a data table and filter to the continental US. sheds = ee.FeatureCollection('USGS/WBD/2017/HUC06').filterBounds( ee.Geometry.Rectangle(-127.18, 19.39, -62.75, 51.29) ) # This function computes the squared difference between an area property # and area computed directly from the feature's geometry. def area_diff(feature): # Compute area in sq. km directly from the geometry. area = feature.geometry().area().divide(1000 * 1000) # Compute the difference between computed area and the area property. diff = area.subtract(ee.Number.parse(feature.get('areasqkm'))) # Return the feature with the squared difference set to the 'diff' property. return feature.set('diff', diff.pow(2)) # Calculate RMSE for population of difference pairs. rmse = ( ee.Number( # Map the difference function over the collection. sheds.map(area_diff) # Reduce to get the mean squared difference. .reduceColumns(ee.Reducer.mean(), ['diff']).get('mean') ) # Compute the square root of the mean square to get RMSE. .sqrt() ) # Print the result. display('RMSE=', rmse)
Dans cet exemple, notez que la valeur de retour de reduceColumns()
est un dictionnaire avec la clé ‘mean’
. Pour obtenir la moyenne, convertissez le résultat de dictionary.get()
en nombre avec ee.Number()
avant d'essayer d'appeler sqrt()
dessus. Pour en savoir plus sur les structures de données auxiliaires dans Earth Engine, consultez ce tutoriel.
Pour superposer des éléments géographiques sur des images, utilisez featureCollection.reduceRegions()
. Par exemple, pour calculer le volume de précipitations dans les bassins hydrographiques des États-Unis continentaux, utilisez reduceRegions()
suivi d'un map()
:
Éditeur de code (JavaScript)
// Load an image of daily precipitation in mm/day. var precip = ee.Image(ee.ImageCollection('NASA/ORNL/DAYMET_V3').first()); // Load watersheds from a data table and filter to the continental US. var sheds = ee.FeatureCollection('USGS/WBD/2017/HUC06') .filterBounds(ee.Geometry.Rectangle(-127.18, 19.39, -62.75, 51.29)); // Add the mean of each image as new properties of each feature. var withPrecip = precip.reduceRegions(sheds, ee.Reducer.mean()) .filter(ee.Filter.notNull(['prcp'])); // This function computes total rainfall in cubic meters. var prcpVolume = function(feature) { // Precipitation in mm/day -> meters -> sq. meters. var volume = ee.Number(feature.get('prcp')) .divide(1000).multiply(feature.geometry().area()); return feature.set('volume', volume); }; var highVolume = withPrecip // Map the function over the collection. .map(prcpVolume) // Sort descending. .sort('volume', false) // Get only the 5 highest volume watersheds. .limit(5) // Extract the names to a list. .reduceColumns(ee.Reducer.toList(), ['name']).get('list'); // Print the resulting FeatureCollection. print(highVolume);
import ee import geemap.core as geemap
Colab (Python)
# Load an image of daily precipitation in mm/day. precip = ee.Image(ee.ImageCollection('NASA/ORNL/DAYMET_V3').first()) # Load watersheds from a data table and filter to the continental US. sheds = ee.FeatureCollection('USGS/WBD/2017/HUC06').filterBounds( ee.Geometry.Rectangle(-127.18, 19.39, -62.75, 51.29) ) # Add the mean of each image as new properties of each feature. with_precip = precip.reduceRegions(sheds, ee.Reducer.mean()).filter( ee.Filter.notNull(['prcp']) ) # This function computes total rainfall in cubic meters. def prcp_volume(feature): # Precipitation in mm/day -> meters -> sq. meters. volume = ( ee.Number(feature.get('prcp')) .divide(1000) .multiply(feature.geometry().area()) ) return feature.set('volume', volume) high_volume = ( # Map the function over the collection. with_precip.map(prcp_volume) # Sort descending and get only the 5 highest volume watersheds. .sort('volume', False).limit(5) # Extract the names to a list. .reduceColumns(ee.Reducer.toList(), ['name']).get('list') ) # Print the resulting FeatureCollection. display(high_volume)
Pour en savoir plus sur la réduction des collections d'éléments géographiques, consultez les sections Statistiques des colonnes FeatureCollection et Conversion de vecteurs en rasters.