【问题标题】:How to mutate points to lines in simple feature collections如何在简单的特征集合中将点突变为线
【发布时间】:2019-07-25 11:59:57
【问题描述】:

我有一个简单的特征数据框,其中包含起点坐标。从这个起点开始,我需要找到新的、未知的、坐标,它们在起点以北 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 行。

任何指针将不胜感激!

【问题讨论】:

  • 您是否要以 2 行结尾?
  • 是的。 @www 的答案正是我要寻找的。​​span>

标签: r dplyr sf


【解决方案1】:

我们可以使用group_bysummarizest_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,然后按照与之前的解决方案相同的步骤进行操作。 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")

【讨论】:

    猜你喜欢
    • 2020-01-26
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多