2015-08-09 4 views
-1

Я хотел бы указать 2 разных маршрута на 1 карте. Это код, который я сделал в качестве примера:Построение нескольких линий на карте 1

### Plot 2 routes on 1 map 

# libraries 

library(ggmap) 
library(ggplot2) 

# plot map 

basicmap <- get_map(location = c(lon = 3, lat = 50), 
        zoom = 12, 
        maptype = "roadmap", 
        source = "google", 
        color = "color") #completely random location 
basicmap <- ggmap(basicmap) 

# determine routes 

routes <- data.frame(from = c("Rocquigny", "Nurlu"), 
        to = c("Heudicourt","Longavesnes"), 
        stringsAsFactors = FALSE) 

# calculate routes 

calculationroute <- function(startingpoint, stoppoint) { 
    route(from = startingpoint, 
     to = stoppoint, 
     mode = "bicycling", 
     structure = "route") 
} 
    #this function calculates the route 

calculatedroutes <- mapply(calculationroute, 
          startingpoint = routes$from, 
          stoppoint = routes$to, 
          SIMPLIFY = FALSE) 
    #calculate the 2 routes 

# draw routes 

drawroute <- function(route) { 
    geom_path(aes(data = route, 
       x = lon, 
       y = lat)) 
} 
    #this functions draws the route 

extendedmap <- basicmap + lapply(X = calculatedroutes, 
           FUN = drawroute) 
plot(extendedmap) 
    #draw the routes 

Так тезисы шаги я принимаю:

  1. Фоновая карта создается
  2. Я делаю dataframe, содержащий исходные точки и конечные точки для 2 маршрута
  3. Использование ggmap Я вычисляю сегменты этих маршрутов.
  4. Я стараюсь рисовать маршруты на верхней части фона карты

К сожалению, последний шаг терпит неудачу, и эта ошибка:

Don't know how to automatically pick scale for object of type function. Defaulting to continuous 
Error in data.frame(x = c(2.89030838012694, 3.11003494262694, 2.89030838012694, : 
    arguments imply differing number of rows: 4, 0 

Я сделал поиск и this previous question хотел сделать то же самое , Решение, которое он, наконец, выбрал, использует цикл for, и я предпочел бы сохранить свой код в соответствии, используя вместо этого.

+0

Цикл 'for' является прекрасным решением для этого, поскольку он добавляет геометрии в стандартном режиме для построения в ggplot. нет ничего плохого в использовании циклов 'for' в R и/или их смешивании с использованием идиомы' * apply'. – hrbrmstr

ответ

1

Как я уже сказал в комментарии, цикл for работает, но вы можете сделать это еще больше ggplot -ish. Во-первых, мы должны изменить свой ggmap вызов, так как экстентов не достаточно большой для одного из маршрутов:

basicmap <- get_map(location = c(lon = 3, lat = 50), 
        zoom = 8, 
        maptype = "roadmap", 
        source = "google", 
        color = "color") #completely random location 
basicmap <- ggmap(basicmap) 

После расчета маршрутов, мы можем сделать длинный кадр данных из них:

do.call(rbind.data.frame, lapply(names(calculatedroutes), function(x) { 
    cbind.data.frame(route=x, calculatedroutes[[x]], stringsAsFactors=FALSE) 
})) -> long_routes 

, а затем использовать group эстетику для geom_path:

basicmap + geom_path(data=long_routes, 
        aes(x=lon, y=lat, group=route, color=route), 
        size=1) 

enter image description here

+0

Спасибо за ответ, это работает. И мне жаль, что карта не достаточно большая, я адаптировал этот пример из своего исходного кода и пропустил этот лапсус. – 1053Inator