2015-05-15 1 views
10

Я пытаюсь наметить маршрут, используя функцию route() в ggmap. Моя проблема в том, что маршрут не остается на дорогах. Есть что-то, что отсутствует мой код route_df <- route(origin, destination, structure = "route")? Или есть альтернативная функция, которая может быть использована для этого?ggmap поиск маршрута - не стоит на дорогах

Пример кода:

install_github("rstudio/leaflet") 
library(ggmap) 
library(leaflet) 
way1txt <- "Tinsletown, Vancouver, BC" 
way2txt <- "Science World, Vancouver, BC" 
route_df <- route(way1txt, way2txt, structure = "route") 

# Map using Leaflet R 
m = leaflet() %>% addTiles() 
m = m %>% addPolylines(route_df$lon, route_df$lat, fill = FALSE) 
m = m %>% addPopups(route_df$lon[1], route_df$lat[1], 'Origin') 
m = m %>% addPopups(route_df$lon[length(route_df$lon)], 
        route_df$lat[length(route_df$lon)], 'Destination') 
m 

Скриншот карты:

Screenshot of map with wrong route

+1

Просто для справки, кто пытается повторить код на своих машинах. Вам понадобится пакет [листовки] (http://www.r-bloggers.com/the-leaflet-package-for-online-mapping-in-r/) для тиражирования, и он доступен только в Github: 'install_github («rstudio/sheetlet») ' – akhmed

+0

Я добавлю это.Спасибо за напоминание! – cnmillar

ответ

12

Похоже, что вы не на самом деле получить необходимые полилинии из route() поскольку по умолчанию output= параметр установлен в simple. Вероятно, вам нужно изменить его на all, как показано ниже, и начать декодирование полилиний.

Ниже приводитсяотельное решение, основанное на функции decodeLine(), взятом с here. Их решение состоит в том, чтобы определить пользовательскую функцию, которая декодирует полилинии, а затем нарисовывает все, что она декодирует.

library(ggmap) 
library(leaflet) 
way1txt <- "Tinsletown, Vancouver, BC" 
way2txt <- "Science World, Vancouver, BC" 

route_all <- route(way1txt, way2txt, structure = "route", 
        output = "all") 

# Custom decode function 
# Taken from http://s4rdd.blogspot.com/2012/12/google-maps-api-decoding-polylines-for.html 

decodeLine <- function(encoded){ 
    require(bitops) 

    vlen <- nchar(encoded) 
    vindex <- 0 
    varray <- NULL 
    vlat <- 0 
    vlng <- 0 

    while(vindex < vlen){ 
    vb <- NULL 
    vshift <- 0 
    vresult <- 0 
    repeat{ 
     if(vindex + 1 <= vlen){ 
     vindex <- vindex + 1 
     vb <- as.integer(charToRaw(substr(encoded, vindex, vindex))) - 63 
     } 

     vresult <- bitOr(vresult, bitShiftL(bitAnd(vb, 31), vshift)) 
     vshift <- vshift + 5 
     if(vb < 32) break 
    } 

    dlat <- ifelse(
     bitAnd(vresult, 1) 
     , -(bitShiftR(vresult, 1)+1) 
     , bitShiftR(vresult, 1) 
    ) 
    vlat <- vlat + dlat 

    vshift <- 0 
    vresult <- 0 
    repeat{ 
     if(vindex + 1 <= vlen) { 
     vindex <- vindex+1 
     vb <- as.integer(charToRaw(substr(encoded, vindex, vindex))) - 63   
     } 

     vresult <- bitOr(vresult, bitShiftL(bitAnd(vb, 31), vshift)) 
     vshift <- vshift + 5 
     if(vb < 32) break 
    } 

    dlng <- ifelse(
     bitAnd(vresult, 1) 
     , -(bitShiftR(vresult, 1)+1) 
     , bitShiftR(vresult, 1) 
    ) 
    vlng <- vlng + dlng 

    varray <- rbind(varray, c(vlat * 1e-5, vlng * 1e-5)) 
    } 
    coords <- data.frame(varray) 
    names(coords) <- c("lat", "lon") 
    coords 
} 


route_df <- decodeLine(route_all$routes[[1]]$overview_polyline$points) 


# Map using Leaflet R 
m = leaflet() %>% addTiles() 
m = m %>% addPolylines(route_df$lon, route_df$lat, fill = FALSE) 
m = m %>% addPopups(route_df$lon[1], route_df$lat[1], 'Origin') 
m = m %>% addPopups(route_df$lon[length(route_df$lon)], 
        route_df$lat[length(route_df$lon)], 'Destination') 
m 

И я получаю это:

enter image description here

Для справки, есть еще одна функция decodeLinehere написана @diegovalle.

+0

Это прекрасно! Спасибо огромное! – cnmillar

0

Вы можете использовать мой googleway пакет

  • получить направления
  • расшифровывают полилинию (если требуется)
  • участка маршрут на карте Google, либо в виде закодированной полилинии или декодированные точки

library(googleway) 

apiKey <- 'your_api_key' 
mapKey <- 'your_maps_api_key' 

res <- google_directions(origin = "Tinsletown, Vancouver, BC", 
         destination = "Science World, Vancouver, BC", 
         key = apiKey) 

Ломаная в res$routes$overview_polyline$points

Вы можете декодировать полилинию, если вы хотите

pl <- res$routes$overview_polyline$points 
decode_pl(pl) 
#   lat  lon 
# 1 49.28025 -123.1076 
# 2 49.27969 -123.1076 
# 3 49.27823 -123.1076 
# 4 49.27711 -123.1077 
# 5 49.27707 -123.1043 

Но вы не должны, вы можете построить линию непосредственно

df <- data.frame(polyline = pl) 

google_map(key = mapKey, search_box = T) %>% 
    add_polylines(data = df, polyline = "polyline") 

enter image description here

Примечание

  • Похоже, что происхождение не существует или переехал, так как вопрос был задан