Преобразование imageCollection в словарь с уникальными значениями метки

Я пытаюсь написать функцию, которая будет создавать словарь из коллекции изображений, используя данные Sentinel 2, которые будут содержать пары метка / значение, где метка берется из свойства MGRS_TILE изображения, а значение будет содержать список всех изображений с тот же идентификатор MGRS_TILE. Значения меток должны быть разными. Я хочу, чтобы выходные данные были такими: {'label': 'tileid1', 'values':[ image1, image2 ...] 'label': 'tileid2', 'values':[ image3, image4 ...]}

Ниже приведен мой код: InterestImageCollection - это мой отфильтрованный объект imageCollection. TileIDS - это объект типа ee.List, содержащий все идентификаторы плиток, а поле - это имя интересующего меня свойства изображения, которое в данном случае равно "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', 'values':[], 'label': 'tileid2', 'values':[]}

1 ответ

Решение

Я думаю, что вы можете использовать функцию фильтра вместо использования, если. И если вам это нужно в форме списка, вы можете изменить его на список с помощью функции 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.If, как вы это делали в своем коде, то ваша ошибка в части "ee.Image(image).get(field)==tileId". так как.get (field) возвращает объект на стороне сервера, вы не можете использовать ==, чтобы приравнять его к чему-либо, так как это строковый тип, вам нужно вместо этого использовать compareTo. Тем не менее, он возвращает 0, если строки совпадают, и, поскольку 0 обрабатывается как ложное, вы можете вернуть изображение, когда условие ложно.

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,....]......}]
Другие вопросы по тегам