存档一些在项目中常用的代码。
如何调用?
var date_utils = require('users/a1401564074/Tools:Module/DateUtils.js');
var img_utils = require('users/a1401564074/Tools:Module/ImgUtils.js');
var map_utils = require('users/a1401564074/Tools:Module/MapUtils.js');
图层管理(MapUtils.js)
var License = require('users/a1401564074/Tools:Module/License.js');
exports.addAllImg2Map = function(imgCol, visParams) {
/**
* 将所有 ImageCollection 中的影像添加到地图显示
*
* @ imgCol 图像集合
* @ visParams 可视化参数
*
* **/
var size = imgCol.size().getInfo();
var imgList = imgCol.toList(size);
for (var i = 0; i < size; i++) {
var img = ee.Image(imgList.get(i));
// 优先用 year+month_range,否则 system:index,否则默认名
var year = img.get('year').getInfo();
var month_range = img.get('month_range').getInfo(); // 非必要
var index = img.get('system:index').getInfo();
var name;
if (year !== null && month_range !== null) {
name = year + '_' + month_range;
} else if (index !== null) {
name = index;
} else {
name = 'Image_' + i;
}
// 加图层
Map.addLayer(img, visParams, name);
}
};
日期处理(DateUtils.js)
var License = require('users/a1401564074/Tools:Module/License.js');
//------------------------------日期处理------------------------------
var monthStart = function (year, month) {
// 返回某年某月的起始日期(当月1号,含)
year = ee.Number(year);
month = ee.Number(month);
return ee.Date.fromYMD(year, month, 1);
}
var monthEndExclusive = function (year, month) {
// 返回某年某月的结束边界(下月1号,"end exclusive")
return monthStart(year, month).advance(1, 'month');
}
exports.monthLastDay= function (year, month) {
/**
* 返回某年某月的最后一天(含)
*
* @ 某年
* @ 某月
* **/
// monthEndExclusive输出参数month的下个月的1号 → .advance(-1, 'day')往回一天
return monthEndExclusive(year, month).advance(-1, 'day');
}
// 返回某年某月的天数(自动处理闰年)
exports.daysInMonth = function (year, month) {
var start = monthStart(year, month);
var endEx = monthEndExclusive(year, month);
return endEx.difference(start, 'day'); // ee.Number
}
//------------------------------日期处理------------------------------
范例:
var date_utils = require('users/a1401564074/Tools:Module/DateUtils.js');
print(date_utils.monthLastDay(2025,2))
print(date_utils.print(daysInMonth(2025,2)))
输出:
图像处理(ImgUtils.js)
- 已调用 DateUtils.js 文件
//按自身情况更改对应参数
//@ 账户名 : 填你自己的账号名
//@ Tools:Module : Tools 是你的repository名字,Module 是你的文件夹名字
//@ DateUtils.js : DateUtils.js 是你存放代码的名字
//调用DateUtils.js文件
var date_utils = require('users/@账户名/Tools:Module/DateUtils.js');
//------------------------------中值处理------------------------------
/*
* 想要单个季节影像 → getSeasonMedian(2020, 2, 3, S2)
* 想要某一整年 → Year_spr_win_meidian(2020, S2)
* 想要全部年份 → build_spr_win_Col(2018, 2025, S2)
*/
var getSeasonMedian = function (year, startMonth, endMonth, collection) {
/**
* 获取imgCol某一年指定月份范围的中值影像
*
* @ year : 指定年份
* @ startMonth : 起始月份
* @ endMonth : 结束月份 (含)
* @ collection : 影像数据集
* **/
year = ee.Number(year);
var start = ee.Date.fromYMD(year, startMonth, 1);
var end = ee.Date.fromYMD(year, endMonth, date_utils.daysInMonth(year,endMonth));
return collection.filterDate(start, end).median()
.set('year', year)
.set('month_range', startMonth + '月'+ '至' + endMonth + '月');
}
var Year_spr_win_meidian = function (year, collection,startmonth1,endmonth1,startmonth2,endmonth2) {
/**
* 获取imgCol某一年的两个季节的中值影像 (1-3月 & 10-12月)
*
* @ year : 指定年份
* @ collection : 影像数据集
* **/
year = ee.Number(year);
var spring = getSeasonMedian(year, startmonth1, endmonth1, collection);
var winter = getSeasonMedian(year, startmonth2, endmonth2, collection);
return ee.List([spring, winter]);
}
// 构建指定月份范围的整个年份范围的季节性合成影像集
exports.build_spr_win_Col = function (startYear, endYear, collection,startmonth1,endmonth1,startmonth2,endmonth2) {
var years = ee.List.sequence(startYear, endYear);
var seasonalMedians = years.map(function(year) {
return Year_spr_win_meidian(year, collection,startmonth1,endmonth1,startmonth2,endmonth2);
}).flatten();//展开List
return ee.ImageCollection(seasonalMedians);
}
//------------------------------中值处理------------------------------
// 将 ImageCollection 转换为服务端 ee.List(每个元素是 ee.Image)
exports.ImgCol2List = function(imgCol){
// 使用 iterate 遍历集合,把每张影像加到一个空 ee.List 里
var imgs = imgCol.iterate(function(img, list) {
// 每次迭代都把当前影像加到列表
return ee.List(list).add(img);
}, ee.List([])); // 初始值为空列表
return ee.List(imgs);
}
// 根据索引安全获取影像
exports.getImgById = function(imgCol, index) {
// 先把集合转成 ee.List
var imgList = exports.ImgCol2List(imgCol);
// 获取列表长度(服务端)
var size = imgList.size();
// 判断索引是否小于 size,如果合法就返回影像,否则返回空影像
return ee.Algorithms.If(
// 正常获取 (True)
ee.Number(index).lt(size),
ee.Image(imgList.get(index)),
// 返回空影像(False)
ee.Image()
);
};