使用Google Earth Engine中图像集合中每个单独图像的波段值填充FeatureCollection

时间:2017-12-08 16:06:16

标签: json google-earth-engine

在Google地球引擎中,我已将Featurecollection加载为包含一些多边形的JSON。我想在此FeatureCollection中添加列,它为每个多边形和图像集合中包含的每个多个图像提供两个波段的平均值。

这是我到目前为止的代码。

//Polygons

var polygons = ee.FeatureCollection('ft:1_z8-9NMZnJie34pXG6l-3StxlcwSKSTJFfVbrdBA');

Map.addLayer(polygons);

//Date of interest

var start = ee.Date('2008-01-01');
var finish = ee.Date('2010-12-31');

//IMPORT Landsat IMAGEs
var Landsat = ee.ImageCollection('LANDSAT/LT05/C01/T1') //Landsat images
.filterBounds(polygons)
.filterDate(start,finish)
.select('B4','B3');

//Add ImageCollection to Map
Map.addLayer(Landsat);

//Map the function over the collection and display the result
print(Landsat);

// Empty Collection to fill
var ft = ee.FeatureCollection(ee.List([]))

var fill = function(img, ini) {
  // type cast
  var inift = ee.FeatureCollection(ini)

  // gets the values for the points in the current img
  var mean = img.reduceRegions({
    collection:polygons,
    reducer: ee.Reducer.mean(),
 });

 // Print the first feature, to illustrate the result.
print(ee.Feature(mean.first()).select(img.bandNames()));

  // writes the mean in each feature
  var ft2 = polygons.map(function(f){return f.set("mean", mean)})

  // merges the FeatureCollections
  return inift.merge(ft2)

  // gets the date of the img
  var date = img.date().format()

  // writes the date in each feature
  var ft3 = polygons.map(function(f){return f.set("date", date)})

  // merges the FeatureCollections
  return inift.merge(ft3)
}

// Iterates over the ImageCollection
var newft = ee.FeatureCollection(Landsat.iterate(fill, ft))

// Export
Export.table.toDrive(newft,
"anyDescription",
"anyFolder",
"test")

在控制台中我收到错误消息

元素(错误) 无法解码JSON。 错误:字段值'对象' {"类型":" ArgumentRef","值":null}'缺少或为空。 对象:{"类型":" ArgumentRef","值":null}。

在我生成的csv文件中,我得到一个名为mean的新列,但是这个列填充了并且没有实际值。

1 个答案:

答案 0 :(得分:1)

此处没有理由使用iterate()。您可以做的是嵌套map()。在多边形上,然后在图像上。您可以展平生成的列表列表,将其转换为单个列表,如下所示:

// compute mean band values by mapping over polygons and then over images
var results = polygons.map(function(f) {
  return images.map(function(i) {
    var mean = i.reduceRegion({
      geometry: f.geometry(),
      reducer: ee.Reducer.mean(),
    });

    return f.setMulti(mean).set({date: i.date()})
  })
})

// flatten
results = results.flatten()

脚本:https://code.earthengine.google.com/b65a731c78f78a6f9e08300dcf552dff

同样的方法也可以与reduceRegions()一起使用,映射图像然后覆盖区域。但是,您必须映射结果要素以设置日期。

如果您的功能覆盖范围更广,则可能还会添加

images.filterBounds(f)

PS:你的桌子没有共享