从GRIB文件获取特定位置的数据

从GRIB文件获取特定位置的数据,r,gis,grib,cdo-climate,R,Gis,Grib,Cdo Climate,我想使用R从ECMWF提供的GRIB文件中提取特定位置的数据 目前,我可以获取数据并将其导出到.csv,但位置似乎不正确。 我正试着在爱尔兰南部(纬度/长约50/-8度)买到它 当我在ArcGIS中读取GRIB文件时,从R中提取的数据与在GIS中看到的数据不匹配,因此我假设我对坐标做了错误的处理 library(raster) library(tidyverse) library(lubridate) s.area <- extent

我想使用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")
库(光栅)
图书馆(tidyverse)
图书馆(lubridate)

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

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

cdo remapnn,lon=X/lat=Y input.grb point.grb
如果希望以netcdf格式输出,可以使用-f格式选项将答案通过管道传输到copy命令中:

cdo -f nc copy -remapnn,lon=X/lat=Y input.grb point.nc

范围是Ireland南部的坐标(lat/long),非常鼓励使用CDO。它有一行内置函数来处理像这样的各种任务。包括选择一个区域框并在不同尺寸上取平均值。查看手册:我同意,这就是为什么我现在设置了cdo气候标志来处理与网格化grib或netcdf文件操作相关的问题。