如何基于旋转角度设置R stars包的仿射变换参数
用已知旋转角度设置stars网格的仿射变换参数
要实现已知旋转角度(逆时针为正,0代表正北)来设置stars网格的仿射参数,核心是通过三角函数将角度转换为斜切(shear)参数,对应stars中affine的两个值。
核心原理
stars的affine = c(a1, a2)参数定义了网格的斜切规则:
a1:每一行(y方向步进1个单位)对应的x方向偏移量a2:每一列(x方向步进1个单位)对应的y方向偏移量
示例中从斜切参数反推角度的公式是atan2(a1, dim) * 180/pi,其中dim是单元格边长。反过来,已知旋转角度rot,需先将角度转换为弧度,再计算斜切参数:
- 将角度转换为弧度:
theta_rad <- rot * pi / 180 - 计算斜切参数:
a1 <- dim * tan(theta_rad),a2 <- dim * tan(theta_rad)
注意:当旋转角度大于180度时,tan值会重复周期特性,需结合坐标系方向调整y轴的步进方向(比如旋转265度时,y轴需要向南递减)。
修改后的完整代码
library(stars) library(ggplot2) # 定义网格参数 xorg <- 576206 yorg <- 4412742 nrows <- 8 ncols <- 5 dim <- 10 # 单元格大小 #### rot <- 265 # 旋转角度(度),相对于正北,逆时针为正 theta_rad <- rot * pi / 180 # 计算仿射变换参数 aff_mat <- c(dim * tan(theta_rad), dim * tan(theta_rad)) # 根据旋转角度调整y轴方向:当角度>180度时,y轴向南递减 if (rot > 180) { y <- seq(yorg, yorg - ((nrows-1)*dim), -dim) } else { y <- seq(yorg, yorg + ((nrows-1)*dim), dim) } #### # 构建x轴序列 x <- seq(xorg, xorg + ((ncols-1)*dim), dim) # 创建stars对象 d <- st_dimensions(x = x, y = y, .raster = c("x", "y"), affine = aff_mat) m <- matrix(seq(1, length(x)*length(y), 1), length(x), length(y)) r1 <- st_as_stars(r = m, dimensions = d) # 绘图 p <- ggplot() + geom_stars(data = r1) + coord_equal() + scale_fill_viridis_c() + theme_void() + theme(legend.position = 'none') p
效果说明
上述代码通过计算仿射参数并调整y轴方向,实现的网格倾斜效果与print(p, vp=grid::viewport(angle=rot))的旋转效果一致,符合stars vignette中的斜切变换逻辑。
内容的提问来源于stack exchange,提问作者DarwinsBeard
相关产品推荐
相关产品推荐

