查看原文
其他

快速获取MODIS NDVI月度合成数据方法!

走天涯徐小洋 走天涯徐小洋地理数据科学 2022-07-17

rgee MODIS NDVI月度合成

前面已经介绍了不少rgee的基础知识,现在来一个实例。

目的

获取中国区域MOD13A2 1km分辨率月度最大值合成NDVI数据。

手段

rgee,在R语言环境中调用Google Earth Engine,实现中国区域MOD13A2 NDVI数据的月度最大值合成

实现

查找数据

使用rgee处理数据之前先从Earth Engine Data Catalog中找到所需的数据

Earth Engine Snippet查看数据调用代码

加载包并启动GEE

  • 这次的GEE启动和以往略有不同,这次加了一个drive参数,启动Google Drive服务,为的是方便调用Google Drive服务下载影像。
library(rgee)
library(sf)

ee_Initialize(drive = T)  #启动GEE和Google Drive

范围裁剪

  • read_sf读取研究区矢量SHP
    • sf_as_ee 将R语言sf对象转为ee.featurecollection
  • ee$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"
  )
}

最后下载完的合成数据如下:

2016年6月NDVI分布

可以通过复制粘贴修改月度合成代码,生成多年的月度合成数据:

循环合成多年的NDVI月度合成影像

常见问题

最开始我使用了中国的矢量,然后发生了下面的报错:

  • EEException: Request payload size exceeds the limit: 10485760 bytes.
报错

这个报错是什么情况呢?是因为使用的ROI矢量节点太多了

最开始我使用的是下图的ROI矢量,由于矢量有很多小碎片,节点众多,这样GEE在计算得时候就会出错。

最开始使用的ROI矢量

后来我绘制了下面的ROI(红圈),这样就能执行GEE中的数据裁剪功能了。

红色部分是后来使用的ROI

参考文献

  1. rgee: An R package for interacting with Google Earth Engine
  2. 喜大普奔!rgee能用了!R语言也可以使用Google Earth Engine了!
  3. rgee学习笔记之rgee get started
  4. 【rgee学习笔记】创建MODIS NDVI时间动画
  5. rgee学习笔记之Image(一)


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存