重新计算网格:将中心单元格与其周围8个单元格进行比较并写出值

问题描述 投票:0回答:1

我有一个包含三列的空间数据框,纬度、经度和 X。X 有一组从 1 到 25 的值,我想将其与其直接周围的网格进行比较。

lat、lon 列以小数形式填充坐标,如:

24 24 ,
24 24.1 ,
24 24.2 ,

第三列是X的值。

我想将 24,24 处的 X 与 23.9,24.1 和 23.9,24 以及 23.9,23.9 等处的 X 的值进行比较(所有 8 个网格都围绕一个网格)

对于 X 值较大的所有网格,希望开始构建从 1 到 8 的索引。(因此,如果 x 大于相邻网格 1,如果大于另一个相邻网格 2,等等)较小我想跳到下一个网格,直到所有 8 个网格都与中心网格进行检查。

我想循环它来检查包含约 300,000 个网格的景观。

我无法弄清楚 R 中的代码,如果你们中的任何人尝试过类似的事情,或者愿意尝试一下,我将非常感谢您的帮助!

我写了一个嵌入 if 条件的 for 循环:

lat <- seq(38, 39.5, by = 0.1)

lon <- seq(30, 40, by = 0.1)

#create empty df
Per_yr_beta <- data.frame(matrix(ncol = 4, nrow = 22779))

#provide column names
colnames(Per_yr_beta) <- c('Lon', 'Lat', 'Total', 'Beta')


for (i in lat) {
   for (j in lon) {
  
  ymax1 = (i+0.1)
  ymin1 = (i-0.1)
  xmax1 = (j+0.1)
  xmin1 = (j-0.1)

  sq_grid <- Per_yr_dummy %>% 
      filter (Lat <= ymax1 & Lat >= ymin1) %>% filter (Lon <= xmax1 & Lon >= xmin1);
    
    x=0;

    if(sq_grid$Total[5] > sq_grid$Total[1]){x=x+1}
    if(sq_grid$Total[5] > sq_grid$Total[2]){x=x+1} 
    if(sq_grid$Total[5] > sq_grid$Total[3]){x=x+1} 
    if(sq_grid$Total[5] > sq_grid$Total[4]){x=x+1}
    if(sq_grid$Total[5] > sq_grid$Total[6]){x=x+1}
    if(sq_grid$Total[5] > sq_grid$Total[7]){x=x+1}
    if(sq_grid$Total[5] > sq_grid$Total[8]){x=x+1}
    if(sq_grid$Total[5] > sq_grid$Total[9]){x=x+1}

    
    sq_grid$Beta[5] <- x           
    sq_grid_v <- as.data.frame(sq_grid[5, 1:4])
 
    z=1;
    Per_yr_beta[z,] <- sq_grid_v
    z=z+1
}}

我被困住了。循环运行第一行,但随后什么也没有......

r geospatial analysis
1个回答
0
投票

如果我理解正确,您希望每个新单元格携带具有较低值的相邻单元格的计数,如下所示:

您可以通过将数据帧转换为栅格并应用移动窗口来实现此目的。

让我们采用一个易于复制的 4 x 4 网格(16 个单元格),指定为数据框

d
:


    d <- data.frame(expand.grid(lon = 1:4, lat = 1:4),
                    X = as.integer(1:16)
                    )
    
    ## > head(d)
    ##   lon lat X
    ## 1   1   1 1
    ## 2   2   1 2
    ## 3   3   1 3
    ## 4   4   1 4
    ## 5   1   2 5
    ## ... 11 more rows

使其成为空间栅格:


    library(terra)
    
    r <- rast(d)
    
    plot(r)
    text(r, labels = values(r))

使用边长为

w = 3
(3 x 3 个单元)的移动窗口,其中包含中心单元及其相邻单元(邻居):

    w_vals = focalValues(r, w = 3,
                         fill = Inf ## (1)
                         )

(1) 使用

Inf
inite vor 网格外的虚拟邻居,因此它们不会对具有较低值的单元格计数做出贡献

...这会产生一个 16 x 9 矩阵,其中每一行对应于初始栅格的一个像元,包含 9 个值(中心像元和邻居),即第 5 列中的焦点中央像元:


    ## > w_vals
    ##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
    ##  [1,]  Inf  Inf  Inf  Inf   13   14  Inf    9   10
    ##  [2,]  Inf  Inf  Inf   13   14   15    9   10   11
    ##  [3,]  Inf  Inf  Inf   14   15   16   10   11   12

现在,按行计算小于焦点单元格(第 5 列)的值的总和。这些是重新计算所得栅格的值:

new_vals <- apply(w_vals, 1, \(the_row) sum(the_row[5] > the_row[-5]))

创建新栅格并检查:


    r_new <- setValues(r, new_vals)
    
    plot(r_new)
    text(r_new, labels = values(r_new))

© www.soinside.com 2019 - 2024. All rights reserved.