GEE学习笔记2:个人常用工具存档

存档一些在项目中常用的代码。

如何调用?

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()
  );
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rur1

爱你么么

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

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

打赏作者

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

抵扣说明:

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

余额充值