其他
快速获取MODIS NDVI月度合成数据方法!
rgee MODIS NDVI月度合成
前面已经介绍了不少rgee的基础知识,现在来一个实例。
目的
获取中国区域MOD13A2 1km分辨率月度最大值合成NDVI数据。
手段
rgee,在R语言环境中调用Google Earth Engine,实现中国区域MOD13A2 NDVI数据的月度最大值合成
实现
查找数据
使用rgee处理数据之前先从Earth Engine Data Catalog中找到所需的数据
加载包并启动GEE
这次的GEE启动和以往略有不同,这次加了一个 drive
参数,启动Google Drive服务,为的是方便调用Google Drive服务下载影像。
library(rgee)
library(sf)
ee_Initialize(drive = T) #启动GEE和Google Drive
范围裁剪
read_sf
读取研究区矢量SHPsf_as_ee
将R语言sf对象转为ee.featurecollectionee$ImageCollection
调用数据集
# Define a region of interest with sf
ee_roi <- read_sf("./SHP/ChinaSizhi.SHP") %>%
sf_as_ee()
modis_ndvi <- ee$ImageCollection("MODIS/006/MOD13A2")
下面是去除质量差的像元的代码
# Filter out poor quality pixels
getQABits <- function(image, qa) {
# Convert binary (character) to decimal (little endian)
qa <- sum(2^(which(rev(unlist(strsplit(as.character(qa), "")) == 1))-1))
# Return a mask band image, giving the qa value.
image$bitwiseAnd(qa)$lt(1)
}
# Using getQABits we construct a single-argument function 'mod13A2_clean'
mod13A2_clean <- function(img) {
# Extract the NDVI band
ndvi_values <- img$select("NDVI")
# Extract the quality band
ndvi_qa <- img$select("SummaryQA")
# Select pixels to mask
quality_mask <- getQABits(ndvi_qa, "11")
# Mask pixels with value zero.
ndvi_values$updateMask(quality_mask)
}
月度最大值合成
使用了循环,循环12个月 每次计算一年12个月的NDVI最大值 ee_as_raster
将GEE数据输出为TIFF栅格
for (i in 1:12) {
# Create a monthly composite
ndvi_composite <- modis_ndvi$
filter(ee$Filter$date('2020-01-01', '2020-12-31'))$
filter(ee$Filter$calendarRange(i, field = "month"))$
map(mod13A2_clean)$
max()
tiffnames = paste0("2020-", i)
mod_ndvi <- ee_as_raster(
image = ndvi_composite,
region = ee_roi$geometry(),
scale = 1000,
dsn = paste0('./ChinaMVCNDVI/', tiffnames),
via = "drive"
)
}
最后下载完的合成数据如下:
可以通过复制粘贴修改月度合成代码,生成多年的月度合成数据:
常见问题
最开始我使用了中国的矢量,然后发生了下面的报错:
EEException: Request payload size exceeds the limit: 10485760 bytes.
这个报错是什么情况呢?是因为使用的ROI矢量节点太多了
最开始我使用的是下图的ROI矢量,由于矢量有很多小碎片,节点众多,这样GEE在计算得时候就会出错。
后来我绘制了下面的ROI(红圈),这样就能执行GEE中的数据裁剪功能了。