Похоже, что вы не на самом деле получить необходимые полилинии из 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
И я получаю это:

Для справки, есть еще одна функция decodeLine
here написана @diegovalle.
Просто для справки, кто пытается повторить код на своих машинах. Вам понадобится пакет [листовки] (http://www.r-bloggers.com/the-leaflet-package-for-online-mapping-in-r/) для тиражирования, и он доступен только в Github: 'install_github («rstudio/sheetlet») ' – akhmed
Я добавлю это.Спасибо за напоминание! – cnmillar