从 aggregate_histogram 中获取具有最大值的键导致 Google Earth Engine

Getting the key with largest value from aggregate_histogram result in Google Earth Engine

在 Google Earth Engine 中,我从 aggregate_histogram 调用中获取对象 obj,并且 print(obj) 显示以下内容:

{
  "115.0": 1,
  "137.0": 1,
  "35.0": 137,
  "42.0": 164
}

我想提取值最大的键,所以“42.0”(对于任何大问题,这应该会让大多数人满意)。

我该如何进行?

我知道如何在纯 JavaScript 中做到这一点,但在这里它看起来并不奏效:

print(Object.keys(obj))    // yields "[]"

编辑:在 Kosh 的第一个回答后添加更多信息。

var obj = loc.aggregate_histogram('relativeOrbitNumber_start')

var o = {
  "115.0": 1,
  "137.0": 1,
  "35.0": 137,
  "42.0": 164
};

print(o)
print(obj)
print(Object.keys(o))
print(Object.keys(obj))

这会产生以下结果:

screenshot

使用reduce:

const o = {
  "115.0": 1,
  "137.0": 1,
  "35.0": 137,
  "42.0": 164
};

const max = Object.keys(o).reduce((m, k) => o[m] > o[k] ? m : k)

console.log(max)

看来这与客户端和服务器端变量有关。

所以需要服务端处理步骤。

下面是一些似乎有效的方法:

var o = ee.Dictionary(loc.aggregate_histogram('relativeOrbitNumber_start'))
var okeys = ee.List(o.keys())
var ovals = ee.List(o.values())

var minmax = ee.Dictionary(ovals.reduce(ee.Reducer.minMax()))
var maxval = ee.Number(minmax.get('max'))
var maxind = ovals.indexOf(maxval)
var maxkey = okeys.get(maxind)

print('maxkey:', maxkey)

不幸的是,此变量不能用作 filterMetadata 的输入:

// this yields an empty collection, where maxKey = 42.0:
var sel = loc.filterMetadata('relativeOrbitNumber_start', 'equals', maxKey)

// this yields a non-empty collection:
var sel = loc.filterMetadata('relativeOrbitNumber_start', 'equals', 42.0)

所以我首先必须按照 .

使用 getInfo 将其导入客户端
var ms = maxKey.getInfo()  // local string

var mi = parseInt(ms) // local integer

// this yields a non-empty collection:
var sel = loc.filterMetadata('relativeOrbitNumber_start', 'equals', mi)

不过这似乎是一个错误,为什么 filterMetadata 不能接受服务器端变量作为参数?特别是因为使用 getInfo()discouraged in the documentation