大家好,
我正在努力解决这个问题,希望有人能提出一个简单的解决方案.
我的目标是在多边形的范围内创建一个规则的多边形网格,但是按用户定义的角度旋转.
我知道我可以在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)
Run Code Online (Sandbox Code Playgroud)

我也知道我可以使用以下方法轻松旋转给定的角度:
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)
Run Code Online (Sandbox Code Playgroud)

我的问题是,根据旋转角度,输入多边形的一般"方向"和单元格大小,旋转的网格可能不再覆盖多边形的整个范围,如下所示:
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)
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题并创建一个完全覆盖多边形的旋转网格的任何聪明的想法(除了通过创建一个更大的网格开始,这对于小细胞化来说是非常低效的?)?
欢迎任何一种sf或者sp解决方案."加分点"如果可以使网格从多边形的一个极端顶点开始(即,网格的第一行"触及"多边形的北顶点),但这不是"强制性的".
由reprex包创建于2018-07-11 (v0.2.0).
你没有说明,@ JoshO'Brien的建议究竟对你不起作用,但我怀疑你在不同的旋转中心周围旋转了多边形和网格.你没有在旋转原点上指定任何约束,所以我在下面的代码片段中假设它并不重要,但是你可以在两次旋转时使用任何一点:
library(sf)
rotang = 45
rot = function(a) matrix(c(cos(a), sin(a), -sin(a), cos(a)), 2, 2)
tran = function(geo, ang, center) (geo - center) * rot(ang * pi / 180) + center
inpoly <- st_read(system.file("shape/nc.shp", package="sf"))[1,] %>%
sf::st_transform(3857) %>%
sf::st_geometry()
center <- st_centroid(st_union(inpoly))
grd <- sf::st_make_grid(tran(inpoly, -rotang, center), cellsize = 3000)
grd_rot <- tran(grd, rotang, center)
plot(inpoly, col = "blue")
plot(grd_rot, add = TRUE)
Run Code Online (Sandbox Code Playgroud)