2017-06-01 4 views
9

Ich verwende die ggmap route-Funktion zu berechnen und visualisieren Hunderte von Routen mit D.C. Capital Bikeshare Daten. Ich bin erfolgreich in der Lage, dies mit einem kleinen Problem zu tun, die Route folgt nicht Straßen, insbesondere gebogenen Straßen (siehe Screenshot unten). Gibt es eine Möglichkeit, meinen Code für detailliertere Pfade an alle anzupassen?Wie bekomme ich ggmap route Daten zu folgen Weg

enter image description here

library(tidyverse) 
library(ggmap) 

# Example dataset 
feb_14 <- read.csv('https://raw.githubusercontent.com/smitty1788/Personal-Website/master/dl/CaBi_Feb_2017.csv', stringsAsFactors = FALSE) 

# Subset first 300 rows, keep start and end Lat/Long strings 
start<-c(feb_14[1:300, 14]) 
dest<-c(feb_14[1:300, 15]) 

# df of individual routes 
routes <- tibble(
    start, 
    dest) 

# Function to calculate route 
calculationroute <- function(startingpoint, stoppoint) { 
    route(from = startingpoint, 
     to = stoppoint, 
     mode = 'bicycling', 
     structure = "route")} 

# Calculate route path for all individual trips 
calculatedroutes <- mapply(calculationroute, 
          startingpoint = routes$start, 
          stoppoint = routes$dest, 
          SIMPLIFY = FALSE) 

# Unlist and merge in single dataframe 
do.call(rbind.data.frame, lapply(names(calculatedroutes), function(x) { 
    cbind.data.frame(route=x, calculatedroutes[[x]], stringsAsFactors=FALSE) 
})) -> long_routes 


# create map with routes 
basicmap <- get_map(location = 'washingtondc', 
        zoom = 13, 
        maptype = "toner-background", 
        source = "google", 
        color = "bw") 
basicmap <- ggmap(basicmap) 


basicmap + geom_path(data=long_routes, 
        aes(x=lon, y=lat, group=route), color = "red", 
        size=1, alpha = .4, lineend = "round") 
+0

mit 'output = "all"' 'innen Route versuchen, Datenrahmen zu erstellen (von = startpoint, bis = stoppoint, mode = 'radfahren', structure = "route", output = "all") ' – SymbolixAU

+0

Das verursacht die do.call (rbind ... um diesen Fehler zu werfen. Fehler in (Funktion (..., Zeilenname s = NULL, check.rows = FALSCH, check.names = TRUE,: Argumente implizieren unterschiedliche Anzahl von Zeilen: 1, 0 –

+0

Mapzen's Valhalla ist ein Webservice, der Routen von Punkt zu Punkt, einschließlich GeoJSON der Route bereitstellen kann. https://mapzen.com/blog/valhalla-intro/. Das GeoJSONio-Paket kann das scheinbar verbrauchen. –

Antwort

1

Die Antwort war die decodeLine Funktion in die do.call zu platzieren die langen Strecken

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 
} 

calculatedroutes <- mapply(calculationroute, 
          startingpoint = routes$start, 
          stoppoint = routes$dest, 
          SIMPLIFY = FALSE) 

do.call(rbind.data.frame, lapply(names(calculatedroutes), function(x) { 
    cbind.data.frame(route = x, decodeLine(calculatedroutes[[x]]$routes[[1]]$overview_polyline$points), stringsAsFactors=FALSE) 
})) -> long_routes 
Verwandte Themen