求基于R/Shiny的交互式地图示例代码:支持下拉选美国州缩放
在R Shiny中实现带州缩放功能的交互式Choropleth地图
嘿,我刚好做过类似的需求,给你一个完整的可运行示例代码,用leaflet配合Shiny来实现——不仅能展示美国各州的Choropleth地图,还支持通过下拉菜单选择州后自动缩放至对应区域。
需要用到的包
首先确保你安装了这些包:
install.packages(c("shiny", "leaflet", "sf", "tigris"))
完整示例代码
library(shiny) library(leaflet) library(sf) library(tigris) # 获取美国州的地理数据(设置cb=TRUE获取简化版边界,加载更快) us_states <- states(cb = TRUE, class = "sf") # 给每个州加一个示例数值(这里用面积,你可以替换成自己的数据) us_states$area_sqmi <- st_area(us_states) %>% as.numeric() / 2589988.110336 ui <- fluidPage( titlePanel("美国州交互式Choropleth地图"), sidebarLayout( sidebarPanel( # 下拉菜单:选择美国州 selectInput( inputId = "state_select", label = "选择州:", choices = c("全部" = "all", sort(us_states$NAME)), selected = "全部" ) ), mainPanel( leafletOutput("state_map", height = "800px") ) ) ) server <- function(input, output, session) { # 渲染初始地图 output$state_map <- renderLeaflet({ leaflet() %>% addProviderTiles("CartoDB.Positron") %>% addPolygons( data = us_states, fillColor = ~colorQuantile("YlOrRd", area_sqmi)(area_sqmi), fillOpacity = 0.7, color = "#BDBDC3", weight = 1, popup = ~paste0("<strong>", NAME, "</strong><br>面积: ", round(area_sqmi, 0), " 平方英里") ) }) # 监听下拉菜单变化,更新地图视图 observeEvent(input$state_select, { if (input$state_select == "all") { # 回到全国视图 leafletProxy("state_map") %>% fitBounds( lng1 = -125, lat1 = 25, lng2 = -66, lat2 = 49 ) } else { # 过滤选中的州数据 selected_state <- us_states[us_states$NAME == input$state_select, ] # 获取该州的边界框 bbox <- st_bbox(selected_state) # 缩放至该州区域 leafletProxy("state_map") %>% fitBounds( lng1 = bbox[["xmin"]], lat1 = bbox[["ymin"]], lng2 = bbox[["xmax"]], lat2 = bbox[["ymax"]] ) } }) } shinyApp(ui, server)
关键功能解释
- 地理数据获取:用
tigris::states()直接获取官方的美国州边界数据,cb=TRUE参数获取简化版边界,加载更流畅。 - Choropleth设置:用
colorQuantile根据州面积生成颜色梯度,你可以替换成自己的业务数据(比如人口、收入等)。 - 自动缩放逻辑:通过
observeEvent监听下拉菜单的选择变化,当选中某个州时,用st_bbox获取该州的边界坐标,再通过leafletProxy更新地图的视图范围,实现精准缩放;选择“全部”时回到全国视图。 - 交互弹窗:点击州区域会显示州名和面积信息,提升用户体验。
你可以直接运行这段代码,然后根据自己的需求修改数据和样式哦!
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

