Как преобразовать точки в линии в простых коллекциях объектов - PullRequest
0 голосов
/ 04 марта 2019

У меня есть простой фрейм данных объекта с координатами от начальной точки.Из этой начальной точки мне нужно найти новые, неизвестные координаты , которые находятся в 1 км к северу и 1 км к северу + 1 км к востоку от начальной точки.

Затем мне нужно создать отрезки линии от первой до второй точки и от второй до третьей точки.

Я хотел бы сделать это, поменяв столбец географии.

Пример:

library(sf)
library(dplyr)

SF_df <- 
tibble(case = c("A", "B", "C"),
       LAT = 523456, LONG = 652348) %>% 
st_as_sf(coords = c("LONG", "LAT"), crs = "+proj=utm +zone=33    +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs")

#make new points
SF_df %>% 
mutate(geometry = ifelse(case == "A", geometry, 
                  ifelse(case == "B", geometry+c(0,1000),
                       geometry + c(1000,1000)))) 

Я попытался

 SF_df %>% 
 mutate(geometry = ifelse(case == "A", st_linestring(geometry,    geometry+c(0,1000)),
                ifelse(case == "B", st_linestring(geometry+c(0,1000), geometry+c(1000,1000)), NA)))

, который неработать, потому что st_linestring нужна матрица числовых значений.Я также попытался преобразовать точки с помощью as.numeric(as.coordinates( x)), который тоже не работает.

Результатом должен быть sf-фрейм данных с одной строкой на точку + 1 строка на линию строк между точками.

любые указатели приветствуются!

1 Ответ

0 голосов
/ 04 марта 2019

Мы можем использовать group_by, summarize и st_cast до LINESTRING.SF_df3 - окончательный результат.

library(dplyr)
library(sf)

SF_df <- 
  tibble(case = c("A", "B", "C"),
         LAT = 523456, LONG = 652348) %>% 
  st_as_sf(coords = c("LONG", "LAT"), crs = "+proj=utm +zone=33    +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs")

#make new points
SF_df2 <- SF_df %>% 
  mutate(geometry = ifelse(case == "A", geometry, 
                           ifelse(case == "B", geometry+c(0,1000),
                                  geometry + c(1000,1000)))) 

# Make a linestring
SF_df3 <- SF_df2 %>%
  mutate(Line = "A") %>%
  group_by(Line) %>%
  summarize() %>%
  st_cast("LINESTRING")

Или вы можете рассмотреть возможность создания двух строк:Ключ заключается в том, чтобы создать начало и конец для каждой строки (в этом случае дублировать вторую строку) и назначить идентификатор для каждой строки, а затем выполнить тот же шаг, что и решение previois.SF_df4 - конечный результат.

# Make two linestring
SF_df4 <- SF_df2 %>%
  # Duplicate the second row
  slice(1, 2, 2, 3) %>%
  mutate(Line = rep(c("A", "B"), each = 2)) %>%
  group_by(Line) %>%
  summarize() %>%
  st_cast("LINESTRING")
...