【问题标题】:Shiny Leaflet - Highlight polygonShiny Leaflet - 高亮多边形
【发布时间】:2017-07-03 20:57:28
【问题描述】:

我有一个简单的闪亮应用程序,只有一个列出阿富汗地区的下拉列表和一个相同的传单地图。

可以通过link 访问形状文件 - 使用来自http://www.gadm.org/download 的 AFG_adm2.shp

这是应用程序代码:

library(shiny)
library(leaflet)
library(rgdal)
library(sp)

afg <- readOGR(dsn = "data", layer ="AFG_adm2", verbose = FALSE, stringsAsFactors = FALSE)

ui <- fluidPage(
    titlePanel("Test App"),
    selectInput("yours", choices = c("",afg$NAME_2), label = "Select Country:"),
    leafletOutput("mymap")

)

server <- function(input, output){
  output$mymap <- renderLeaflet({
    leaflet(afg) %>% #addTiles() %>%
       addPolylines(stroke=TRUE, color = "#00000", weight = 1) 
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

我想要这样的功能:当我从下拉列表中选择一个地区时,该地区的边框填充会发生变化,并且 setView 函数会将该地区置于焦点。有人可以帮我写代码吗?我看过this 的帖子,但不太明白。

【问题讨论】:

    标签: r shiny leaflet


    【解决方案1】:

    当用户选择一个地区时,您可以使用leafletProxy 更改地图。您可以在之前绘制的多边形之上添加一个稍厚的红色多边形以突出显示它,并使用setView 移动视图。

    这是我要补充的:

    proxy <- leafletProxy("mymap")
    
      observe({
        if(input$yours!=""){
          #get the selected polygon and extract the label point 
          selected_polygon <- subset(afg,afg$NAME_2==input$yours)
          polygon_labelPt <- selected_polygon@polygons[[1]]@labpt
    
          #remove any previously highlighted polygon
          proxy %>% removeShape("highlighted_polygon")
    
          #center the view on the polygon 
          proxy %>% setView(lng=polygon_labelPt[1],lat=polygon_labelPt[2],zoom=7)
    
          #add a slightly thicker red polygon on top of the selected one
          proxy %>% addPolylines(stroke=TRUE, weight = 2,color="red",data=selected_polygon,group="highlighted_polygon")
        }
      })
    }
    

    【讨论】:

    • 有效,但仅适用于可重现的示例...声明“polygon_labelPt”时出现错误。你能向我解释一下,以便我修改它吗?我不明白那行代码:polygon_labelPt &lt;- selected_polygon@polygons[[1]]@labpt
    • 好的,在调试时, selected_polygon@polygons 返回一个空列表。因此,即使调用 selected_polygon@polygons[[1]] 也会返回下标越界错误。 selected_polygon@bbox 似乎有 2 组纬度,但很长。我们可以使用它们吗?
    • 第一行selected_polygon 子集afg 数据以提取名称与用户选择的内容相对应的多边形。然后polygon_labelPt 提取数据框的第一个多边形 (selected_polygon@polygons[[1]]),然后提取 labpt (@labpt)。 labpt 是应该标记多边形的位置。
    • 您可以尝试将addPolylines中的layerId更改为group
    • 太棒了!这样可行!此外,将 removeShape 更改为 clearGroup 以删除选定的组/多边形。
    猜你喜欢
    • 2019-03-15
    • 2023-02-07
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多