GEE必须会教程——研究区域分块处理

最近GEE的算力越来越没劲了,明明之前用的好好的,现在处理一个区域稍微大一点的数据,GEE就要跟我撒娇“臣妾做不到呜呜呜呜~”,昨天想做个澳洲的火灾风险评估实验,因为研究区域过大,点个“run”就报个错“Image (Error):User memory limit exceeded”,您的内存已告急!

怎么解决这个问题?用户内存限制。网上查阅了很多资料,大部分的前辈用的都是“块状分割”思想。虽然写的好的文章很多,但今天,小编也跟个风, 就当是记录一下问题的解决方法吧!

1 问题溯源

GEE平台给每个账户分配了一定算力,而“User memory limit exceeded”,意为“超出用户内存限制”。这个错误是根据您代码中设置的内存限制来判断的,而不是GEE系统分配的默认内存限制。当我们的研究区域过大,计算机算起来需要较高的算力,或者是我们采用的数据集空间分辨率较高,因此代码请求大量的内存(超出用户内存限制)时,就会导致这个错误。默认情况下,GEE用户内存限制为64MB

块状分割思想是将研究区域按照规则方块或者是研究区域的下级行政边界,将原区域化大为小,针对每个小区域采用相同的计算过程的方法,这样可以大大降低GEE对一整块区域计算的消耗。当然,分块计算最后在下载影像的时候,又需要进行合并,其实也是比较麻烦的,这个问题怎么解决?下期告诉你!不过如果不想分块,家里又有矿,建议提升账户级别,花点money!

2 分块代码

代码参考了养乐多、此星光明等诸多前辈的智慧,在此表示感谢!!

Ⅰ导入研究区域

//导入矢量数据
var Province = ee.FeatureCollection("users/hesuixinya511/Province");
var Shandong = Province.filterMetadata("NAME","equals","山东");
Map.centerObject(Shandong,6);
Map.addLayer(Shandong,{"color":"black"},"shandong");
var roi = Shandong.geometry();

此处我们以山东省为例进行实验。

Ⅱ 分块处理

//方法一
var bounds = roi.bounds();// 返回geometry的边界矩形
print(bounds);
var coords = ee.List(bounds.coordinates().get(0));
var xmin = ee.List(coords.get(0)).get(0);
var ymin = ee.List(coords.get(0)).get(1);
var xmax = ee.List(coords.get(2)).get(0);
var ymax = ee.List(coords.get(2)).get(1);
print('xmax',xmax);
print('coords',coords);
var point_min = ee.Geometry.Point([xmin,ymin]);
var point_max = ee.Geometry.Point([xmax,ymax]);
Map.addLayer(point_min,{color:'red'},'point_min');
Map.addLayer(point_max,{color:'red'},'point_max');
var dx = (ee.Number(xmax).subtract(xmin)).divide(5); 
var dy = (ee.Number(ymax).subtract(ymin)).divide(5);
var grid = generateGrid(xmin, ymin, xmax, ymax, dx, dy);    //设置参数,生成格网
var grid = grid.filterBounds(roi);
print(grid.size()); //查看生成所有格网数量
print('grid',grid);
Map.addLayer(grid, {color:'orange'}, 'grid');
print(grid.first());// 获取第一个格网,若需获取多个格网,可将其转为list进行处理
Map.addLayer(grid.first().geometry());
//生成格网
function generateGrid(xmin, ymin, xmax, ymax, dx, dy) {
  var xx = ee.List.sequence(ee.Number(xmin), ee.Number(xmax).subtract(0.0001), dx);
  var yy = ee.List.sequence(ee.Number(ymin), ee.Number(ymax).subtract(0.0001), dy);
  var cells = xx.map(function(x) {
    return yy.map(function(y) {
      var x1 = ee.Number(x);
      var x2 = ee.Number(x).add(ee.Number(dx));
      var y1 = ee.Number(y);
      var y2 = ee.Number(y).add(ee.Number(dy));
      var coords = ee.List([x1, y1, x2, y2]);
      var rect = ee.Algorithms.GeometryConstructors.Rectangle(coords);//生成矩形
      return ee.Feature(rect);
    });
  }).flatten();   //变成单个数组
  return ee.FeatureCollection(cells);
}

经过上述代码处理得到如下的分块结果,此外,我们用first()函数获取了第一块分块区域 

如果小编想要获取分块区域中的任意一块,应该如何操作呢?这个问题留给大家思考,小编在后面会揭晓答案。

今天的分享到这里就结束了,希望对大家学习有帮助,更多内容欢迎同步关注小编的公众号“梧桐GIS”,谢谢大家啦 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值