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)。
我可以使用以下方法从列表中删除空值:
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)。