在空间范围内创建规则的多边形网格,旋转给定角度

时间:2018-07-11 10:07:18

标签: r sp sf

大家好,

我为此感到困惑,希望有人能提出一个简单的解决方案。

我的目标是在多边形范围内创建规则的多边形网格,但已旋转 按用户定义的角度

我知道我可以使用以下示例在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)

关于如何解决此问题并创建一个完全覆盖多边形的旋转网格的任何聪明主意(此外, 网格开始,这对于小型单元格来说效率很低?)?

欢迎使用sfsp解决方案。可能的“奖励积分” 使网格从多边形的极端顶点之一开始(即 网格的第一行“接触”多边形的北顶点),但这不是“强制性”的。

reprex package(v0.2.0)于2018-07-11创建。

1 个答案:

答案 0 :(得分:8)

您没有指定@ 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)