为了账号安全,请及时绑定邮箱和手机立即绑定

使用谷歌地球引擎在列表中找到最接近的日期

使用谷歌地球引擎在列表中找到最接近的日期

BIG阳 2021-08-20 18:43:59
我创建了一个 Sentinel 2 图像列表。我还从 DATATAKE_IDENTIFIER 字段中提取了日期值,并将其粘贴回我列表中每个图像的 ee.Date 类型的名为“DATE”的属性。现在,我正在尝试检索按时间顺序最接近用户指定的感兴趣日期的图像。例如,如果我的日期为:5 月 5 日、5 月 10 日、5 月 15 日、5 月 20 日,用户选择 14 日-我想在 5 月 15 日回来吗?有人可以帮忙吗?这是我的代码:var startDate = ee.Date('2017-07-01');var finishDate = ee.Date('2017-07-31');//Create imageCollection with the sentinel2 data and the date filtersvar interestImageCollection = ee.ImageCollection(sentinel2_1C_ImageCollection).filterBounds(interestRectangle) //changed here your geometrical shape.filterDate(startDate, finishDate).sort('CLOUDY_PIXEL_PERCENTAGE', false);  //function which will extract the date from the 'DATATAKE_IDENTIFIER' field and add it as a new one to every imagevar add_date = function(interestImageCollection){  //iterate over the image Collection  //.map must always return something  return interestImageCollection.map(function(image){    //take the image property containing the date    var identifier = ee.String(image.get('DATATAKE_IDENTIFIER'));    //regex    var splitOn = "_|T";    //split    var splitted = identifier.split(splitOn,"");    var date = ee.String(splitted.get(1));    //DATE OPTION    var year = ee.Number.parse(date.slice(0,4));       var month = ee.Number.parse(date.slice(4,6));    var day = ee.Number.parse(date.slice(6,8));    var dateTaken = ee.Date.fromYMD(year, month, day);   return image.set('DATE',dateTaken);  });};//list conversionvar subList = interestImageCollection.toList(interestImageCollection.size());//get the image with the chronologically closest date to my date of interestvar dateOfInterest = ee.Date('2017-07-10');对于编程语言,我会使用一个循环,在每次迭代时检查我想要的日期和检索到的日期之间的差异是否低于任何以前的值并更新一些时间变量。但我认为地球引擎有一种更自动化的方式来做到这一点。我还尝试将 sort 函数与自定义比较器一起使用,但效果不佳。还有一些常规的 javascript(如最接近的)函数似乎在地球引擎中不起作用。
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

我认为有一个更短更简单的解决方案。每个图像都应该有一个名为system:time_start的属性,我们可以利用它来发挥我们的优势。由于我们知道我们的日期,我们可以向我们的图像添加一个新属性,以毫秒为单位表示到我们所需日期的距离,因为我们可以将其视为数字运算,通过 YMD 格式附带的所有日月注意事项。


ic = ic.map(function(image){

  return image.set(

    'dateDist',

    ee.Number(image.get('system:time_start')).subtract(dateOfInterest.millis()).abs()

  );

});

这个新字段“dateDist”现在可用于对图像集合进行排序。


ic = ic.sort('dateDist');

默认的排序方式是升序,所以这应该是好的。您可以通过拍摄第一张图像来获得最近的场景。需要考虑的一件事是,如果您的 ROI 矩形覆盖了足够的区域来查看多行/路径,那么可能有多个场景的日期最近。在这种情况下,检查同一日期范围内有多少场景可能是个好主意。


查看完整回答
反对 回复 2021-08-20
  • 1 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信