基于GEE平台的矢量切块划分:有效防止内存溢出

引言

在使用GEE平台遥感数据集的处理时,通常会涉及到多时相多波段影像的操作,在对处理好的影像进行导出时,有可能会出现如下错误:

  • “Execution failed; out of memory.”,意思为“执行失败,内存不足”。这个错误表示您的代码已经使用了GEE系统为您分配的内存上限。这个限制一般是256MB,对于较大的数据处理操作,可能会很容易达到这个限制。
  • User memory limit exceeded”,意为“超出用户内存限制”。这个错误与第一个错误的区别在于,这个错误是根据您代码中设置的内存限制来判断的,而不是GEE系统分配的默认内存限制。当您的代码请求大量的内存(超出用户内存限制)时,就会导致这个错误。默认情况下,GEE用户内存限制为64MB。

为了解决如上问题,我们需要缩减单次处理数据的规模,增加处理的次数。我们可以选择从时相、波段、区域三个维度进行划分,最易实现的是将研究区划分为多个区块,单次处理一个小区块,处理多次。个人想到的区块划分的方式有2种:

  1. 按照次级行政区划分,如省级以下的市
  2. 手动划分多个矢量方块。

代码实现

因为我的目的是划分区域导出研究区的预处理影像,并划分训练、验证、测试区域以便后续深度学习的训练。
代码实现分为以下几个步骤:

  1. 确定划分区域的左下角和右上角的经纬度坐标(corner1、corner2)
  2. 设定横向纵向划分块数:sliceN = 10
  3. 生成区块
  4. 使用ee.Filter.isContained去除不被包含在研究区的区块
  5. 按照6:2:2比例划分区块为训练、验证、测试区块
  6. 导出区块矢量为geometryLayer并保存到Map.drawingTools()中

在这里插入图片描述

//将研究区划分为多个区域,并按照6:2:2的比例划分训练、验证、测试区域,
  //!!!仅需执行一次,手动将区域格式变化为featureColection
  var roi = ee.FeatureCollection('TIGER/2018/States').filter(ee.Filter.eq('NAME', 'Illinois'));
  // 将研究区域按照 100*100 的大小进行分割,循环处理子区域
  var corner1 = [-91.70112615545109, 36.986063288694794]
  var corner2 = [-87.30659490545109, 42.60259690092805]
  var sliceN = 10;
  var slicePolysList = ee.List([])
  for (var x = corner1[0]; x < corner2[0]; x += (corner2[0]-corner1[0])/sliceN) {
    
    
  for (var y = corner1[1]; y < corner2[1]; y += (corner2[1]-corner1[1])/sliceN) {
    
    
    var x2 = x+(corner2[0]-corner1[0])/sliceN
    var y2 = y+(corner2[1]-corner1[1])/sliceN
    var area = ee.Geometry.Rectangle(x, y, x2, y2);
    slicePolysList = slicePolysList.add(ee.Feature(area))
  }
  }
  var slicePolys = ee.FeatureCollection(slicePolysList)   // 去除不被完全包含的区域
                  .filter(ee.Filter.isContained({
    
    leftField: '.geo',rightValue: roi.geometry()}))
                  .randomColumn("random", 1)
  var trainPolys = slicePolys.filter(ee.Filter.rangeContains("random",0,0.6))
  var evalPolys = slicePolys.filter(ee.Filter.rangeContains("random",0.6,0.8))
  var testPolys = slicePolys.filter(ee.Filter.rangeContains("random",0.8,1))
  var geometryLayer = ui.Map.GeometryLayer({
    
    geometries: [trainPolys.geometry().getInfo()], name: 'trainPolys',color: 'green'});
  // 将 GeometryLayer 添加到地图
  Map.drawingTools().layers().add(geometryLayer);
  var geometryLayer = ui.Map.GeometryLayer({
    
    geometries: [evalPolys.geometry().getInfo()], name: 'evalPolys',color: 'red'});
  // 将 GeometryLayer 添加到地图
  Map.drawingTools().layers().add(geometryLayer);
  var geometryLayer = ui.Map.GeometryLayer({
    
    geometries: [testPolys.geometry().getInfo()], name: 'testPolys',color: 'blue'});
  // 将 GeometryLayer 添加到地图
  Map.drawingTools().layers().add(geometryLayer);


猜你喜欢

转载自blog.csdn.net/weixin_41099712/article/details/130246785