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

Posted

技术标签:

【中文标题】在空间范围内创建规则多边形网格,按给定角度旋转【英文标题】:Creating a regular polygon grid over a spatial extent, rotated by a given angle 【发布时间】:2018-12-19 07:58:20 【问题描述】:

大家好,

我正在为此苦苦挣扎,希望有人能提出一个简单的解决方案。

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

我知道我可以轻松地在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 年 7 月 11 日创建。

【问题讨论】:

也许首先(计数器)旋转多边形,然后用网格覆盖 ,然后旋转网格以覆盖原始多边形? 好主意!我试试看。 不幸的是,@JoshO'Brien 的建议对我不起作用...仍然得到不完整的封面...还有其他人吗? 【参考方案1】:

您没有具体说明,@JoshO'Brien 的建议究竟如何对您不起作用,但我怀疑您围绕不同的旋转中心旋转了多边形和网格。您没有对旋转原点指定任何约束,因此我在下面的代码 sn-p 中假设它并不重要,但只要两个旋转相同,您就可以使用任何点:

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)

【讨论】:

确实你是对的!我使用旋转多边形的质心而不是“原始”多边形的质心来“向后”旋转网格。您的解决方案似乎完美无缺。非常感谢!

以上是关于在空间范围内创建规则多边形网格,按给定角度旋转的主要内容,如果未能解决你的问题,请参考以下文章

使用多边形网格的 UV 瓦片

在坐标轴中的多边形,以原点为圆心旋转一定角度,旋转公式是啥

在python中生成多边形范围内的随机点数

如何检查 3d 网格的凸度?

ZBrush常用3D术语

三维重建:三维空间中平面的旋转公式