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