Получение ключа с наибольшим значением из результата aggregate_histogram в Google Earth Engine - PullRequest
0 голосов
/ 26 марта 2020

В Google Earth Engine я получаю объект obj от вызова aggregate_histogram, а print(obj) показывает следующее:

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

Я бы хотел Извлеките ключ, для которого значение является наибольшим, поэтому «42,0» (что должно понравиться большинству всех как правильный ответ на любой большой вопрос).

Как я могу продолжить?

Я знаю, как сделать это в чистом виде JavaScript, но здесь это не похоже на то, как это работает:

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

РЕДАКТИРОВАТЬ: добавление дополнительной информации после первого ответа Ко sh.

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))

Это дает следующее:

снимок экрана

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Похоже, это связано с переменными на стороне клиента и на стороне сервера.

Таким образом, требуются этапы обработки на стороне обслуживания.

Вот кое-что, что, кажется, работает:

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() не рекомендуется в документации . ?

0 голосов
/ 26 марта 2020

Использование 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)
...