Общее расстояние маршрута с использованием машины маршрутизации Leaflet в rMaps/rCharts
Я хотел бы создать блестящее приложение, которое запрашивает два адреса, отображает эффективный маршрут и вычисляет общее расстояние маршрута. Это можно сделать с помощью машины маршрутизации листовок, используя библиотеку javascript, однако я хотел бы провести ряд дальнейших вычислений с расстоянием маршрута и встроить все это в блестящее приложение.
Вы можете создать карту, используя rMaps, следуя этой демонстрации Ramnathv здесь. Но я не могу вытащить общее пройденное расстояние, хотя вижу, что оно рассчитано в легенде или контроллере. Существует еще одно обсуждение того, как сделать это с помощью библиотеки javascript - см. Здесь. Они обсуждают, используя этот код JavaScript:
alert('Distance: ' + routes[0].summary.totalDistance);
Вот мой рабочий код для rMap. Если у кого-нибудь есть идеи, как вытащить общее расстояние маршрута и сохранить его, я был бы очень признателен. Спасибо!
# INSTALL DEPENDENCIES IF YOU HAVEN'T ALREADY DONE SO
library(devtools)
install_github("ramnathv/rCharts@dev")
install_github("ramnathv/rMaps")
# CREATE FUNCTION to convert address to coordinates
library(RCurl)
library(RJSONIO)
construct.geocode.url <- function(address, return.call = "json", sensor = "false") {
root <- "http://maps.google.com/maps/api/geocode/"
u <- paste(root, return.call, "?address=", address, "&sensor=", sensor, sep = "")
return(URLencode(u))
}
gGeoCode <- function(address,verbose=FALSE) {
if(verbose) cat(address,"\n")
u <- construct.geocode.url(address)
doc <- getURL(u)
x <- fromJSON(doc)
if(x$status=="OK") {
lat <- x$results[[1]]$geometry$location$lat
lng <- x$results[[1]]$geometry$location$lng
return(c(lat, lng))
} else {
return(c(NA,NA))
}
}
# GET COORDINATES
x <- gGeoCode("Vancouver, BC")
way1 <- gGeoCode("645 East Hastings Street, Vancouver, BC")
way2 <- gGeoCode("2095 Commercial Drive, Vancouver, BC")
# PRODUCE MAP
library(rMaps)
map = Leaflet$new()
map$setView(c(x[1], x[2]), 16)
map$tileLayer(provider = 'Stamen.TonerLite')
mywaypoints = list(c(way1[1], way1[2]), c(way2[1], way2[2]))
map$addAssets(
css = "http://www.liedman.net/leaflet-routing-machine/dist/leaflet-routing-machine.css",
jshead = "http://www.liedman.net/leaflet-routing-machine/dist/leaflet-routing-machine.js"
)
routingTemplate = "
<script>
var mywaypoints = %s
L.Routing.control({
waypoints: [
L.latLng.apply(null, mywaypoints[0]),
L.latLng.apply(null, mywaypoints[1])
]
}).addTo(map);
</script>"
map$setTemplate(
afterScript = sprintf(routingTemplate, RJSONIO::toJSON(mywaypoints))
)
# map$set(width = 800, height = 800)
map
1 ответ
Вы можете легко создать маршрут через API Google Maps. Возвращенный фрейм данных будет иметь информацию о расстоянии. Просто подведите ноги на общее расстояние.
library(ggmap)
x <- gGeoCode("Vancouver, BC")
way1txt <- "645 East Hastings Street, Vancouver, BC"
way2txt <- "2095 Commercial Drive, Vancouver, BC"
route_df <- route(way1txt, way2txt, structure = 'route')
dist<-sum(route_df[,1],na.rm=T) # total distance in meters
#
qmap(c(x[2],x[1]), zoom = 12) +
geom_path(aes(x = lon, y = lat), colour = 'red', size = 1.5, data = route_df, lineend = 'round')