2016-12-17 2 views
2

Я пытаюсь создать линии на карте с Leaflet между точками широты/долготы. Вот входная выборка данных:R Карта листов - Draw Line для каждой строки dataframe

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) 
} 

Спасибо вы за помощь

+0

взглянуть на пакете зре. Он работал для меня раньше. Если вы можете поделиться набором данных, я могу написать код –

+0

возможный дубликат с http://stackoverflow.com/questions/32275213/how-do-i-connect-two-coordinates-with-a-line-using-leaflet -in-r – MLavoie

+0

@ Dinesh.hmn Я разместил пример набора данных – ayshelina

ответ

3

Чтобы линии, соединяющиеся последовательно, вам нужны ваши данные, переделанные в длинную форму, с точками в порядке.

И для этого без использования каких-либо пространственных объектов (например, от 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

+0

Я беспокоюсь, что это решение имеет ту же проблему, что и моя попытка. обратите внимание, что линии и круги в середине имеют гораздо более высокую непрозрачность и более смелые? Я думаю, что они дублируются.И мои данные будут иметь сотни строк, я думаю, что это может быть проблемой:/ – ayshelina

+0

@ayshelina Вы правы - я добавил в шаге «дедуплировать» точки 'df <- unique (df [, c («segment_id», «lat», «lon»)]) ' – SymbolixAU

+0

Я попытался запустить его на большем наборе данных, и он создал линии, где их не должно быть :(Я проверил фрейм входных данных, и эти соединения не там есть, вот скриншот на выходе: http://imgur.com/XBpJOGm. Я использовал ваш код, я понятия не имею, как ему удается создавать эти случайные строки ... – ayshelina