WIP/pointolines.R

#' Source: https://rpubs.com/walkerke/points_to_line
#'
#' @param data
#' @param long
#' @param lat
#' @param id_field
#' @param sort_field
#'
#' @return
#' @export
#'
#' @examples
#' 
#' 
points_to_line <- function(data, long, lat, id_field = NULL, sort_field = NULL) {
  reuire(sp)
  require(maptools)

  # Convert to SpatialPointsDataFrame
  coordinates(data) <- c(long, lat)

  # If there is a sort field...
  if (!is.null(sort_field)) {
    if (!is.null(id_field)) {
      data <- data[order(data[[id_field]], data[[sort_field]]), ]
    } else {
      data <- data[order(data[[sort_field]]), ]
    }
  }

  # If there is only one path...
  if (is.null(id_field)) {

    lines <- SpatialLines(list(Lines(list(Line(data)), "id")))

    return(lines)

    # Now, if we have multiple lines...
  } else if (!is.null(id_field)) {

    # Split into a list by ID field
    paths <- sp::split(data, data[[id_field]])

    sp_lines <- SpatialLines(list(Lines(list(Line(paths[[1]])), "line1")))

    # I like for loops, what can I say...
    for (p in 2:length(paths)) {
      id <- paste0("line", as.character(p))
      l <- SpatialLines(list(Lines(list(Line(paths[[p]])), id)))
      sp_lines <- spRbind(sp_lines, l)
    }

    return(sp_lines)
  }
}
IREA-CNR-MI/sprawl documentation built on May 27, 2019, 1:12 p.m.