我很高兴使用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]
}
答案 0 :(得分:0)
这对我有用。我抬头看了一下。How can I view the source code for a function?如何查看mt_subset命令后面的代码并进行了修改。
由于我需要的MODIS数据子集有限,因此可以进行一些简化,例如在for循环外创建all.date并删除大部分输入错误检查。
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.
}