Google Earth Engine:从列表中删除 masked/null 值

Google Earth Engine: remove masked/null value from a list

我可以使用以下方法从列表中删除空值:

print(ee.List([1,7, null, 3,5]).filter(ee.Filter.gt('item',0)))
print(ee.List([1,7, null, 3,5]).filter(ee.Filter.neq('item', null)))

但是,我的代码中出现错误 ImageCollection (Error) List.get: List is empty (index is 1).。 每天的 LST 被放入一个列表中,我正在尝试提取学习年中第二大的 LST。 我在这里做错了什么? 提前感谢您的帮助。

代码如下:

var startDate = ee.Date('2001-01-01'); // set start time for analysis
var endDate = ee.Date('2001-12-31'); // set end time for analysis

// calculate the number of year to process
var nyears = ee.Number(endDate.difference(startDate,'year'));

//init a time band
var createTimeBand= function(image) {
  return image.addBands(image.metadata('system:time_start')
  .divide(1e18))
 // .divide(1000*60*60*24*365))
}
var sst = ee.ImageCollection('MODIS/006/MOD11A1').select('LST_Day_1km')
            .filterDate(startDate, endDate)
            //.map(createTimeBand)
            
var byyearMin = ee.ImageCollection(
  // map over each month
  ee.List.sequence(0,nyears).map(function (n) {
    // calculate the offset from startDate
    var ini = startDate.advance(n,'year');
    // advance just one month
    var end = ini.advance(1,'year');

    var sortedDays = sst.filterDate(ini,end)
    .sort('LST_Day_1km').filter(ee.Filter.neq('item', null))//.filter(ee.Filter.neq('item', ""))
    .toList(sst.size())
    //print(ee.List(sst))
    //var sortedDays_clean = sortedDays.replaceAll(" ", 0)
    //var sortedDays_clean = sortedDays.filter(ee.Filter.gt('item',1))
    
    var secondLargest = ee.List(sortedDays.get(1))
    //var secondSmallest = ee.List(sortedDays.get(-1))
    var collection = ee.Image(secondLargest)
    //.addBands(secondSmallest).rename(['secondLargest', 'secondSmallest'])
    .multiply(0.02)
      .subtract(273.15)
      return collection
      .set('system:time_start', ini.millis()) //convert time to number
      .set('Date', ee.Date(ini))

}));

print(byyearMin)

更新答案:

我做了更多的研究,并且能够通过使用数组排序来提出解决方案 select 图像中每个像素的像素值排序数组中第二高的像素值。 The developer documentation for Array Sorting and Reducing can be found here. 由于这是像素级计算,因此 运行 需要大量资源,因此为了演示,我将代码限制在较小的区域。如果您计划 运行 将其用于整个世界,我强烈建议 运行 将其作为导出任务并准备好在您 运行 进入时将图像分成网格内存错误。

您可以看到该脚本在演示点处使用最大值 42.69,这是从您的原始 max 方法中找到的,在演示点处的第二大值 41.09 来自数组排序方法。完整代码可在此处找到:

https://code.earthengine.google.com/6aac0b43298bf93dc04d597733f022c2

原回复:

没有足够的声誉来评论,所以我会post它作为答案:

我不确定您为什么需要过滤列表中的空项。在您的图片集中没有 'item' 属性,因此 运行 使用此过滤器会给您一个空的图片集,这就是您看到空列表错误的原因。 运行 你的第 26 行没有过滤器的脚本工作得很好。

此外,每张图片上都没有 'LST_Day_1km' 属性,因此您的 .sort() 实际上并未像您一样按 'LST_Day_1km' 区间中的值对图片进行排序正在期待。如果您正在寻找第二大 LST,您需要将每个图像减少到一个值作为排序依据,因为 LST 在整个图像上变化(即最小 LST,平均 LST)。