从 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。
在 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)
所以我首先必须按照
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。