【问题标题】:Calculate distance from clicked point on leaflet map in R Shiny计算R Shiny传单地图上点击点的距离
【发布时间】:2021-09-22 13:11:24
【问题描述】:

我只是从 R/Shiny 开始。在本练习中,我试图计算从传单地图上的点击点到数据框中其他点的距离。我需要得到的最终输出是从单击点到 sample_points 数据框中每个经纬度对的距离。我能够获得点击点的反应经纬度值,但不能获得距离测量值。请参阅下面的 app.R 代码。任何建议表示赞赏。

library(shiny)
library(shinydashboard)
library(dplyr)
library(leaflet)
library(geodist)

# Sample points
sample_lat <- c(40.1, 40.2, 40.3, 40.4, 40.5)
sample_long <- c(-89.1, -89.2, -89.3, -88.9, -88.8)
sample_points <-
  data.frame(Latitude = sample_lat, Longitude = sample_long)

ui <- dashboardPage(dashboardHeader(),
                    
                    dashboardSidebar(),
                    
                    dashboardBody(fluidRow(
                      box(width = NULL,
                          leafletOutput("map", height = 500)),
                      box(width = NULL,
                          tableOutput("location")),
                      box(width = NULL,
                          renderDataTable("distance"))
                    )))

server <- function(input, output) {
  # Map output
  output$map <- renderLeaflet({
    leaflet() %>%
      addTiles() %>%
      setView(-89.0, 40.5, zoom = 9)
  })
  
  click_values <- reactiveValues(clat = NULL,
                                 clng = NULL)
  # Click event
  observeEvent(input$map_click, {
    click <- input$map_click
    click_values$clat <- click$lat
    click_values$clng <- click$lng
    leafletProxy('map') %>%
      clearMarkers() %>%
      addMarkers(lng = click_values$clng,
                 lat = click_values$clat)
  })
  
  clicked_point <-
    reactive({
      df = data.frame(Long = click_values$clng,
                      Lat = click_values$clat)
    })
  
  output$location <- renderTable({
    clicked_point()
  })
  
  # Calculated distance from the clicked point
  
  output$distance <- renderDataTable({
    sample_points %>%
      mutate(
        dist = geodist::geodist_vec(
          x1 = sample_points$Longitude,
          y1 = sample_points$Latitude,
          x2 = clicked_point$Long,
          y2 = clicked_point$Lat,
          paired = TRUE,
          measure = "haversine"
        )
      ) %>%
      mutate(dist_mi = dist / 1609) %>%
      select(-dist)
  })
  
}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny leaflet distance reactive


    【解决方案1】:

    ui 中,您应该使用dataTableOutput("distance"),而不是renderDataTable()。这就是output$distance &lt;- renderDataTable({...}) 没有被执行的原因。

    然后在output$distance 中,您忘记调用clicked_point 作为响应式。例如,它应该是clicked_point()$Long。并且为避免在首次加载时出现错误显示,您需要检查clicked_point 是否已经有有效值。

    output$distance <- renderDataTable({
    if(nrow(clicked_point()) == 0)
      return()
    sample_points %>%
    ...
    })
    

    我之前建议使用req() 来检查clicked_point() 是否包含有效值,但是req()isTruthy() 对于空的data.frames 返回TRUE。

    【讨论】:

    • 以下是我在进行建议更改时收到的警告/错误消息。此外,只有第一对经纬对的距离计算正确,而其他 4 对的数字被夸大了。关于这里发生的事情的任何想法。警告:错误:mutate()dist 有问题。我dist = geodist::geodist_vec(...)。 x geodist_vec 只接受向量输入 113: 关于如何进行向量转换的任何想法。我尝试使用 as.vector 函数,但它似乎不起作用。
    • 应用加载时会出现该错误,因为 clicked_point() 包含一个零行的 data.frame。所以当clicked_point()mutate 中使用时,没有值可以使用。我将编辑我的答案。
    • 开始检查零行可防止错误出现,但坐标对 2 到 5 的错误距离计算问题仍然存在。有什么想法吗?
    • 看来我需要在geodist_vec 函数中使用paired = FALSE 选项。现在计算正确的距离。由于名气不足,无法投票。 @rbasa,谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2018-01-13
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多