开发者社区 问答 正文

在AI Earth想以五天为间隔对哨兵二号影像集进行筛选,是不是不能用这个map来进行迭代?

在AI Earth我想以五天为间隔对哨兵二号影像集进行筛选,然后合成为一张影像,那我是不是不能用这个map来进行迭代?但是我看gee的网页版是可以的,先生成day_of_year列表,然后对这个列表进行map

展开
收起
三分钟热度的鱼 2023-11-22 20:22:29 77 分享 版权
2 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在 GEE 中,您可以使用 Map.addLayer 函数以循环的方式添加多个图像层。例如,您可以首先计算一个日期间隔列表,然后使用 ee.List.sequence() 函数将其转换为一个数字列表,最后使用 ee.ImageCollection.iterate() 函数遍历集合中的每个图像并添加到地图中。
    这是一个示例代码片段,它将 Sentinel-2 图像集合中的每五天图像添加到地图中:

    // 创建日期间隔列表。
    var dateInterval = ee.DateRange('2021-01-01', '2022-12-31').divide(ee.Number(5).multiply(24 * 60 * 60 * 1000));
    
    // 将日期间隔列表转换为数字列表。
    var intervalList = ee.List.sequence(0, dateInterval.size().subtract(1)).map(function(i) {
      return i.multiply(dateInterval.length()).add(dateInterval.get(i));
    });
    
    // 对每个日期间隔进行迭代并添加图像到地图。
    intervalList.map(function(interval) {
      var filtered = collection.filterDate(
        interval.subtract(ee.Number(5).multiply(24 * 60 * 60 * 1000)),
        interval);
    
      Map.addLayer(filtered, {bands: ['B4', 'B3', 'B2'], max: [0.3, 0.3, 0.3]}, '5-day interval');
    });
    
    2023-11-23 14:19:08
    赞同 展开评论
  • 是的,你不能直接在GEE的Map函数中使用循环结构。这是因为Map函数会将每个元素(在这个例子中是哨兵二号的影像)传递给一个函数,然后返回一个新的集合,其中包含了函数对每个元素的返回值。然而,JavaScript的循环结构(如for或while循环)不能直接返回值,因此不能在Map函数中使用。

    然而,你可以使用GEE的List.map()函数来实现这个功能。List.map()函数会对列表中的每个元素执行一个函数,然后返回一个新的列表,其中包含了函数对每个元素的返回值。这样,你就可以在每个元素(在这个例子中是哨兵二号的影像)上应用一个函数,然后生成一个新的列表,其中包含了你对每个影像的处理结果。

    以下是一个示例代码,它以五天为间隔对哨兵二号影像集进行筛选,然后合成为一张影像:

    // 假设你已经有了一个包含哨兵二号影像的列表
    var sentinel2Images = ee.ImageCollection('COPERNICUS/S2');
    
    // 定义一个函数,用于筛选出每隔五天的影像
    function filterEveryFiveDays(image) {
      // 获取影像的日期
      var date = image.date();
    
      // 计算影像的日期是星期几
      var dayOfWeek = date.get('day_of_week');
    
      // 只选择星期一的影像
      if (dayOfWeek == 1) {
        return image;
      } else {
        return null;
      }
    }
    
    // 使用List.map()函数,对哨兵二号影像集进行筛选
    var filteredImages = sentinel2Images.toList(sentinel2Images.size())
      .map(filterEveryFiveDays);
    
    // 将筛选后的影像合成一张影像
    var compositeImage = ee.ImageCollection.fromImages(filteredImages).median();
    
    // 显示合成后的影像
    Map.addLayer(compositeImage, {min: 0, max: 10000, bands: ['B8', 'B11', 'B4']}, 'Composite Image');
    

    这段代码首先定义了一个函数,用于筛选出每隔五天的哨兵二号影像。然后,它使用List.map()函数,对哨兵二号影像集进行筛选。最后,它将筛选后的影像合成一张影像,并显示在地图上。

    2023-11-23 09:49:34
    赞同 展开评论