从netcdf文件为特定坐标创建时间序列

时间:2017-08-01 17:14:03

标签: r time netcdf

我目前正在尝试根据CRU全球土地降水数据创建一系列降水数据。 我工作的文件有2011年至2015年的60个时间片。

到目前为止我的代码是:

b<-brick('/Volumes/LDRIVE2/Masters/Dissertation/Global Surface Water Explorer/UEA_rainfall/cru_ts4.00.2011.2015.pre.dat.nc/cru_ts4.00.2011.2015.pre.dat.nc')

lon<-c(26.25,27.75)
lat<-c(-16.25,-15.25)
points<-SpatialPoints(cbind(lat,lon))

points_data <- b

raster::extract(points, df = T) %>% 
  gather(date, value, -ID) %>% 
  spread(ID, value) %>%    
  mutate(date = ymd(str_sub(names(b),2))) %>% 
  as_tibble()

plot(points_data$date,points_data$`1`)

尝试运行时出现以下错误:

&#39; plot.window(...)出错:需要有限的&#39; ylim&#39;值 另外:警告信息: 1:在min(x)中:min没有非缺失参数;返回Inf 2:在max(x)中:max没有非缺失参数;返回-Inf&#39;

正如你从上面所看到的,我正在尝试为一系列坐标创建一个时间序列,如果更容易找到这些点的平均值,然后绘制一个时间序列,我也会遇到困难。这是我第一次尝试使用netCDF文件,所以我对此并不过分自信,任何有关如何做到这一点的建议都将不胜感激!

2 个答案:

答案 0 :(得分:1)

问题非常简单,第一个选定的坐标永远不会有值。在没有有效像素的区域中。让我告诉你:

 $scope.type = [{nomcarac: "phone"}, {nomcarac: "shoes"}];

  $scope.getValuesList = function(item) {
    switch (item.type){
      case 'phone': 
        item.valuelist = angular.copy($scope.phonelist);
        break;
      case 'shoes': 
        item.valuelist = angular.copy($scope.shoeslist);
        break;
      default:
        item.valuelist = [];
        break;
    }
  };

enter image description here

两个点中只有一个在有效像素上:

library(raster)
library(dplyr)
library(ndcf4)
library(tidyr)
library(lubridate)
library(stringr)
library(tibble)

b<-brick('~/Downloads/cru_ts4.00.2011.2015.pre.dat.nc')

lon<-c(26.25,27.75)
lat<-c(-16.25,-15.25)
points<-SpatialPoints(cbind(lat,lon))

plot(b[[1]], xlim=extent(points)[c(1,2)],ylim=extent(points)[c(3,4)])
plot(points, add=T)

因此,您只能绘制一列:

points_data <- b %>% raster::extract(points, df = T) %>% 
  gather(date, value, -ID) %>% 
  spread(ID, value) %>%    
  mutate(date = ymd(str_sub(names(b),2))) %>% 
  as_tibble()

points_data %>% glimpse()

## Observations: 60
## Variables: 3
## $ date <date> 2011-01-16, 2011-02-15, 2011-03-16, 2011-04-16, 2011-05-16, 2011-06-16, 2011-07-16, 2011...
## $ 1    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ 2    <dbl> 115.099998, 6.400000, 37.799999, 70.599998, 8.200000, 0.000000, 0.000000, 0.000000, 1.100...

enter image description here

答案 1 :(得分:1)

我认为从CDO的命令行执行此操作更容易,然后将生成的时间序列文件读入R中。

cdo remapnn,lon=X/lat=Y crufile.nc timeseries.nc

这会将最近的网格单元拾取到指定的坐标X / Y(nn =“最近邻居”)。这样您就不必担心在您的位置周围定义“框”并担心此框是否包含单元格或多个单元格等。

您现在可以在R。

中读取结果时间序列

ps:如果你想确定一个区域并为该区域的平均值制作时间序列,那么你想使用“sellonlatbox”和“fldmean”:

cdo fldmean -sellonlatbox,lon1,lon2,lat1,lat2 crufile.nc areamean.nc

这确保了根据纬度的函数改变单元尺寸(使用R中的简单算术平均值将不会这样做,因此将是错误的)。