R包raster中的函数和sp保存单元格数量顺序?

时间:2017-08-24 17:29:49

标签: r raster sp

我正在使用R包rastersp中的函数来计算各种大小的圆圈中所有像素的摘要统计信息。为了节省使用多个栅格的时间,我使用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]

1 个答案:

答案 0 :(得分:1)

我相信您的代码运作良好。我重复了您的工作,但使用了不同的软件包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

基准

在这里,我比较了我的帖子中OP spDistsN1方法和st_distance方法之间的效果。

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

似乎spDistsN1要快得多。