首页 > 解决方案 > 如何找出两个栅格层的 x/y 偏移?

问题描述

关于由于数据缺陷而不完全匹配的两个栅格层,我想知道如何找出这两个层之间的 x/y 偏移,以使用 raster::shift() 正确对齐它们

我已经尝试使用 qgis 研究 x/y 位移,但我刚刚找到了地理配准工具,提供重新定位栅格图层但不是交互式的。我正在寻找一种可能性,可以在底图上移动有缺陷的栅格并获取有关 x/y 偏移的信息。

不是在寻找一种解决方案,我必须设置特定的地理参考点来对齐两个栅格图层,因为我正在处理一个很难找到匹配点的高度动态的景观,但是可以通过以下方式对齐栅格图层数据集提供的纹理信息。

代码示例应类似于用户@dTanMan URL:https ://gis.stackexchange.com/users/77712/dtanman在此帖子中提供的解决方案 URL: https ://gis.stackexchange.com/a/201750

raster <- raster()
raster <- shift(raster, x=5, y=-15)

非常感谢,干杯,Explorer

标签: rgisrasterarcgisqgis

解决方案


也许你可以使用这样的东西

示例数据

library(raster)
a <- raster(ncol=20, nrow=20, xmn=0,xmx=20,ymn=0,ymx=20)
values(a) <- 1:400
set.seed(3)
b <- a + runif(400)

比较单元格值相似性的函数

rmse <- function(obs, prd) {
    sqrt(mean((obs-prd)^2, na.rm=TRUE))
}

来自参考栅格的值。如果栅格非常大,可能需要采样

nsamples <- 10000
s <- sampleRegular(a, nsamples, cells=TRUE)
sample_a <- s[,2]

要比较的位置

xy <- xyFromCell(a, s[,1])

细胞移位的测试范围

xrange <- -5:5 * xres(a)
yrange <- -5:5 * yres(a)

存储结果的矩阵

result <- cbind(rep(xrange, each=length(yrange)), rep(yrange, length(xrange)), NA)
colnames(result) <- c("dx", "dy", "rmse")

循环单元移位组合

i <- 1
for (dx in xrange) {
    for (dy in yrange) {
        x <- shift(b, dx, dy)
        sample_b <- extract(x, xy)
        result[i,3] <- rmse(sample_a, sample_b)
        i <- i + 1
    }
}

结果表明 dx=0 和 dy=0 在这种情况下是最好的。

r <- result[order(result[,3]), ]
head(r)
#     dx dy      rmse
#[1,]  0  0 0.5734866
#[2,]  1  0 0.5800670
#[3,] -1  0 1.5252878
#[4,]  2  0 1.5302921
#[5,] -2  0 2.5153573
#[6,]  3  0 2.5157728

测试

bb <- shift(b, dx=r[1,1], dy=r[1,2])
rmse(values(a), values(bb))
#[1] 0.5734866

推荐阅读