R Leaflet地图 - 为数据框的每一行绘制线

5

我正在尝试使用 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

这应该有6行结果 lat1,lng1 -> lat2,lng2。我在使用addPolylines时遇到了麻烦,它会创建额外的不需要的线条,我不确定原因所在。

enter image description here

这是它应该看起来的样子,没有多余叠放在一起的线条: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)
}

感谢您的帮助。

看一下sp包。以前它对我有用过。如果你能分享数据集,我可以写代码。 - Dinesh.hmn
1
x <- read.csv("/home/dinesh/dat.csv", header = F) x <- as.matrix(x) library(sp) lnam <- list() for (i in 1:nrow(x)){ te <- data.frame(matrix(data = c(x[i,1],x[i,3],x[i,2],x[i,4]), nrow = 2)) nam <- paste0("line",i) lnam[i] <- nam assign(nam,Lines(list(Line(te)),ID = paste0(i))) } lnam <- as.character(lnam) mylines.lst <- list() for(tti in 1:length(lnam)) { mylines.lst[[tti]] <- get(lnam[tti]) } splines <- SpatialLines(mylines.lst) m <- leaflet(splines) %>% addTiles() %>% addPolylines() - Dinesh.hmn
可能只是缩放级别的问题 - 你尝试过缩小视图吗? - SymbolixAU
缩小或放大都没用 :( 它的行为非常奇怪,如果我只留下以下代码: mymap <- leaflet(splines) mymap <- addTiles(mymap) mymap <- addPolylines(mymap) 线条会出现,但背景不会出现。如果我添加圆圈和标记,那么一切都显示正常,唯独线条会消失... - ayshelina
我的回答没帮助吗? - SymbolixAU
显示剩余4条评论
1个回答

5
要获得按顺序连接的线条,您需要将数据重塑为长形,并按顺序排列点。
为了在不使用任何空间对象(例如来自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

enter image description here


我担心这个解决方案和我的尝试有相同的问题。你有没有注意到中间的线条和圆圈具有更高的不透明度和更粗的线条?我认为它们是重复的。而且我的数据将有数百条线,我认为这可能是一个问题:/ - ayshelina
@ayshelina 你说得对 - 我已经添加了一个“去重”步骤 df <- unique(df[, c("segment_id", "lat","lon")]) - SymbolixAU
我尝试在一个更大的数据集上运行它,结果出现了不应该存在的线连接 :( 我检查了输入数据框架,那些连接在那里并不存在,这是输出截图:http://imgur.com/XBpJOGm。我使用了你的代码,但我不知道它是如何创建这些随机线条的... - ayshelina
@ayshelina 看起来这些线条没有适当地分组。你是否仍然为每组连接的线条保留了 segment_id - SymbolixAU
我的原始数据框架每行都是应该绘制的一条线。行数应该等于线条数。不幸的是,我不知道如何调试这个问题,但我认为它连接了 lat1/lng1[1] -> lat2/lng2[1],这是我们想要的,但是也连接了 lat2/lng2[1] -> lat1/lng1[2](它们在一个线段中),但我们不希望它们连接。这可能是为什么在大数据集中会出现线条重复或出现奇怪的额外连接的原因。 - ayshelina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接