Невозможно извлечь элементы списка как целые, используя `getInfo` - PullRequest
0 голосов
/ 12 февраля 2019

Я использую reduceRegion для суммирования количества пикселей воды, определенных NDWI.Я хочу сделать это на коллекции изображений, чтобы увидеть изменения в акватории за определенный период времени.

Значения возвращаются из reduceRegion в консоли и выглядят как целые числа, но я не могу извлечь их как таковые.Это кажется распространенной проблемой, но решение обычно использует функцию getInfo для передачи этих значений на сторону клиента.К сожалению, getInfo возвращает ноль в этом случае.

Код ниже предназначен для коллекции изображений ИЛИ одного изображения.Одиночное изображение (image1) возвращает изображение с дополнительным свойством (waterArea), и отображенный алгоритм разрывается (потому что функция возвращает нули).

Я также пытался использовать getInfo на waterAg, чтобы потенциально перенести этот список на сторону клиента, однако он возвращает те же List объектов, которые мне не нужны.

var image1 = ee.Image(leastcloud.first()).select(['B11','B8','B3'])

var stackarea = function(image){

  var watermask = ee.Image(0)

  var MNDWI = image.normalizedDifference(['B3','B11'])
  watermask = watermask.where(MNDWI.gt(.31),1);


             //sum of water pixels in an area
  var sum = ee.Number(watermask.reduceRegion({
  reducer: ee.Reducer.sum(),
  geometry: geometry,
  scale: 20,
  maxPixels: 1e9
  }));

  var clientSide = sum.getInfo()
  var setArea = image.set('waterArea', clientSide)
  return setArea

};

var single = stackarea(image1)
print(single)

var watermapped = filterSpot.map(stackarea)
var waterAg = watermapped.aggregate_array('waterArea')
print(waterAg)

Я действительно не уверен, как извлечь эти значения в виде чисел ...

Я надеюсь получить список чисел, чтобы я мог объединить этот массив с другимимассивы (дата изображения,% пикселей в облаке и т. д.)

1 Ответ

0 голосов
/ 16 февраля 2019

reduceRegion возвращает объект словаря, а не числовой объект.Следовательно, в вашей функции stackarea переменная clientSide является словарем (т. Е. Объектом), а не числом.

Номер, который вы ищете, сохраняется в словаре, возвращаемом reduceRegionфункция.Вы можете получить этот номер, используя функцию get для этого объекта словаря:

  var sum = watermask.reduceRegion({
  reducer: ee.Reducer.sum(),
  geometry: geometry,
  scale: 20,
  maxPixels: 1e9
  }).get('nd');

Таким образом, sum будет номером на стороне сервера, в котором хранится значение, которое выafter (нет необходимости использовать ee.Number здесь, так как это не очень помогает).

Если вам интересно, почему вы используете get('nd'), а не get('somethingelse'), то это название группы в вашемwatermask image, и это имя является именем группы по умолчанию, которое дается в результате выполнения функции normalizedDifference.

И, на мой взгляд, вам даже не нужно использовать функцию getInfo, которая принимаетгораздо больше времени для выполнения.Просто удалите строку var clientSide = sum.getInfo() и измените следующую строку на var setArea = image.set('waterArea', sum).

Надеюсь, эта помощь.

...