我目前正在尝试根据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文件,所以我对此并不过分自信,任何有关如何做到这一点的建议都将不胜感激!
答案 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;
}
};
两个点中只有一个在有效像素上:
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...
答案 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中的简单算术平均值将不会这样做,因此将是错误的)。