LonghaoWang

V1

2023/04/01阅读:78主题:橙心

GEE批量删除Asset里的ImageCollection

引言

众所周知,GEE的内存是经常容易超限的,使得在做运算的时候不得不导出中间结果到Asset里

如果你的代码涉及到JoinArray等相关函数或运算,这些函数非常占用内存,一般需要导出中间结果

将图像批量导出到Asset比较简单,只需要创建一个ImageCollection:

image-20230325185623360
image-20230325185623360

然后下载一个Open Earth Engine扩展,写循环批量导出,一键RUN ALL就可以。

image-20221214112314537
image-20221214112314537

但是后续数据删除就很麻烦了,当你点击Delete:

image-20230325185801748
image-20230325185801748

会要求你删除完ImageCollection中所有的Image才行

image-20230325185853272
image-20230325185853272

如图所示我现在有900多张Image,一个一个点击删除要点击到猴年马月。

现在我探索了两种方法,供大家使用:

GEE JS批量删除

第一种是利用Javascript写个批量删除的函数

循环删除代码

该函数通过将ImageCollection转换为List,逐个获取ID,循环调用ee.data.deleteAsset(assetId)直至删除完全

var pkgs = {};
pkgs.rmAsset = function(ImgCollection, ImageCollectionID ){
var n = ImgCollection.size().getInfo();
    var colList = ImgCollection.toList(n);
    var assetFolder = ImageCollectionID + '/';
    
    for (var i = 0; i < n; i++) {
      var img = ee.Image(colList.get(i));
      var id = img.id().getInfo()
      var assetId = assetFolder+id;
      ee.data.deleteAsset(assetId);
    }
}

exports = pkgs;

该函数已经共享了,可以通过以下语句调用:

var pkg_delete = require('users/wanglonghao/pkgs:pkg_asset');
pkg_delete.rmAsset(imageCollection, AssetID)

其中ImageCollection是你要把准备删除的Asset里的ImageCollection导入:

image-20230325191915710
image-20230325191915710

AssetID是准备删除的Asset里的ImageCollection的ID,即下图的ID直接复制成字符串

image-20230325191734098
image-20230325191734098

函数运行

最后不断弹出窗口提示你是否确认删除,加载一个按键精灵脚本就可以挂机删除了:

image-20230325191448209
image-20230325191448209

最后删除完之后就可以移除整个ImageCollection了:

image-20230325192235245
image-20230325192235245

GEE python批量删除

如果Javascript需要不断点击,而python就省却了这一步骤:

循环删除代码

首先授权GEE账号

import ee
ee.Authenticate()

粘贴code token,直到successfully

image-20230325192508553
image-20230325192508553

获取AssetID相关信息,还是直接复制上面的ImageCollection ID:

assetID='projects/pml_evapotranspiration/test/Yangtze/Albedo_raw'
!earthengine asset info {assetID}
image-20230325192542614
image-20230325192542614

获取AssetID对应目录下的全部内容,有点像Linux操作:

assetList=!earthengine ls {assetID}
print(assetList)
image-20230325192710683
image-20230325192710683

这里是输出了一个子AssetID的List,这样循环整个List删除就行了:

for i in range(len(assetList)):
    deleteFile = assetList[i]
    !earthengine rm {deleteFile}
image-20230325192848800
image-20230325192848800
  • 这样就会后台批量删除,而不用一个个点击确定

  • 由于网络问题,删除太多影像可能导致会遗漏一些

  • 如本次删除了900多张就遗漏了两张

image-20230325192946470
image-20230325192946470

再重复运行一边就可以了:

image-20230325193030109
image-20230325193030109

分类:

后端

标签:

云计算

作者介绍

LonghaoWang
V1