减少区域时如何将 FeatureCollection 展平为 table

How to flatten FeatureCollection to a table when reducing Regions

这一切对我来说都是新的。 我正在尝试展平并导出由 reduceRegions 产生的 table。结果 json 是一个 FeatureCollection 但尝试 .flatten() 会抛出错误。

// Import WDPA dataset
var dataset = ee.FeatureCollection('WCMC/WDPA/current/polygons');

//var roi = dataset.filter(ee.Filter.eq('WDPAID', 33046)); // Cacheu
var roi = dataset.filter(ee.Filter.eq('PARENT_ISO', 'GNB')).select('WDPAID'); // all PA in GNB

// Import Global Forest Change dataset.
var dataset = ee.Image('UMD/hansen/global_forest_change_2019_v1_7').clip(roi);

// Subset the loss year layer; make units absolute (instead of years since 2000). 
var treeLoss = dataset.select('lossyear').add(2000).selfMask();

// Display year of forest loss detection to the map.
Map.setOptions('SATELLITE');
Map.addLayer(treeLoss, {
    min: 2001,
    max: 2019,
    palette: ['0D0887', '5B02A3', '9A179B', 'CB4678',
              'EB7852', 'FBB32F', 'F0F921']
  }, 'Tree loss year');


var forestloss = treeLoss.reduceRegions({
  'collection': roi,
  'reducer': ee.Reducer.frequencyHistogram(),
  'scale': 100,
  'crs': 'EPSG:5070'})
  .select('histogram');

我的 roi 中的单个功能运行良好,但是当我尝试使用功能集合并在此时添加 .flatten() 时,出现错误

"the input collection must be a collection of collections but the element ... was feature, which is not a collection."

print(forestloss, 'forestloss');

Map.setOptions('SATELLITE');
Map.centerObject(roi)
Map.addLayer(roi, {}, 'WDPA GB', true);

link 到 code.

任何帮助将不胜感激。

[EDITED] 适用于单个功能但不适用于功能集合

.flatten()只做一件事:将特征collection的特征collections转换为特征collection的特征collection那些 collections。在您的情况下,您有一个特征 collection(reduceRegions 的输出),其中包含普通特征,但每个特征都有一个 属性,这是一个字典。

为了将其转换为多个特征(导出的行 table),您需要先 map 在 collection 上将字典转换为 collection 的特征,然后 然后 flatten collection.

var forestLossCollection =
  treeLoss.reduceRegions({
    'collection': roi,
    'reducer': ee.Reducer.frequencyHistogram(),
    'scale': 100,
    'crs': 'EPSG:5070'
  })
  .map(function (lossInRegionFeature) {
    // Get the histogram dictionary from the feature produced by reduceRegions.
    var forestLossDict = ee.Dictionary(lossInRegionFeature.get('histogram'));

    // Make a FeatureCollection out of the dictionary.
    return ee.FeatureCollection(
      forestLossDict
        .map(function (key, value) {
          // Construct a feature from the dictionary entry.
          return ee.Feature(null, {
            'system:index': key,
            'WDPAID': lossInRegionFeature.get('WDPAID'),
            'year': key,
            'loss': value});
        })
        // dict.map() returns a dictionary with newly computed values;
        // we just want the values in a list, to make a collection of.
        .values());
  })
  // Flatten the collection of collections returned by the map().
  .flatten();



print(forestLossCollection);

Export.table.toDrive({
  collection: forestLossCollection,
  fileNamePrefix: 'forestLoss',
  fileFormat: 'csv',
  selectors: ['WDPAID', 'year', 'loss'],
});

https://code.earthengine.google.com/2bcfd3d34fed5255e25d5a553558de36