首页 > 解决方案 > 无法使用“getInfo”将列表元素提取为整数

问题描述

reduceRegion用来对 NDWI 确定的水像素数求和。我想在一组图像上执行此操作,以查看一段时间内水域的变化。

这些值是从reduceRegion控制台中返回的,并且似乎是整数,但我无法将它们提取出来。这似乎是一个常见问题,但解决方案通常是使用getInfo函数将这些值带到客户端。不幸的是getInfo,在这种情况下返回 null。

下面的代码用于图像集合或单个图像。单个图像(image1)返回具有额外属性(waterArea)的图像,映射算法崩溃(因为函数返回空值)。

我还尝试使用getInfoonwaterAg可能将该列表带到客户端,但是返回的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)

我真的不确定如何将这些值提取为数字......

我希望得到一个数字列表,以便我可以将该数组连接到其他数组(图像日期、云像素百分比等)

标签: google-earth-engine

解决方案


reduceRegion返回一个字典对象,而不是类似数字的对象。因此,在您的stackarea函数中,clientSide变量是字典(即对象),而不是数字。

您要查找的数字存储在reduceRegion函数返回的字典中。您可以通过get在此字典对象上使用函数来获取该数字:

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

这样,sum将是一个服务器端数字,用于存储您所追求的值(这里没有必要使用ee.Number,因为它没有多大帮助)。

如果您想知道为什么 using get('nd')but not get('somethingelse'),那么它就是watermask图像中波段的名称,并且该名称是normalizedDifference函数结果的默认波段名称。

而且在我看来,您甚至不需要使用getInfo需要更多时间来执行的功能。只需删除该行var clientSide = sum.getInfo()并将下一行修改为var setArea = image.set('waterArea', sum).

希望这有帮助。


推荐阅读