大家好,
我在这个问题上感到困惑,希望有人能提出一个简单的解决方案。
我的目标是在多边形的范围内创建一个正多边形网格,但旋转一个用户定义的角度。
我知道我可以轻松地使用sf
创建南/北多边形网格,例如:
library(sf)
#> Linking to GEOS 3.6.2, GDAL 2.2.3, proj.4 4.9.3
inpoly <- st_read(system.file("shape/nc.shp", package="sf"))[1,] %>%
sf::st_transform(3857) %>%
sf::st_geometry()
grd <- sf::st_make_grid(inpoly, cellsize = 3000)
plot(inpoly, col = "blue")
plot(grd, add = TRUE)
我也知道我可以通过给定的角度轻松地旋转它:
rotang = 20
rot = function(a) matrix(c(cos(a), sin(a), -sin(a), cos(a)), 2, 2)
grd_rot <- (grd - st_centroid(st_union(grd))) * rot(rotang * pi / 180) +
st_centroid(st_union(grd))
plot(inpoly, col = "blue")
plot(grd_rot, add = TRUE)
我的问题是,根据旋转角度、输入多边形的一般“方向”和单元格大小,旋转后的网格可能不再完全覆盖多边形,如下所示:
rotang = 45
rot = function(a) matrix(c(cos(a), sin(a), -sin(a), cos(a)), 2, 2)
grd_rot <- (grd - st_centroid(st_union(grd))) * rot(rotang * pi / 180) +
st_centroid(st_union(grd))
plot(inpoly, col = "blue")
plot(grd_rot, add = TRUE)
有没有什么聪明的想法可以解决这个问题并且创建一个旋转的网格完全覆盖多边形(除了通过创建一个更大的网格来开始,对于小单元格大小而言相当低效?)
无论是sf
还是 sp
的解决方案都将受到欢迎。“奖励分”如果可能的话,使网格从多边形的极端顶点之一开始(即,网格的第一行“触摸”多边形的北部顶点),但这不是“强制性”的。
由 reprex包(v0.2.0)于2018-07-11创建。