R terra计算面积惯性矩或如何从补丁质心获得(加权)栅格单元距离
R terra calculate area moment of inertia OR how to get (weighted) raster-cell distance from patch-centroid
我正在尝试使用栅格图层计算类似于惯性矩的度量,我正在努力弄清楚如何获得每个像元到补丁质心的距离,然后提取该距离和单元格的值。
我想计算惯性矩(获取每个单元格与其补丁质心的平方距离,乘以单元格的值,将这些值按补丁求和,然后除以每个补丁的所有值的总和) .我在下面提供了一个简化的设置。该代码创建一个简单的栅格图层,修补像元簇,并获取它们的质心。我知道下一个要使用的函数可能是 terra::distance(可能与 terra::zonal 结合使用?!)——我如何计算距离 by patch ?
#lonlat
library(terra)
r <- rast(ncols=36, nrows=18, crs="+proj=longlat +datum=WGS84")
r[498:500] <- 1
r[3:6] <- 1
r[111:116] <- 8
r[388:342] <- 1
r[345:349] <- 3
r_patched <- patches(r, directions = 8, allowGaps = F)
testvector <- terra::as.polygons(r_patched, trunc=T, dissolve = T)
p_centr <- geom(centroids(testvector), df=T)
##next steps
#1. get distance of each cell from patch's centroid
#r <- distance(r)
#2. multiply cell value by squared distance to centroid
我认为你需要遍历这些补丁。像这样:
p_centr <- centroids(testvector)
v <- rep(NA, length(p_centr))
for (i in 1:length(p_centr)) {
x <- ifel(r_patched == p_centr$patches[i], i, NA)
x <- trim(x)
d <- distance(x, p_centr[i,])
d <- mask(d, x)
# square distance and multiply with cell values
d <- d^2 * crop(r, d)
v[i] <- global(d, "sum", na.rm=TRUE)[[1]]
}
v / sum(v)
#[1] 1.213209e-05 1.324495e-02 9.864759e-01 2.669833e-04
我正在尝试使用栅格图层计算类似于惯性矩的度量,我正在努力弄清楚如何获得每个像元到补丁质心的距离,然后提取该距离和单元格的值。
我想计算惯性矩(获取每个单元格与其补丁质心的平方距离,乘以单元格的值,将这些值按补丁求和,然后除以每个补丁的所有值的总和) .我在下面提供了一个简化的设置。该代码创建一个简单的栅格图层,修补像元簇,并获取它们的质心。我知道下一个要使用的函数可能是 terra::distance(可能与 terra::zonal 结合使用?!)——我如何计算距离 by patch ?
#lonlat
library(terra)
r <- rast(ncols=36, nrows=18, crs="+proj=longlat +datum=WGS84")
r[498:500] <- 1
r[3:6] <- 1
r[111:116] <- 8
r[388:342] <- 1
r[345:349] <- 3
r_patched <- patches(r, directions = 8, allowGaps = F)
testvector <- terra::as.polygons(r_patched, trunc=T, dissolve = T)
p_centr <- geom(centroids(testvector), df=T)
##next steps
#1. get distance of each cell from patch's centroid
#r <- distance(r)
#2. multiply cell value by squared distance to centroid
我认为你需要遍历这些补丁。像这样:
p_centr <- centroids(testvector)
v <- rep(NA, length(p_centr))
for (i in 1:length(p_centr)) {
x <- ifel(r_patched == p_centr$patches[i], i, NA)
x <- trim(x)
d <- distance(x, p_centr[i,])
d <- mask(d, x)
# square distance and multiply with cell values
d <- d^2 * crop(r, d)
v[i] <- global(d, "sum", na.rm=TRUE)[[1]]
}
v / sum(v)
#[1] 1.213209e-05 1.324495e-02 9.864759e-01 2.669833e-04