R Leaflet map - 为数据框的每一行绘制线条

ays*_*ina 5 r leaflet

我正在尝试在地图上创建Leaflet纬度/经度点之间的线。这是一个示例输入数据:

  segment_id latitude1 longitude1 latitude2 longitude2      len
1          1  48.15387   17.07388  48.15396   17.07387 10.98065
2          1  48.15396   17.07387  48.15404   17.07377 11.31327
3          1  48.15404   17.07377  48.15410   17.07364 11.74550
4          1  48.15410   17.07364  48.15412   17.07349 11.48138
5          1  48.15412   17.07349  48.15412   17.07334 11.63625
6          2  48.15424   17.07307  48.15432   17.07299 10.79304
Run Code Online (Sandbox Code Playgroud)

结果应该是 6 行lat1,lng1-> lat2,lng2。我很难使用addPolylines,它会产生额外的不需要的线条,我不知道为什么。

在此输入图像描述

这就是它应该的样子,没有多余的线堆叠在一起:D

到目前为止,这是我的代码,但它是垃圾:

  drawEdges <- function(x) {
    d <- cbind(x$latitude1,x$latitude2)
    s <- rep(1:nrow(x), each = 2) + (0:1) * nrow(x)
    latitudeOut <- d[s]
    e <- cbind(x$longitude1,x$longitude2)
    t <- rep(1:nrow(x), each = 2) + (0:1) * nrow(x)
    longitudeOut <- e[t]
    mymap <<- addPolylines(map = mymap,data = x, lng = ~longitudeOut, lat = ~latitudeOut)
  }

  if (!is.null(edges)){
    segments <- split( edges , f = edges$segment_id )
    segments
    sapply(segments, drawEdges)
}
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助

Sym*_*xAU 5

为了让线条按顺序连接,您需要将数据重新整形为长形式,并且点按顺序排列。

要在不使用任何空间对象(例如 from library(sp))的情况下执行此操作,您需要使用循环添加线条。

library(leaflet)

### --- reshaping the data ----
## keep the order - but because we're going to split the data, only use odd numbers
## and we'll combine the even's on later
df$myOrder <- seq(from = 1, to = ((nrow(df) * 2) - 1), by = 2)

## put the data in long form by splitting into two sets and then rbinding them
## I'm renaming the columns using setNames, as we need to `rbind` them
## together later
df1 <- setNames(df[, c("segment_id","latitude1","longitude1", "myOrder")],
                c("segment_id", "lat","lon", "myOrder"))

df2 <- setNames(df[, c("segment_id","latitude2","longitude2", "myOrder")],
                c("segment_id", "lat","lon", "myOrder"))

## make df2's order even
df2$myOrder <- (df2$myOrder + 1)

df <- rbind(df1, df2)

## can now sort the dataframe
df <- df[with(df, order(myOrder)), ]

## and de-dupelicate it
df <- unique(df[, c("segment_id", "lat","lon")])
### -----------------------------


## ----- plotting ---------------
map <- leaflet(data = df) %>%
  addTiles() %>%
  addCircles()

## without using any spatial objects, you add different lines in a loop
for(i in unique(df$segment_id)){
  map <- addPolylines(map, data = df[df$segment_id == i,], 
                      lat = ~lat, lng = ~lon, group = ~segment_id)
}
map
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述