如何使用R中的sf包旋转网格?

问题描述 投票:0回答:1

背景

我使用 st_buffer 和 st_make_grid 从 xy 点创建绘图(如下面的代码所示)。 有了这些图,我想创建网格。创建网格后,我想将它们旋转到特定角度。在最后一步中我收到错误:

Error in MtrxSet(x, dim, type = "POLYGON", needClosed = TRUE) : 
  polygons not (all) closed

示例代码

library(dplyr)
library(tidyverse)
library(sf)
library(spatialEco)

xy <- st_as_sf(data.frame(x = 1,
                          y = 3),
               coords = c("x", "y"))
plot(xy)

# 1) Buffer
cen_buffer = st_buffer(xy, 100)

ggplot()  +
  geom_sf(data= cen_buffer$geometry, color='black') +
  geom_sf(data = xy$geometry, color = 'red')


# 2) Square
square_1ha <- st_make_grid(cen_buffer, n=1)

ggplot() +
  geom_sf(data=cen_buffer, color='black') +
  geom_sf(data=square_1ha, color='black', fill=NA) +
  geom_sf(data = xy$geometry, color = 'red')

# 3) Grid

grid_spacing <- 10

grid_1ha <- st_make_grid(square_1ha, square = T, cellsize = c(grid_spacing, grid_spacing)) %>%
  st_sf()
grid_1ha <- sf::st_set_precision(grid_1ha, 1000000) %>% sf::st_make_valid()

ggplot() +
  geom_sf(data = grid_1ha$geometry, color = 'red') +
  geom_sf(data=cen_buffer, color='black') +
  geom_sf(data=square_1ha, color='black', fill=NA) +
  geom_sf(data = xy$geometry, color = 'red')

# 4) Rotate
grid_1ha <- rotate.polygon(grid_1ha, angle = 45)

我尝试过的方法

使用 st_union(grid) 可以工作,并且多边形会旋转。然而,这并不能解决问题,因为内部网格将会消失。

我尝试使用这个

grid_1ha <- sf::st_set_precision(grid_1ha, 1000000) %>% sf::st_make_valid()
,因为根据其他stackoverflow问题,可以解决这个问题。就我而言,这不起作用。

我尝试使用

st_cast()
将网格转换为MULTIPOLYGON,但没有成功。

r gis r-sf
1个回答
0
投票

您可以对

sfc
对象使用矩阵乘法;从你的例子来看,尝试

m = matrix(c(.9,.1,-.1,.9), 2)
st_geometry(grid_1ha) * m -> m2
plot(m2)

并查看 ?Ops.sfc 的帮助和示例

© www.soinside.com 2019 - 2024. All rights reserved.