计算网格数据的纬度余弦作为权重

时间:2019-11-15 17:01:57

标签: r geospatial

我目前正在尝试使用“ RCP1pctCO2Mean”对象(这是一种栅格砖)来计算降水的“加权”空间年度全球值。这是由于相对于低纬度区域而言,朝向极点表示的区域大小不同。我需要对拥有的138年(即138层)全球降水数据中的每一个进行此操作。想法是通过使用其纬度的余弦以某种方式将权重应用于每年的每个网格单元值(这意味着在赤道的网格单元的权重为1(即0度的余弦为1),并且极点的值将为1(因为90的余弦为1)。然后,在每年对所有新得出的网格单元降水值进行平均后,可以有效地创建138个(加权)平均值),然后从1年到138年对这些值进行时间序列分析。

对象“ RCP1pctCO2Mean”如下所示:

class       : RasterStack 
dimensions  : 64, 128, 8192, 138  (nrow, ncol, ncell, nlayers)
resolution  : 2.8125, 2.789327  (x, y)
extent      : -181.4062, 178.5938, -89.25846, 89.25846  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
names       :    layer.1,    layer.2,    layer.3,    layer.4,    layer.5,    layer.6,    layer.7,        layer.8,    layer.9,   layer.10,   layer.11,   layer.12,   layer.13,   layer.14,   layer.15, ... 
min values  : 0.42964514, 0.43375653, 0.51749371, 0.50838983, 0.45366730, 0.53099146, 0.49757186,  0.45697752, 0.41382199, 0.46082401, 0.45516687, 0.51857087, 0.41005131, 0.45956529, 0.47497867, ...  
max values  :   96.30350,  104.08584,   88.92751,   97.49373,   89.57201,   90.58570,   86.67651,    88.33519,   96.94720,  101.58247,   96.07792,   93.21948,   99.59785,   94.26218,   90.62138, ... 

这是我到目前为止所做的:

newraster <- rasterToPoints(RCP1pctCO2Mean) #This creates a dataframe of the raster stack, but I am not sure if this is necessary?

然后我进行如下分配权重:

weight <- cos(newraster*(pi/180))

但是,这会在每一层的每个网格单元上产生奇怪但相同的降水值(即所有值均为0.97至0.99,这很奇怪)。我不确定我做错了什么(如果有什么不正确的话)-可能是因为不需要“ pi / 180”吗?此外,一旦完成此操作,如何还原到具有新值的栅格堆栈?

我还看到了另一个名为“ getWeights”的函数,但是我不确定这有多重要。我尝试了一下,但是在我的网格单元中收到了奇怪的相同的降水值:

weight <- getWeights(cos(newraster))

head(weight)

[1] 0.9998492 0.9998492 0.9998492 0.9998492 0.9998492 0.9998492

这种方法会适当地应用权重吗?

谢谢,对此我将不胜感激!!!!

1 个答案:

答案 0 :(得分:1)

代码中最大的错误是,一旦应用rasterToPoints,返回的对象就是矩阵,而不是新的栅格。从矩阵提取信息的方法与栅格的方法不同:

##I am calling this prec_ts, it is a matrix not a new raster
prec_ts <- rasterToPoints(RCP1pctCO2Mean)

##calculate weighting based on latitude
weight <- cos(prec_ts[,"y"]*(pi/180))

##plot weight to see that it is changing as expected, i.e. 1 at equator, near 0 at poles, cosine.
plot(prec_ts[,"y"],weight)

enter image description here

##now apply weighting to the precipitation columns
prec_ts[,3:ncol(prec_ts)] = apply(prec_ts[,3:ncol(prec_ts)], 2, function(x) x * weight)

##calculate averages
averages = colSums(prec_ts[,3:ncol(prec_ts)])/sum(weight)