Добавьте вертикальные полилинии определенной длины к смежным многоугольникам в R - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь программно добавить несколько вертикальных полилиний определенной длины к смежным многоугольникам в R. Количество и длина полилиний должны быть указаны пользователем и могут варьироваться от 1 до 8 полилиний и от 5000 до 10000 футов.длинные на смежные полигоны.Как мне добиться этого в R?

Я могу сделать это вручную, используя пакет mapedit для пары полигонов, но я хотел бы автоматизировать процесс для нескольких тысяч смежных полигонов.

# Load required libraries
library(mapedit)
library(mapview)
library(dplyr)
library(sp)

# Sample polygons and polylines
geometry = structure(list(structure(list(structure(c(8.769563, 8.769563, 
                                                     8.770507, 8.770507, 8.769563, 50.815273, 50.815714, 50.815714, 
                                                     50.815273, 50.815273), .Dim = c(5L, 2L))), class = c("XY", "POLYGON", 
                                                                                                          "sfg")), structure(list(structure(c(8.769568, 8.769568, 8.770507, 
                                                                                                                                              8.770507, 8.769568, 50.814852, 50.81527, 50.81527, 50.814852, 
                                                                                                                                              50.814852), .Dim = c(5L, 2L))), class = c("XY", "POLYGON", "sfg"
                                                                                                                                              )), structure(list(structure(c(8.769568, 8.769568, 8.770502, 
                                                                                                                                                                             8.770502, 8.769568, 50.814412, 50.814849, 50.814849, 50.814412, 
                                                                                                                                                                             50.814412), .Dim = c(5L, 2L))), class = c("XY", "POLYGON", "sfg"
                                                                                                                                                                             )), structure(list(structure(c(8.769568, 8.769568, 8.770502, 
                                                                                                                                                                                                            8.770502, 8.769568, 50.814005, 50.814408, 50.814408, 50.814005, 
                                                                                                                                                                                                            50.814005), .Dim = c(5L, 2L))), class = c("XY", "POLYGON", "sfg"
                                                                                                                                                                                                            )), structure(list(structure(c(8.770502, 8.770502, 8.771301, 
                                                                                                                                                                                                                                           8.771301, 8.770502, 50.815273, 50.815717, 50.815717, 50.815273, 
                                                                                                                                                                                                                                           50.815273), .Dim = c(5L, 2L))), class = c("XY", "POLYGON", "sfg"
                                                                                                                                                                                                                                           )), structure(list(structure(c(8.770518, 8.770518, 8.771301, 
                                                                                                                                                                                                                                                                          8.771301, 8.770518, 50.814852, 50.81527, 50.81527, 50.814852, 
                                                                                                                                                                                                                                                                          50.814852), .Dim = c(5L, 2L))), class = c("XY", "POLYGON", "sfg"
                                                                                                                                                                                                                                                                          )), structure(list(structure(c(8.770507, 8.770507, 8.771301, 
                                                                                                                                                                                                                                                                                                         8.771301, 8.770507, 50.814408, 50.814849, 50.814849, 50.814408, 
                                                                                                                                                                                                                                                                                                         50.814408), .Dim = c(5L, 2L))), class = c("XY", "POLYGON", "sfg"
                                                                                                                                                                                                                                                                                                         )), structure(list(structure(c(8.770507, 8.770507, 8.771296, 
                                                                                                                                                                                                                                                                                                                                        8.771296, 8.770507, 50.814005, 50.814405, 50.814405, 50.814005, 
                                                                                                                                                                                                                                                                                                                                        50.814005), .Dim = c(5L, 2L))), class = c("XY", "POLYGON", "sfg"
                                                                                                                                                                                                                                                                                                                                        )), structure(c(8.769794, 8.769783, 50.814785, 50.814076), .Dim = c(2L, 
                                                                                                                                                                                                                                                                                                                                                                                                            2L), class = c("XY", "LINESTRING", "sfg")), structure(c(8.770051, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                    8.770035, 50.814785, 50.814069), .Dim = c(2L, 2L), class = c("XY", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 "LINESTRING", "sfg")), structure(c(8.770271, 8.77026, 50.814781, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    50.814076), .Dim = c(2L, 2L), class = c("XY", "LINESTRING", "sfg"
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ))), class = c("sfc_GEOMETRY", "sfc"), precision = 0, bbox = structure(c(xmin = 8.769563, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ymin = 50.814005, xmax = 8.771301, ymax = 50.815717), class = "bbox"), crs = structure(list(
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               epsg = 4326L, proj4string = "+proj=longlat +datum=WGS84 +no_defs"), class = "crs"), classes = c("POLYGON", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               "POLYGON", "POLYGON", "POLYGON", "POLYGON", "POLYGON", "POLYGON", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               "POLYGON", "LINESTRING", "LINESTRING", "LINESTRING"), n_empty = 0L)

# Visualize geometry
mapview(geometry)

enter image description here

Я пытался регулярно создавать точки выборки с помощью функции spsample внутри полигонов и соединять их линиями, но безуспешно.ценим любую помощь, которую я могу получить.

1 Ответ

0 голосов
/ 07 июня 2019

Вот один из способов создания линий с учетом многоугольника.Возможно, это не совсем то, что вам нужно, поскольку ваш запрос довольно специфичен, но, надеюсь, код достаточно универсален, чтобы вы могли его адаптировать.

library(sf)
library(purrr)
polygon <- st_polygon(list(matrix(c(1,1,2,2,1,1,0,0,1,1), ncol = 2)))

# use polygon bounding box to o compute line parameters
bb <- st_bbox(polygon)
number_of_lines <- 5
line_length <- (bb[["ymax"]] - bb[["ymin"]]) / 1.2
y_offset <- bb[["ymin"]] + (bb[["ymax"]] - bb[["ymin"]] - line_length) / 2

# compute coordinates
xs <- seq(bb[["xmin"]], bb[["xmax"]], length.out = number_of_lines)
ys <- bb[["ymin"]] + line_length
# create a linestring
lines <- purrr::map2(xs, ys, ~st_linestring(matrix(c(.x, .x, .y,y_offset), ncol = 2))) %>% st_sfc(crs = st_crs(polygon)) 

# view
plot(polygon)
plot(lines, col = 2, add = TRUE)

lines in polygon

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...