使用Google Earth Engine中图像集合中每个图像的带区值填充FeatureCollection [英] Populate FeatureCollection with values from bands of each individual image in an image collection in Google Earth Engine

查看:340
本文介绍了使用Google Earth Engine中图像集合中每个图像的带区值填充FeatureCollection的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Google Earth Engine中,我已将Featurecollection作为JSON加载,其中包含一些多边形.我想在此FeatureCollection中添加列,该列为我提供每个多边形的两个带的平均值,以及来自Image Collection中包含的多个图像的平均值.

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

//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. 错误:对象'{"type":"ArgumentRef","value":null}'的字段'value'丢失或为空. 对象:{"type":"ArgumentRef","value":null}.

在生成的csv文件中,我得到了一个名为mean的新列,但该列中没有实际值.

解决方案

这里没有理由使用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:您的表未共享

In Google Earth Engine, I have loaded in a Featurecollection as a JSON which contains a few polygons. I would like to add columns to this FeatureCollection which gives me the mean values of two bands for each polygon and from each of the multiple images contained within the Image Collection.

Here is the code I have so far.

//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")

In the console I get an error message

Element (Error) Failed to decode JSON. Error: Field 'value' of object '{"type":"ArgumentRef","value":null}' is missing or null. Object: {"type":"ArgumentRef","value":null}.

In my csv file which is generated I get a new column called mean but this is populated with and no actual values.

解决方案

There is no reason to use iterate() here. What you can do is a nested map(). Over polygons and then over images. You can flatten the resulting list of lists to turn it into a single list like this:

// 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()

Script: https://code.earthengine.google.com/b65a731c78f78a6f9e08300dcf552dff

The same approach can be used with reduceRegions() as well, mapping over images and then over regions. However, you will have to map over the resulting features to set dates.

images.filterBounds(f) can be probably also added if your features cover a larger area.

PS: your table is not shared

这篇关于使用Google Earth Engine中图像集合中每个图像的带区值填充FeatureCollection的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆