GEE编写自己的函数库

ArcGIS aggregate升尺度方法

GEE中有些常用的操作,没有直接的函数。

我们都知道打印ImageCollection中的第一个影像是.first(),但打印最后一张影像呢?

常见的操作是用.toList(imagecollection.size())转List,再用list.get(-1)获取倒数第一个,这样写就很麻烦。

写代码最忌讳重复造轮子,如果能写成函数,反复调用就好了,这里我们用自定义函数require和exports尝试写成函数。

自定义打印函数

https://code.earthengine.google.com/1a932adc9bcb0a0ab63474b46350cdec

这里新建一个code,输入以下代码

var pkgs = {};

pkgs.Last = function(imagecollection){
  var imglist = imagecollection.toList(imagecollection.size())
  var last = imglist.get(-1)
  return ee.Image(last)
}

pkgs.Last2 = function(imagecollection){
  var imglist = imagecollection.toList(imagecollection.size())
  var last = imglist.get(-2)
  return ee.Image(last)
}

exports = pkgs;

记住 存储的路径

image-20230114132134264

这样就编写了一个函数集,包括Last和Last2函数,分别打印倒数第一张和第二张

调用只需要以下代码:

var pkg_print = require('users/wanglonghao/pkgs:pkg_print')
print(pkg_print.Last(latter_emiss))

在此基础上,还可以函数套用函数:

var pkg_print = require('users/wanglonghao/pkgs:pkg_print')
var pkg_sta = require('users/wanglonghao/pkgs:pkg_sta')
var imgcol_emiss = ee.ImageCollection("projects/pml_evapotranspiration/PML_INPUTS/MODIS/Emiss_interp_8d")


var latter_emiss = ee.ImageCollection('MODIS/061/MOD11A2')
        .filter(ee.Filter.date('2021-06-02','2022-12-31'))
        .select(['Emis_31', 'Emis_32'])
        .map(function (img) {
            return img
                .copyProperties(img, ['system:time_start', 'system:id']);
        }).map(function (img) {
            var emiss = img.select(0).expression('b() * 0.002 + 0.49'); //.toFloat(); //.toUint8()
            return img.addBands(emiss);
        }).select([0, 0], ['Emiss', 'qc']);

        
var collectEmiss = imgcol_emiss.merge(latter_emiss)

print(pkg_print.Last(latter_emiss))
exports.Emiss = collectEmiss

以上代码是我处理MODIS反照率的数据。函数中可以嵌套函数。

自定义统计函数

有时候要进行区域统计,如查看影像在某个geometry的值,这就需要reduceRegion:

var image_sta = image.reduceRegion({
    reducer: ee.Reducer.median(),
    geometry: geometry,
    scale: scale , 
    crs: 'EPSG:4326', 
});

每次都写一长串太麻烦了,不如把他封装成函数:

var pkgs = {};

pkgs.Mean = function(image, geometry, scale){
  var image_sta = image.reduceRegion({
    reducer: ee.Reducer.mean(),
    geometry: geometry,
    scale: scale , 
    crs: 'EPSG:4326', 
});
return image_sta  
}

pkgs.Median = function(image, geometry, scale){
  var image_sta = image.reduceRegion({
    reducer: ee.Reducer.median(),
    geometry: geometry,
    scale: scale , 
    crs: 'EPSG:4326', 
});
return image_sta  
}
exports = pkgs;

封装了一个Mean和Median函数,获取统计的均值和中位数:

https://code.earthengine.google.com/d91b6c3a387a4ad5aefb8e090b3731e4

调用只需要:

var pkg_sta = require('users/wanglonghao/pkgs:pkg_sta')
print(pkg_sta.Mean(latter_emiss.first(), geometry, 500))

image-20230114192231432

自定义信息函数

我还定义了一些函数,方便获取影像的分辨率、投影信息等等。

var pkgs = {};

pkgs.getResolution = function(image){
  return image.projection().nominalScale()
}

pkgs.getProj = function (img) {
    img = ee.ImageCollection(img).first();
    var prj = img.select(0).projection();
    var prj_dict = prj.getInfo();
    return {
        prj: prj,
        scale: ee.Number(prj.nominalScale()).getInfo(),
        crs: prj_dict.crs,
        crsTransform: prj_dict.transform
    };
};

exports = pkgs;

调用

var pkg_getInfo = require('users/wanglonghao/pkgs:pkg_getInfo')
print(pkg_getInfo.getResolution(imgcol_emiss.first()))
print(pkg_getInfo.getProj(imgcol_emiss.first()))

image-20230114192751196

此外,还可以自定义其他的函数,如影像下载函数等等。

自定义导出函数

我们知道GEE的export只能导出单张Image,但有时候我们要导出ImageCollection

这时可以写个函数:

var pkgs = {};
var pkg_print = require('users/wanglonghao/pkgs:pkg_print')
pkgs.exportImageCollection = function (imgCol, region, scale) {
  var indexList = imgCol.reduceColumns(ee.Reducer.toList(), ["system:time_start"])
                        .get("list");
  var firstDate = imgCol.first().get('system:time_start').getInfo()
  indexList.evaluate(function(indexs) {
    for (var i=0; i<indexs.length; i++) {
      var image = pkg_print.Get(imgCol, i)
//      var image = imgCol.filter(ee.Filter.eq("system:time_start", indexs[i])).first();
      var date = ee.Date(firstDate.advance(i, 'month')).format('YYYYMMdd').getInfo()
      Export.image.toAsset({
        image: image.clip(region.geometry()),
        description: date,
        region: region.geometry(),
        assetId: 'projects/pml_evapotranspiration/test/Yangtze/LAI/LAI' + date,
        scale: scale,
        crs: "EPSG:4326",
        maxPixels: 1e13
      });
    }
  });
}
exports = pkgs;

pkg_print.Get是我写的一个获取ImageCollection第i张影像的函数,可以参考上面

本文由mdnice多平台发布

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地学万事屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值