r - 在 Shiny 应用程序中使用 googleway 绘制航点路线

标签 r google-maps shiny googleway

我正在 Shiny 应用程序中使用 google-way。

我从这个例子开始:Drawing journey path using leaflet in R并对它进行了一些修改,以在目的地和出发地之间添加 2 个额外的路径点,并让 google_directions 渲染它们之间的最佳路线。

绘制的路线确实是最佳路线,我可以将其复制到 5-6-7 或 10 个航路点。然而,在每种情况下,为了绘制路线,我都需要输入所有航路点的地址。如果某些航路点留空,应用程序会返回错误,我不知道如何解决这个问题。我认为应该使用某种“if”运算符,但不确定如何以及在何处确切使用。

这是我的代码:

library(shiny)
library(googleway)

ui <- navbarPage("APP NAME", position = c("static-top"),
tabPanel("MAP",
       google_mapOutput(outputId = "mapWarsaw"),
       textInput(inputId = "origin", label = "Departure point"
       ),
       textInput(inputId = "waypoint", label = "Waypoint 1"
       ),
       textInput(inputId = "waypoint2", label = "Waypoint 2",
       ),
       textInput(inputId = "destination", label = "Destination point"
       ),
       actionButton(inputId = "getRoute", label = "Get Route")
       )
)

server <- function(input, output, session) {


map_key <- '<APIKEY>'
api_key <- '<APIKEY>'

df_route <- eventReactive(input$getRoute,{

print("getting route")

o <- input$origin
w <- input$waypoint
q <- input$waypoint2
d <- input$destination

return(data.frame(origin = o, waypoint = w, waypoint2 = q, destination = d, stringsAsFactors = F))

})


output$mapWarsaw <- renderGoogle_map({
df <- df_route()
print(df)
if(df$origin == "" | df$waypoint == ""| df$waypoint2 == "" | df$destination == "")
  return()

res <- google_directions(key = api_key,
                         origin = df$origin,
                         waypoints = list(stop = df$waypoint,
                                          stop = df$waypoint2),
                         destination = df$destination,
                         optimise_waypoints = TRUE,
                         mode = "driving")

df_route <- data.frame(route = res$routes$overview_polyline$points)

google_map(key = map_key, search_box = TRUE, scale_control = TRUE, height = 1000) %>%
  add_traffic()%>%
  add_polylines(data = df_route,
                polyline = "route",
                stroke_colour = "#FF33D6",
                stroke_weight = 7,
                stroke_opacity = 0.7,
                info_window = "New route",
                load_interval = 100)
})
}


shinyApp(ui, server)

数据文件:

popupcontent;label;lat;lng          
Location 1;Location Label 1;52.2572126;20.9845778   
Location 2;Location Label 2;52.2423875;21.0244197   
Location 3;Location Label 3;52.238209;21.0202826    
Location 4;Location Label 4;52.23048060000001;21.0108891
Location 5;Location Label 5;52.231755;21.006482 
Location 6;Location Label 6;52.2376719;21.0158829A7 
Location 7;Location Label 7;52.2540379;21.0347079   
Location 8;Location Label 8;52.2550605;21.052299    
Location 9;Location Label 9;52.247861;21.049922 
Location 10;Location Label 10;52.2720819;21.0151038
Location 11;Location Label 11;52.2582368;21.0396915
Location 12;Location Label 12;52.2569792;21.0294134
Location 13;Location Label 13;52.2549106;21.0475752
Location 14;Location Label 14;52.206521;20.999852   
Location 15;Location Label 15;52.2937449;21.0333861
Location 16;Location Label 16;52.2878479;21.0412171
Location 17;Location Label 17;52.305039;21.0584014  

最佳答案

我所做的一些评论和更改:

  • 使用单个 observeEvent() 观察按钮点击并更新 map
  • 添加了 update_google_map() 以在每次搜索路线时清除和更新 map '
  • Google API 可以处理空航点,因此不需要额外的错误处理

library(shiny)
library(googleway)

ui <- navbarPage("APP NAME", position = c("static-top"),tabPanel("MAP",
               google_mapOutput(outputId = "mapWarsaw"),
               textInput(inputId = "origin", label = "Departure point"),
               textInput(inputId = "waypoint", label = "Waypoint 1"),
               textInput(inputId = "waypoint2", label = "Waypoint 2"),
               textInput(inputId = "destination", label = "Destination point"),
               actionButton(inputId = "getRoute", label = "Get Route")
)
)

server <- function(input, output, session) {

  map_key <- "MAP_KEY"
  api_key <- "API_KEY"

  output$mapWarsaw <- renderGoogle_map({
    google_map(key = map_key, 
               search_box = TRUE, 
               scale_control = TRUE, 
               height = 1000) %>%
      add_traffic()
  })

  observeEvent(input$getRoute,{

    print("getting route")

    o <- input$origin
    w <- input$waypoint
    q <- input$waypoint2
    d <- input$destination

    res <- google_directions(key = api_key,
                             origin = o,
                             waypoints = list(stop = w,
                                              stop = q),
                             destination = d,
                             optimise_waypoints = TRUE,
                             mode = "driving")

    df_route <- data.frame(route = res$routes$overview_polyline$points)

    df_way <- cbind(
      res$routes$legs[[1]]$end_location,
      data.frame(address = res$routes$legs[[1]]$end_address)
    )

    df_way$order <- as.character(1:nrow(df_way))

    google_map_update(map_id = "mapWarsaw") %>%
      clear_traffic() %>%
      clear_polylines() %>%
      clear_markers() %>%
      add_traffic() %>%
      add_polylines(data = df_route,
                    polyline = "route",
                    stroke_colour = "#FF33D6",
                    stroke_weight = 7,
                    stroke_opacity = 0.7,
                    info_window = "New route",
                    load_interval = 100) %>%
      add_markers(data = df_way,
                  info_window = "end_address",
                  label = "order")
  })
}


shinyApp(ui, server)

enter image description here

关于r - 在 Shiny 应用程序中使用 googleway 绘制航点路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49473094/

相关文章:

r - 在 Shiny 应用程序的右侧嵌入图像 Logo

R Shinydashboard 为状态参数添加自定义颜色

r - 自动 - "Convert numbers stored as text to numbers"

regex - 在 R 中,使用正则表达式匹配多个模式并将新列添加到列表

从 aheatmap 和 heatmaply (heatmapr) 中删除行标签

R 列表的交集

javascript - 使用 Google Maps Javascript API v3 数据层设置多个 GeoJson 文件的样式

java - 如何在android中的谷歌地图上使用多个航路点在起始位置和结束位置之间绘制路径?

javascript - 使用 CoffeeScript 进行位置自动完成后无法从 getPlace 获取值

r - Shiny 的无功输入和 "Go"按钮