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;
记住 存储的路径
这样就编写了一个函数集,包括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))
自定义信息函数
我还定义了一些函数,方便获取影像的分辨率、投影信息等等。
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()))
此外,还可以自定义其他的函数,如影像下载函数等等。
自定义导出函数
我们知道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多平台发布