如何在简单要素集中将点突变为线

时间:2019-03-04 07:49:23

标签: r dplyr sf

我有一个简单的特征数据框,其坐标从起点开始。从这个起点,我需要找到北距起点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 :(得分:1)

我们可以在group_by中使用summarizest_castLINESTRINGSF_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")

或者您可能要考虑如下制作两个线串。关键是为每个线串创建起点和终点(在这种情况下,复制第二行)并为每个线串分配一个ID,然后按照与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")