本文介绍在谷歌地球引擎GEE中,基于8
天的MODIS遥感影像数据,计算并下载全球每8
天NDVI数据,并将每一景数据名称按照YYYYddd
格式命名的方法。
首先,明确一下本文的需求。现在希望在GEE中,利用MOD09A1这个8
天合成产品的地表反射率产品,计算全球的逐8
日NDVI,指定其坐标系与空间分辨率后下载数据到本地;同时,下载的数据名称需要包含其年份与Day of the Year(DOY)。
本文所用代码如下。
var mod09a1 = ee.ImageCollection("MODIS/061/MOD09A1").select(["sur_refl_b01", "sur_refl_b02"])
.filterDate("2023-01-01", "2025-12-31");
var region = ee.Geometry.Polygon([[[180, 90], [-180, 90], [-180, -90], [180, -90]]], null, false);
var calculateScaledNDVI = function(image) {
var ndvi = image.normalizedDifference(["sur_refl_b02", "sur_refl_b01"])
.multiply(10000)
.round()
.clamp(-10000, 10000)
.int16()
.rename("NDVI");
return ndvi.copyProperties(image, ["system:time_start"]);
};
var batchExport = function(image) {
var date = ee.Date(image.get("system:time_start"));
var year = date.format("YYYY");
var doy = date.getRelative("day", "year").add(1).format("%03d");
Export.image.toDrive({
image: calculateScaledNDVI(image),
description: ee.String("NDVI_").cat(year).cat(doy).getInfo(),
scale: 5565.97,
region: region,
crs: 'EPSG:4326',
maxPixels: 1e13,
folder: "NDVI"
});
};
var imageList = mod09a1.toList(mod09a1.size());
for (var i = 0; i < imageList.size().getInfo(); i++) {
// print(imageList.get(i));
var image = ee.Image(imageList.get(i));
batchExport(image);
}
代码整体思路也很简单。
首先,获取MOD09A1数据产品的sur_refl_b01
(红光波段)和sur_refl_b02
(近红外波段),并定义一个多边形来覆盖全球(经度±180°,纬度±90°)。
随后,是计算NDVI的函数。在函数中,计算NDVI,并将结果放大10000
倍取整,设置数据范围(也就是NDVI从-1
到1
的范围),同时将数据设置为整型。这是为了减少文件体积,方便数据存储。
接下来,是导出数据的函数。在函数中,提取每一景数据的年份与DOY,并将数据导出至Drive;其中,在导出时设定数据的坐标系与空间分辨率等参数。
最后,就是一个循环,用以将所选定的MOD09A1数据分别加以处理并导出。
执行上述代码,即可在GEE右侧Tasks中看到导出任务,如下图所示;点击RUN
即可运行任务。
当导出任务比较多时,可以参考文章Google Earth Engine谷歌地球引擎计算遥感影像在每个8天间隔内的多年平均值(https://fkxxgis.blog.csdn.net/article/details/138588432)中提到的批量点RUN
方法来运行上述任务。
任务执行完毕后,数据会暂存在Drive中;随后手动再将数据下载到本地即可。
至此,大功告成。
欢迎关注:疯狂学习GIS