我有一个简单的特征数据框,其坐标从起点开始。从这个起点,我需要找到北距起点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行。
任何指针将不胜感激!
答案 0 :(得分:1)
我们可以在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")
或者您可能要考虑如下制作两个线串。关键是为每个线串创建起点和终点(在这种情况下,复制第二行)并为每个线串分配一个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")