首页 > 解决方案 > 如何从 MODISTools 中的超时错误中恢复

问题描述

我很高兴能够使用 MODISTools 下载图像匹配的时间和空间。具体来说,MODISTools 正在查找由另一颗卫星进行的一百万个相关观测的叶面积指数。正如警告的那样,NASA 服务器会定期超时。

发生这种情况时,我希望 r 捕获错误,稍等片刻(如果甚至需要),然后再试一次。我知道等待不需要超过几秒钟,因为我正在运行多个实例,并且一次只有一个或两个超时。一旦检测到错误,处理可以通过重试相同的步骤来恢复,或者,具有基本相同的效果,通过重新启动下面粘贴的序列。有没有一种简单的方法可以做到这一点?如果它涉及从 r 调用服务器命令,请为一个无知的人写下你的答案!

这是一个示例,但如果没有超时,它不会说明太多。为简单起见,我显示了固定的位置和日期。在实际运行中,它们来自 my.chunk 数据框中的其他字段。

 look.these.up <- which(is.na(my.chunk$lai))
 for (m.obs in look.these.up) {
      junk <- mt_subset(product = "MOD15A2H", lon = 5, lat = 5,
           start = "2017-01-01", end = "2017-01-08")
      my.chunk$lai[m.obs] <- junk$data[, "data"][5] 
 }

标签: rerror-handling

解决方案


这对我有用。我抬头看了看。如何查看函数的源代码?如何查看 mt_subset 命令背后的代码并对其进行修改。

由于我需要的 MODIS 数据子集有限,因此可以进行一些简化,例如在 for 循环之外创建 all.dates 并删除大部分输入错误检查。

 for (m.obs in 1:n.obs) {
    modis.date <- all.dates[which(all.dates$calendar_date <= 
       ret.date & all.dates$calendar_date >= (ret.date - 7)), 1][1]

 ## Retrieve the MODIS values for the obs time & place
 m.response <- httr::GET(
    url = "https://modis.ornl.gov/rst/api/v1/MOD15A2H/subset", 
    query = list(latitude = my.chunk$lat[m.obs], 
       longitude = my.chunk$lon[m.obs],   
       startDate = modis.date, endDate = modis.date,
       kmAboveBelow = 0, kmLeftRight = 0),
    httr::write_memory())
    ## If connection fails, try it again up to 10 times.   
    attempts = 0
    while (httr::http_error(m.response)) {
       attempts = attempts + 1
       print(paste0("retry # ", attempts))
       if (attempts >= 10) {
          stop()
          m.response <- NULL
       } 
       Sys.sleep(1) # seconds
       m.response <- httr::GET(
          url = "https://modis.ornl.gov/rst/api/v1/MOD15A2H/subset", 
          query = list(latitude = my.chunk$lat[m.obs], 
             longitude = my.chunk$lon[m.obs],   
             startDate = modis.date, endDate = modis.date,
             kmAboveBelow = 0, kmLeftRight = 0),
          httr::write_memory())
    }   
   modis.vals <- jsonlite::fromJSON(httr::content(m.response,
      "text", encoding = "UTF-8"), 
       simplifyVector = TRUE)$subset[, "data"]  # decodes returned data
   my.chunk$fpar[m.obs] <- modis.vals[[6]] # fPar

   etc.
}

推荐阅读