【问题标题】:Add mouse coordinates in Shiny Application在 Shiny 应用程序中添加鼠标坐标
【发布时间】:2018-07-19 23:07:35
【问题描述】:

我正在开发一个闪亮的应用程序,其中用户单击地图(传单地图)并基于该单击执行某些操作,例如在单击的点周围画一个半径为一公里的圆。此功能工作正常。但是我想通过使用mapview 包中的addMouseCoordinates() 函数来添加鼠标坐标。我过去用过这个没有问题。但是使用以下代码,我无法看到坐标。

leafletProxy('incidentmap') %>%
      addCircles(lng=clng, lat=clat, group='circles',
                 weight=1, radius=input$radius, color='black', fillColor='green',
                 fillOpacity=0.2, opacity=1)%>%
      addCircles(lng=filtered$Long,lat=filtered$Lat)%>%
      addMouseCoordinates(style = "basic")

现在如果我点击地图,应用程序会崩溃并出现以下错误:

> Warning: Error in : inherits(map, "leaflet") is not TRUE Stack trace
> (innermost first):
>     75: stopifnot
>     74: addMouseCoordinates
>     73: function_list[[k]]
>     72: withVisible
>     71: freduce
>     70: _fseq
>     69: eval
>     68: eval
>     67: withVisible
>     66: %>%
>     65: observeEventHandler [/Users/dhirajkhanna/Desktop/CallAnalysis/CDR/server.R#39]
>      1: runApp ERROR: [on_request_read] connection reset by peer

它和leafletProxy() 有关系吗? 帮助将不胜感激。

这是一个可重现的例子:

library(shiny)
library(mapview)
library(leaflet)

ui <- fluidPage(
  leafletOutput("incidentmap")
)

server <- function(input,output,session){
  output$incidentmap <- renderLeaflet({
    leaflet() %>%
      setView(lng = 77.9568288, lat = 27.1696145, zoom=11) %>%
      addTiles(options = providerTileOptions(noWrap = TRUE))
  })
    ## Observe mouse clicks and add circles
    observeEvent(input$incidentmap_click, {
      click <- input$incidentmap_click
      clat <- click$lat
      clng <- click$lng

      leafletProxy('incidentmap') %>%
        addCircles(lng=clng, lat=clat, group='circles',
                   weight=1, radius=1000, color='black', fillColor='green',
                   fillOpacity=0.2, opacity=1)%>%
                   addMouseCoordinates(style = "basic")
  })
}

shinyApp(ui,server)

【问题讨论】:

  • 请考虑在您的问题中添加一个可重现的示例,这样更容易提供帮助。有关如何做到这一点的一些提示,请参阅here
  • 感谢@Florian 指出这一点。现在已经包含了一个可重现的示例。

标签: r shiny leaflet


【解决方案1】:

当您将 addMouseCoordinates 调用移动到设置地图的位置(您定义 output$incidentmap 的位置)时,它会起作用

library(shiny)
library(mapview)
library(leaflet)

ui <- fluidPage(
  leafletOutput("incidentmap")
)

server <- function(input,output,session){
  output$incidentmap <- renderLeaflet({
    leaflet() %>%
      setView(lng = 77.9568288, lat = 27.1696145, zoom=11) %>%
      addTiles(options = providerTileOptions(noWrap = TRUE)) %>%
      addMouseCoordinates(style = "basic")
  })
  ## Observe mouse clicks and add circles
  observeEvent(input$incidentmap_click, {
    click <- input$incidentmap_click
    clat <- click$lat
    clng <- click$lng

    leafletProxy('incidentmap') %>%
      addCircles(lng=clng, lat=clat, group='circles',
                 weight=1, radius=1000, color='black', fillColor='green',
                 fillOpacity=0.2, opacity=1)
  })
}

shinyApp(ui,server)

【讨论】:

  • 正是我想要的!谢谢@TimSalabim
【解决方案2】:

这是一种满足您需求的尝试。你可以很容易地改进它..

library(leaflet)
library(mapview)
library(shiny)

ui <- fluidPage(
  leafletOutput("map1")
)

server <- function(input, output, session) {
  output$map1 <- renderLeaflet({
    leaflet() %>%  addTiles() 
  })

  observeEvent(input$map1_click, {

    click <- input$map1_click
    clat <- click$lat
    clng <- click$lng
    content <- paste(sep = "<br/>",
                     "<b>",clat, "</b>",
                     "<b>", clng, "</b>"    )
    leafletProxy('map1') %>% 
      addCircles(lng=clng, lat=clat, group='circles',
                 weight=1, radius=100, color='black', fillColor='orange',
                 fillOpacity=0.5, opacity=1)  %>% 
      addPopups(lng = clng, lat = clat, content)

  })
}
shinyApp(ui, server)

【讨论】:

  • 感谢@MrSmithGoesToWashington,但不完全是。您的代码将显示已点击地点的纬度。然而,用户通常已经拥有他们希望点击的地方的纬度。因此,他们需要将鼠标悬停到该位置,然后单击。
  • 抱歉,从您的问题中我并不清楚。您所说的“用户通常拥有该地方的纬度......”是什么意思?它是否显示在您的可复制示例中?
  • 用户口头接收一个点的位置,并且必须使用鼠标悬停到地图上的该位置并单击。不可能通过一个例子来说明这一点。
猜你喜欢
  • 1970-01-01
  • 2013-12-06
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
相关资源
最近更新 更多