将imageCollection转换为具有唯一标签值的字典

时间:2019-07-23 20:26:32

标签: javascript google-earth-engine sentinel2

我正在尝试编写一个函数,该函数将使用Sentinel 2数据从图像集合中创建字典,该数据将包含标签/值对,其中标签来自图像的MGRS_TILE属性,并且值将包含所有列表具有相同MGRS_TILE ID的图像。标签值必须是不同的。我希望输出是这样的: {'label':'tileid1', '值':[image1,image2 ...] 'label':'tileid2', '值':[image3,image4 ...]}

下面是我的代码: interestImageCollection是我过滤的imageCollection对象 tileIDS是一个ee.List类型对象,包含所有不同的图块ID 并且field是我感兴趣的图片属性的名称,在这种情况下为'MGRS_TILE'。

var build_selectZT = function(interestImageCollection, tileIDS, field){

  //this line returns a list which contains the unique tile ids thanks to the keys function
  //var field_list = ee.Dictionary(interestImageCollection.aggregate_histogram(field)).keys();

  //.map must always return something
  var a = tileIDS.map(function(tileId) {
    var partialList=ee.List([]);
    var partialImage = interestImageCollection.map(function(image){
      return ee.Algorithms.If(ee.Image(image).get(field)==tileId, image, null);
    });
    partialList.add(partialImage);
    return ee.Dictionary({'label': tileId, 'value': partialList});
  }).getInfo();
  return a;
};

不幸的是,上面的函数给了我这个结果: {'label':'tileid1', '值':[], 'label':'tileid2', 'values':[]}

1 个答案:

答案 0 :(得分:0)

我认为您可以使用过滤器功能代替if。如果您需要列表形式的内容,则可以使用toList函数将其更改为列表形式。

var build_selectZT = function(interestImageCollection, tileIDS, field){
  //.map must always return something
  var a = tileIDS.map(function(tileId) {
    var partialList=ee.List([]);
    // get subset of image collection where images have specific tileId
    var subsetCollection = interestImageCollection.filter(ee.Filter.eq(field, tileId));
    // convert the collection to list
    var partialImage = subsetCollection.toList(subsetCollection.size())
    partialList.add(partialImage);
    return ee.Dictionary({'label': tileId, 'value': partialList});
  }).getInfo();
  return a;
};

这实际上会为您提供词典列表

[{'label':'id1','value':[image1]},{'label':'id2','value':[image2,image3]......}]

如果您要像使用代码那样使用 ee.Algorithms。,那么您的错误就在“ ee.Image(image).get(field)== tileId”部分中。由于.get(field)返回服务器端对象,您不能使用==将其等同于某种东西,因为它是字符串类型,您需要使用compareTo。但是,如果字符串相同,它将返回0,并且由于0被视为false,因此当条件为false时可以返回图像。

return ee.Algorithms.If(ee.String(ee.Image(image).get(field)).compareTo(tileId), null, image);

我仍然认为这是一种不好的方法,因为您将获得一个数组,该数组中的值会充满空值,例如

[{'label':'id1','value':[image1, null, null, null, .....]},{'label':'id2','value':[null,image2,image3, null,....]......}]