代码之家  ›  专栏  ›  技术社区  ›  SeGa

从点创建多行,用sf包按id分组

  •  4
  • SeGa  · 技术社区  · 6 年前

    我收集了一些要点, 线型的 和一个 伊德塞克 . line id决定唯一的行id,而id_seq决定行id中的点的顺序。

    我想改变 指向行,按id顺序排列并按lineid分组 .

    带着包裹 sp ,我可以实现所需的结果,但我想使用 sf 包裹。我错过了什么?

    下面是一些虚拟数据,期望的结果用 服务提供商 -函数和两次相同的尝试 SF ,但是这些图显示了不同的结果。

    library(sp)
    library(sf)
    
    sfpoints <- {
    structure(list(LINEID = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 10L, 10L, 
    10L), ID_SEQ = c(10L, 11L, 12L, 13L, 16L, 30L, 31L, 32L, 33L, 
    34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 
    1L, 2L, 3L), geometry = structure(list(structure(c(15.423568, 
    47.06248), class = c("XY", "POINT", "sfg")), structure(c(15.423644, 
    47.062523), class = c("XY", "POINT", "sfg")), structure(c(15.423691, 
    47.062553), class = c("XY", "POINT", "sfg")), structure(c(15.423712, 
    47.06257), class = c("XY", "POINT", "sfg")), structure(c(15.423716, 
    47.062576), class = c("XY", "POINT", "sfg")), structure(c(15.423712, 
    47.062588), class = c("XY", "POINT", "sfg")), structure(c(15.423731, 
    47.062595), class = c("XY", "POINT", "sfg")), structure(c(15.423779, 
    47.062626), class = c("XY", "POINT", "sfg")), structure(c(15.423835, 
    47.062664), class = c("XY", "POINT", "sfg")), structure(c(15.423879, 
    47.062714), class = c("XY", "POINT", "sfg")), structure(c(15.423897, 
    47.062767), class = c("XY", "POINT", "sfg")), structure(c(15.423862, 
    47.062828), class = c("XY", "POINT", "sfg")), structure(c(15.423783, 
    47.062897), class = c("XY", "POINT", "sfg")), structure(c(15.423681, 
    47.062973), class = c("XY", "POINT", "sfg")), structure(c(15.423564, 
    47.06306), class = c("XY", "POINT", "sfg")), structure(c(15.423437, 
    47.063164), class = c("XY", "POINT", "sfg")), structure(c(15.42331, 
    47.06327), class = c("XY", "POINT", "sfg")), structure(c(15.423186, 
    47.063385), class = c("XY", "POINT", "sfg")), structure(c(15.423062, 
    47.063496), class = c("XY", "POINT", "sfg")), structure(c(15.422941, 
    47.063602), class = c("XY", "POINT", "sfg")), structure(c(15.422821, 
    47.063717), class = c("XY", "POINT", "sfg")), structure(c(15.422699, 
    47.063824), class = c("XY", "POINT", "sfg")), structure(c(15.422518, 
    47.061687), class = c("XY", "POINT", "sfg")), structure(c(15.422617, 
    47.06179), class = c("XY", "POINT", "sfg")), structure(c(15.422717, 
    47.061893), class = c("XY", "POINT", "sfg"))), class = c("sfc_POINT", 
    "sfc"), precision = 0, bbox = structure(c(15.422518, 47.061687, 
    15.423897, 47.063824), .Names = c("xmin", "ymin", "xmax", "ymax"
    ), class = "bbox"), crs = structure(list(epsg = NA_integer_, 
    proj4string = NA_character_), .Names = c("epsg", "proj4string"
    ), class = "crs"), n_empty = 0L)), .Names = c("LINEID", "ID_SEQ", 
    "geometry"), row.names = c(NA, -25L), class = c("sf", "data.frame"
    ), sf_column = "geometry", agr = structure(c(NA_integer_, NA_integer_
    ), .Names = c("LINEID", "ID_SEQ"), .Label = c("constant", "aggregate", 
    "identity"), class = "factor"))}
    
    par(mfrow=c(1,3))
    
    ## SP - way
    tstssp <- as(sfpoints, "Spatial")
    tstssp <- SpatialLines(lapply(split(tstssp, tstssp$LINEID), function(x) 
      Lines(list(Line(coordinates(x))), x$LINEID[1L])))
    plot(tstssp, col=1:2, lwd=3, main="SP-Desired Result")
    
    
    ## SF - way ???
    tst <- sfpoints %>% 
      group_by(LINEID) %>% 
      st_coordinates() %>%
      st_linestring()
    plot(st_geometry(tst), col=1:2 , main="SF-Wrong Result")
    
    tst <- sfpoints %>% 
      group_by(LINEID) %>%
      summarise() %>%
      st_cast("LINESTRING")
    plot(st_geometry(tst), col=1:2, main="SF-Wrong Result")
    

    Results

    1 回复  |  直到 6 年前
        1
  •  6
  •   Henrik plannapus    6 年前

    正如Edzer在 this issue ,你必须提供 summarise 带参数的函数 do_union = FALSE :

    tst <- sfpoints %>% 
      group_by(LINEID) %>%
      summarise(do_union = FALSE) %>%
      st_cast("LINESTRING")
    plot(st_geometry(tst), col=1:2)
    

    enter image description here