В приведенном ниже коде я сначала создаю прямоугольник из двух горизонтальных линий и двух вертикальных линий. Затем я использую st_polygonize
для создания многоугольника. Наконец, я использую st_cast
для создания объекта класса,
[1] "XY" "POLYGON" "sfg"
что мне и нужно. Однако, когда я пытаюсь сделать что-то подобное с волной, это терпит неудачу. Я создаю волновой многоугольник, дублируя волновую линию, перемещая ее вверх и добавляя стороны.
wave_gc
График ОК, но когда я выполняю:
wave_poly <- class(st_cast(wave_gc, "POLYGON"))
wave_poly пусто. Почему это? Как мне в конечном итоге получить объект класса
[1] "XY" "POLYGON" "sfg"
что работает?
library(sf)
library(transformr)
# Rectangle #########################
# two vertical lines
v_lines <- st_multilinestring(list(rbind(c(0,0),c(0,1)), rbind(c(3,0),c(3,1))))
# two horizontal lines
h_lines <- st_multilinestring(list(rbind(c(0,0),c(3,0)), rbind(c(0,1),c(3,1))))
all_lines <- c(v_lines, h_lines)
rect_gc <- st_polygonize(all_lines)
rect_poly <- st_cast(rect_gc, "POLYGON")
class(rect_gc)
# [1] "XY" "GEOMETRYCOLLECTION" "sfg"
class(rect_poly)
# [1] "XY" "POLYGON" "sfg"
rect_poly
#################################################################
# Wave
################################################################
w1 <- path_waves(st = TRUE)[[1]]
w2 <- w1
# Add to second column, y values
w2[,2] <- w2[,2] + 0.1
# Vertical bars
nr <- nrow(w1)
v_bars <- st_multilinestring(list(rbind(c(w1[1, 1], w1[1, 2]), c(w2[1, 1], w2[1, 2])),
rbind(c(w1[nr, 1], w1[nr, 2]), c(w2[nr, 1], w2[nr, 2]))))
two_waves <- st_multilinestring(list(w1, w2))
full_wave <- c(v_bars, two_waves)
wave_gc = st_polygonize(full_wave)
wave_poly <- class(st_cast(wave_gc, "POLYGON"))
class(wave_gc)
# [1] "XY" "GEOMETRYCOLLECTION" "sfg"
plot(wave_gc)
wave_poly
# [1] "XY" "POLYGON" "sfg"