R包光栅和sp中的函数是否保留单元格编号顺序?

R包光栅和sp中的函数是否保留单元格编号顺序?,r,raster,sp,R,Raster,Sp,我正在使用R包光栅和sp中的函数计算各种大小圆圈中所有像素的汇总统计信息。为了节省使用多个光栅时的时间,我使用xyFromCell()和spDistsN1()函数预先计算了光栅中每个点到中心点的距离。该函数返回一个向量,其长度等于光栅中的单元数。此外,我还使用as.data.frame()函数将光栅转换为行数等于光栅中单元格数的数据帧。然后,我可以通过查找距离小于或等于圆圈大小的所有行来索引数据帧,并计算汇总统计数据。我只是想检查这两个函数是否都保持单元格编号顺序。请参见下面的示例代码。这似乎是

我正在使用R包
光栅
sp
中的函数计算各种大小圆圈中所有像素的汇总统计信息。为了节省使用多个光栅时的时间,我使用
xyFromCell()
spDistsN1()
函数预先计算了光栅中每个点到中心点的距离。该函数返回一个向量,其长度等于光栅中的单元数。此外,我还使用
as.data.frame()
函数将光栅转换为行数等于光栅中单元格数的数据帧。然后,我可以通过查找距离小于或等于圆圈大小的所有行来索引数据帧,并计算汇总统计数据。我只是想检查这两个函数是否都保持单元格编号顺序。请参见下面的示例代码。这似乎是工作,但我想有人确认这一点

library(raster)

# Make fake raster
foo <- matrix(1:100, nrow=10)

rfoo <- raster(foo)

# Get coordinates of each cell
cfoo <- xyFromCell(rfoo, 1:ncell(rfoo))

# Distances from center point to the coordinate of each cell
distfoo <- spDistsN1(cfoo, c(0.5, 0.5))

# Radius of circle to extract
r <- 0.25

# Coerce raster to data frame
dffoo <- as.data.frame(rfoo)

# If correct, these values should be the cell values for all cells within 0.25 of the center point
dffoo[distfoo <= r, 1]
库(光栅)
#伪造光栅

foo我相信您的代码运行良好。我重复了你的工作,但使用了不同的软件包,
sf
,来进行相同的分析。我们得到了同样的结果

library(raster)
library(sf)
    
# Make fake raster
foo <- matrix(1:100, nrow=10)
rfoo <- raster(foo)
# Convert raster to a matrix with point information
rfoo_m <- rasterToPoints(rfoo)
# Convert to a data frame
rfoo_df <- as.data.frame(rfoo_m)
# Convert to sp object
rfoo_sf <- st_as_sf(rfoo_df, coords = c("x", "y"))
# Create a sp object as one point with coordinate 0.5, 0.5
target_sf <- st_point(c(0.5, 0.5))
# Calculate the distance, store the reuslt as a new column in rfoo_df
rfoo_df$dist <- st_distance(rfoo_sf, target_sf)
# Filter rfoo_df with dist <- 0.25
rfoo_df[rfoo_df$dist <= 0.25, "layer"]
[1] 34 44 54 64 35 45 55 65 36 46 56 66 37 47 57 67

似乎
spDistsN1
要快得多。

谢谢!如果我在大型光栅(约500 mb)上运行此代码,您是否知道该代码的性能(ram使用率和速度)将如何与sp代码进行比较?请查看我的更新
spDistsN1
可能更快。然而,我只比较了这个特殊情况下距离计算的一部分。它不包括将光栅转换为其他数据类型的代码。如果光栅的大小变大,会发生什么也不清楚。
library(microbenchmark)

microbenchmark(
  m1 = {dist_col <- st_distance(rfoo_sf, target_sf)},
  m2 = {distfoo <- spDistsN1(cfoo, c(0.5, 0.5))}
  )
Unit: microseconds
 expr     min      lq       mean   median      uq      max neval
   m1 933.356 941.695 1011.94994 948.4305 982.429 1903.275   100
   m2  13.471  16.679   24.40241  25.6590  28.867   69.922   100