查看原文
其他

R语言+QGIS处理NOAA全球气象数据(二)气象站点数据下载

走天涯徐小洋 走天涯徐小洋地理数据科学 2023-10-24

前面讲了NOAA ISD数据的站点获取,接下来下载这个数据。在rnoaa包中,使用isd函数即可下载ISD数据,要指定三个参数:

  • usaf,站点号,根据自己需要来选择
  • wban, 指定为99999就行
  • year,年份,根据自己需要来

单一站点数据选择和下载

单一站点的数据下载很简单,指定站点号usaf,wban,year三个参数即可,下载后的数据在R语言中自动转换为一个tibble数据框。如需保存这个数据,输出为rds或者csv、excel即可。

res1 <- isd(usaf='545110', wban='99999', year=1993)
下载的ISD数据

批量下载

根据前面单一站点数据下载函数情况我们可以知道,只需修改站点号和年份即可进行数据自动下载,那么可以使用两重嵌套循环,分别循环站点号和年份,即可实现数据的批量下载。

两重循环批量下载

思路有了,接下来就是实现,那么在设置双重循环之前要把这两层循环的参数准备好:

  • usaf站点号的准备,在这我说通过起始年份begin和结束年份end来筛选得到的,需要注意的是,这个筛选结果是一个tibble数据框,后面循环的写法要参考数据框的行列号标识方法。
  • year年份,这个简单,一个等差序列就完事了
  • 建立双重嵌套循环,批量下载数据,并将下载结果输出为csv文件
#筛选2000年以后,到2021年有数据的气象站
x_cn2 = x_cn %>% 
  filter(begin < 20000000 & end > 20210000) %>% 
  select(usaf) %>% 
  mutate(id = row.names(.))   #tibble数据框位置不好找,加个id方便定位

year = seq(2001, 2021, 1)  #获取年份
#双重循环下载数据
for (i in 1:nrow(x_cn2)) {
  for (j in 1:length(year)) {
    res1 <- isd(usaf=x_cn2[i,1], wban='99999', year= year[j])
    write.csv(res1, file = paste0("./csv/", x_cn2[i,1], "-", year[j], ".csv"))
  }
}

理论上上面的代码是可以很方便的把数据都下载下来的,但是实际上经常会网络中断下载失败,怎么办呢?

下载中断怎么办

由于网络不稳定等原因,数据下载可能会发生中断,如下图所示,下载到站点号527370,2020年的数据时下载失败,那么就需要对站点527370,2020、2021两年的数据重新下载。

网络故障,下载中断

前面批量下载我使用了两重循环,在这由于是对单一站点,多年份数据批量下载,针对缺失的部分,指定站点,对年份进行循环即可。

for (j in 20:length(year)) {
  res1 <- isd(usaf='527370', wban='99999', year= year[j])
  write.csv(res1, file = paste0("./csv/527370-", year[j], ".csv"))
}

上述代码循环完成后,单一站点剩余年份的数据即下载完成,可以继续修改一下双重循环参数,继续下载剩余的数据,以此类推,多次循环,完成所有所需数据的下载。

参考文献

  1. 使用rgee进行Climate Data Record NDVI月度最大值合成


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

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