1

我想使用 R 从 ECMWF 提供的 GRIB 文件中提取特定位置的数据。

目前,我能够获取数据并将其导出到 .csv,但位置似乎错误。我正在尝试为爱尔兰南部(纬度/经度约 50/-8)购买它。

当我在 ArcGIS 中读取 GRIB 文件时,从 R 中提取的数据与在 GIS 中看到的数据不匹配,所以我认为我的坐标有问题。

library(raster)                           
library(tidyverse)
library(lubridate)

s.area <- extent(c(-10.0,-8.5,51.0,51.5))

    s.area@xmin <- s.area@xmin + 180
    s.area@xmax <- s.area@xmax + 180

    output_as_csv <- function(x, ext, var_name="wave_period", start_date, 
                              output_filename) {
      x.out <- data.frame(lon=NA, lat=NA, var_name=NA, date_time=NA)
      x.out <- x.out[FALSE,]
      for(i in 1:nlayers(x)) {
        x.temp <- x[[i]] %>% 
          crop(ext) %>% 
          rasterToPoints() %>% 
          as.data.frame() %>% 
          mutate(date_time=start_date + hours(i) - hours(1),
                 lat=x - 180,
                 lon=y) %>% 
          dplyr::select(-x, -y)
        names(x.temp)[1] <- var_name
        x.out <- rbind(x.out, x.temp)
      }
      x.out <- x.out %>% 
        unite(lon_lat, lon, lat, remove=TRUE) %>% 
        spread(lon_lat, var_name)
      write.csv(x.out, output_filename, row.names=FALSE)
    }

output_as_csv(x=s, ext=s.area, start_date=start.date, output_filename="Wave period.csv")
4

2 回答 2

2

每次处理 grib 文件时,我更喜欢使用 cdo ( 将它们转换为 netCDF cdo -f nc copy infile.grib outfile.nc)。然后您可以使用 R 中的raster包。我之前在处理 R 中的 grib 文件和光栅包时遇到问题。

于 2019-03-28T11:37:31.097 回答
1

您还可以直接从 grib 文件中提取特定位置的值,并使用 lon/lat 位置运算符重新映射 CDO 最近邻:

cdo remapnn,lon=X/lat=Y input.grb point.grb

如果您更喜欢 netcdf 格式的输出,您可以使用 -f 格式选项将答案传送到复制命令中:

cdo -f nc copy -remapnn,lon=X/lat=Y input.grb point.nc
于 2019-05-08T14:05:51.327 回答