在空间范围内创建正多边形网格,旋转给定角度
Creating a regular polygon grid over a spatial extent, rotated by a given angle
大家好,
我正在为此苦苦挣扎,希望有人能提出一个简单的解决方案。
我的 objective 是在多边形的范围内创建一个规则的多边形网格,但是 旋转
按用户定义的角度.
我知道我可以在 sf
中轻松创建一个 North/South 多边形网格,例如:
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
解决方案都欢迎。如果可能的话,“奖励积分”
使网格从多边形的极端顶点之一开始(即
网格的第一条线“接触”了多边形的北顶点),但那不是 "mandatory"。
由 reprex package (v0.2.0) 创建于 2018-07-11。
你没有具体说明,@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)
大家好,
我正在为此苦苦挣扎,希望有人能提出一个简单的解决方案。
我的 objective 是在多边形的范围内创建一个规则的多边形网格,但是 旋转 按用户定义的角度.
我知道我可以在 sf
中轻松创建一个 North/South 多边形网格,例如:
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
解决方案都欢迎。如果可能的话,“奖励积分”
使网格从多边形的极端顶点之一开始(即
网格的第一条线“接触”了多边形的北顶点),但那不是 "mandatory"。
由 reprex package (v0.2.0) 创建于 2018-07-11。
你没有具体说明,@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)