之前有写过一篇SG函数(点这里),但那个用起来太麻烦了,最近发现GEE编辑器页面更新了某大佬写的SG函数,于是来更新下,希望大家都能用到!
1. 先放出源代码链接(点这里)和函数文档链接(点这里)
这篇代码主要是用SG函数平滑modis数据的例子。
2. 函数用法
2.1 引用库
第一步你需要在代码开头写下以下内容来引用大佬的库
var oeel=require('users/OEEL/lib:loadAll');
2.2 使用函数
函数用法:
var smooth_result = oeel.ImageCollection.SavatskyGolayFilter(collection, filter, distanceFunction, degree, bandOfInterest)
详细解释一下各参数:
@ collection:你准备平滑的影像数据集
@ filter:滑动窗口大小
@ distanceFunction:距离函数(这里我直译哈)
@ degree:拟合多项式的次数
@ bandOfInterest:你准备平滑的影像数据波段
下面通过详细案例来具体解释一下重点几个参数咋用:
以下案例摘录于官方示例(对modis影像集进行平滑)
modis=oeel.ImageCollection.SavatskyGolayFilter(modis,
ee.Filter.maxDifference(1000*3600*24*15, 'system:time_start', null, 'system:time_start'),
function(infromedImage,estimationImage){
return ee.Image.constant(ee.Number(infromedImage.get('system:time_start'))
.subtract(ee.Number(estimationImage.get('system:time_start'))));},
5,['sur_refl_b.*']);
@ filter:这里滑动窗口用的是ee.Filter.maxDifference(1000×3600×24×15, ‘system:time_start’, null, ‘system:time_start’)。意思是指在整个影像集中,选取system:time_start属性和起始影像system:time_start属性差值在1000×3600×24×15以内的影像。也就是说从起始影像算起,前后十五天为一个滑动窗口。例如在日数据集中,前后十五天加当天一共是31张影像,也就是滑动窗口大小为31。
其中,system:time_start是指依照数据的’system:time_start’时间属性来作为距离衡量标准。1000×3600×24×15是指把15天换算成毫秒(因为属性’system:time_start’的单位为毫秒)。前后两个system:time_start分别指起始影像和用来匹配影像集的属性,具体可以翻阅官方ee.Filter.maxDifference函数解释。
@ distanceFunction:这里距离函数用的是*function(infromedImage,estimationImage){
return ee.Image.constant(ee.Number(infromedImage.get(‘system:time_start’))
.subtract(ee.Number(estimationImage.get(‘system:time_start’))));}*意思是指在一个大小为N的滑动窗口内,共有N个变量X,X1赋值为1,X2赋值为X2和X1时间之差,X3赋值为X3和X2时间之差…之所以是用时间之差来确定X的值,而不是1,2,3,4,,,是考虑到图像像素可能有缺失,距离不均等
@ bandOfInterest:[‘sur_refl_b.*’] 是选取所有开头为sur_refl_b的波段用作被平滑对象
2.3 获取结果
最后返回的影像集合中每张影像除了原始的波段外,还加入了其他的波段,以d_数字_波段名来命名,d_0_B1表示B1平滑后的值,其他d_1_B1、d_2_B1则表示B1平滑函数的一次和二次导数等等。所以想显示结果就选择d_0打头的波段。此外,每张影像还加入了neighbours属性,显示了用于拟合的图像集合。