GEE学习记录(四)基于NPP和GPP数据集产生NPP8天、月度数据

5 篇文章 10 订阅

GEE官网提供的GPP数据集有8天的,但是NPP都是以年为单位的,挺不友好的。此链接是对数据集的介绍(链接)。
想要产生NPP8天、月度的数据集,需要利用NPP年度数据和GPP八天数据进行计算,代码如下。参考链接
首先导入八天的GPP数据和年度的NPP数据:

GPP
MYD17A2H.006: Aqua Gross Primary Productivity 8-Day Global 500M 500m
NPP
MOD17A3HGF.006: Terra Net Primary Production Gap-Filled Yearly Global 500m

然后进行计算:

var startdate = ee.Date.fromYMD(2021,1,1);
var enddate = ee.Date.fromYMD(2021,12,31);
var nppCollection = npp.filterDate(startdate, enddate)
                       .filterBounds(region)
                       .select("Npp");
var gppCollection = gpp.filterDate(startdate, enddate)
                       .filterBounds(region)
                       .select("Gpp");
//print(nppCollection);
//print(gppCollection);
var myNpp = function(myimg){
     var d = ee.Date(myimg.get('system:time_start'));
     var y = d.get('year').toInt();
     var GPPy = ee.Image(gppCollection.filter(ee.Filter.calendarRange(y, y, 'year')).sum());
     var NPPy = ee.Image(nppCollection.filter(ee.Filter.calendarRange(y, y, 'year')).mean());
     var npp8 = myimg.expression('(GGP8 / GPPy) * NPPy', 
    {
        GGP8: myimg,
        GPPy: GPPy,
        NPPy: NPPy
    });
  
  return npp8.copyProperties(myimg,['system:time_start']);
};

var npp8Collection = ee.ImageCollection(gppCollection.map(myNpp));
print(npp8Collection);

这样产生的就说八天的NPP数据集(未进行比例变换)。
查看官网对两个数据集的介绍,变换的比例都是0.0001。
在这里插入图片描述
在这里插入图片描述
故进行比例变换:

function scale(image){ 
  return image.multiply(0.0001).set(image.toDictionary(image.propertyNames()));
}
 
var npp8=npp8Collection.map(scale);
print(npp8);

产生的npp8就是最终的八天数据集。在此基础上,因为老师要求我产生月度的NPP数据集,所以进行了月度合成。

var years = ee.List.sequence(2021, 2021);
var months = ee.List.sequence(1, 12);
var meanNpp =  ee.ImageCollection.fromImages(
  years.map(function (y) {
    return months.map(function(m) {
    return npp8.filter(ee.Filter.calendarRange(y,y, 'year')).filter(ee.Filter.calendarRange(m, m, 'month')).mean().set('year', y).set('month', m).set('system:time_start', ee.Date.fromYMD(y, m, 1).millis());
    });
  }).flatten()
);
print(meanNpp);
Map.addLayer(meanNpp.mean().clip(region),npp_viz,"npp");

和其他博主的一般合成代码不一样的一个地方就是加了millis(),不加的时候在后面导出会产生问题(真的研究了好久问题解决链接)。

ee.Date.fromYMD(y, m, 1).millis());

这样经过处理之后一年应该有46景的八天数据,12景的月度数据。
在这里插入图片描述
之后进行导出(导出以为很简单,结果一直出错,要么全黑,要么不是覆盖整个研究区),要想成功导出必须俩条件(虽然我也不知道为什么,反正成功导出,数据在Arcgis中查看也没有问题):
1、加上之前说的.millis()
2、对月度数据集进行裁剪(很离谱啊)
少一个就出问题,服了。
导出代码如下参考链接:这个是一个大牛写的批下载ImageCollection的方法,拿来直接用就行。

var batch = require('users/fitoprincipe/geetools:batch');
//这个就是裁剪,不进行这个导出就出错
//我想的是导出的时候反正有个region
//导出的时候裁剪不就行了吗,结果是NO
var clipped = meanNpp.map(function (image) {
  return image.clip(region);
});

// Download images for a set region
batch.Download.ImageCollection.toDrive(
                clipped,//图像
                'Gangcha', //文件夹
                {region: region,//研究区范围
                crs: 'EPSG:4326',//坐标系
                scale: 500,//分辨率
                maxPixels: 1e13,
                 type: 'float'});

在这里插入图片描述
运行之后有十二个run,为了一键运行,可参考链接
导出之后在ENVI中查看:对于1、2、11、12月份大面积都是0,我查看了GPP数据集,是本身就是0,并不是后续计算的问题。
八月份图像:
在这里插入图片描述

至此整个流程完成。全文链接。有不足的地方请及时指出,大家一起学习进步。

  • 17
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值