我正在创建一个shiny 的应用程序,显示华盛顿州贝灵汉周围公共果树的位置.到目前为止,我已经做到了,所以用户可以输入经度/经度坐标和树类型,并在 map 上绘制位置.最终,我想做它,这样用户就可以点击交互式 map 视图,并添加一个点到 map .我甚至不知道这是否可能,如果可能,如何创建这一功能.我从我的应用程序中添加了一些代码.

library(dplyr)
library(shiny)
library(leaflet)
library(tmap)
library(sf)




dat <- data.frame(lat = c(48.7323,48.7308,
                          48.7301,48.7276,
                         48.7246,48.7323,
                          48.7211),
                  long = c(-122.4928,-122.4940,
                           -122.4942,-122.4939,
                           -122.4958,-122.4975,
                           -122.4946),
                  species = c("Apple", "Apple",
                              "Pear", "Plum",
                              "Fig", "Plum",
                              "Pear"),
                  status = rep("Confirmed",7))



ui <- fluidPage(

  titlePanel("Public Fruit Trees"),

  sidebarLayout(
    sidebarPanel(
      numericInput(inputId = "lat",
                   label = "Latitude DD",
                   value = 48.7211,step = 1e-3),
      numericInput(inputId = "long",
                   label = "Longitude DD",
                   value=-122.4942,step = 1e-3),
      selectInput(inputId = "species", label = "Species",
                  choices = c("Apple","Pear","Fig","Peach","Other")),
      actionButton(inputId = "addObservation",
                   label = "Add tree to database")
    ),
    mainPanel(
      
      tmapOutput(outputId = "tmapMap"),
      
      DT::dataTableOutput("updatedData"),
    )
  )
)

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

  
  theData <- reactiveValues()
  theData$dat <- dat

 
  output$tmapMap <- renderTmap({
    dat2plot <- theData$dat
    
    dat2plot <- st_as_sf(dat2plot, coords = c("long","lat"), crs=st_crs("EPSG:4326"))

    map1 <- tm_shape(dat2plot) +
      tm_dots(col= "species", alpha=0.8,size = 0.1) +
      tm_legend(show = TRUE) +
      tm_view(set.zoom.limits = c(14,16))
    map1
  })

  observeEvent(input$addObservation,{
    to_add <- data.frame(lat = input$lat,
                         long = input$long,
                         species = input$species,
                         status = "Uncomfirmed"
    )
    theData$dat <- rbind(theData$dat,to_add) # adding new data
  })

  output$updatedData <- DT::renderDataTable(
    theData$dat
  )

}


shinyApp(ui = ui, server = server)

就像我之前说的,我在想这是否可能.有没有什么功能可以观察 map 上的点击,然后返回经度/经度坐标,允许我将这些添加到数据集中?谢谢!

推荐答案

这是可以做到的,你正在正确的道路上go 做它.该映射是一个单叶映射,并且有与其相关联的事件列表器,类似于使用LNG和最新的单击坐标来更新输入的On Click事件.

只需将此行添加到您的应用程序服务器,当您单击lnglat输入时,将使用所单击位置的坐标进行更新.

observeEvent(input$tmapMap_click, {
    updateNumericInput(
      inputId = "long",
      value = input$tmapMap_click$lng
    )
    
    updateNumericInput(
      inputId = "lat",
      value = input$tmapMap_click$lat
    )
  })

要阅读有关这方面的更多信息,请查看leaflet with shiny documentation

R相关问答推荐

将模拟变量乘以多个观测结果中的模拟变量

将复杂的组合列表转换为数据框架

隐藏e_mark_line的工具提示

如何将dygraph调用到R Markdown作为一个shiny 的react 对象的参数?

根据多个条件增加y轴高度以适应geom_text标签

如何计算多个日期是否在一个日期范围内

使用R闪光显示所有数据点作为默认设置

R:从geom_ol()中删除轮廓并导出为pdf

R Read.table函数无法对制表符分隔的数据正常工作

派生程序包| ;无法检索';return()';的正文

从多个可选列中选取一个值到一个新列中

R如何将列名转换为更好的年和月格式

如何在R中使用hmm TMB提前一步预测观察到的状态?

为什么在写入CSV文件时Purrr::Pwalk不起作用

如何在使用因子时获得Sankey图的Scale_Fill_Viridis的全范围

对R中的列表列执行ROW Mean操作

GOGPLATE geom_boxploy色彩疯狂

在使用ggplot2的情况下,如何在使用coord_trans函数的同时,根据未转换的坐标比来定位geom_瓷砖?

GgHighlight找不到它创建的列:`Highlight..1`->;`Highlight.....`

通过分析特定列中的字符串在数据框中创建新的行和列