Zooming into State to view ZipCode using R Leaflet

问题描述 投票:0回答:4

我正在使用 R 传单包来创建美国的交互式等值线

网上有几个教程,我可以创建带有弹出窗口和缩放功能的交互式州级地图。此外,我还能够使用弹出窗口再次创建一个单独的邮政编码级别地图。

我希望在一张地图中显示两个视图,但在我放大一个州或双击一个州时让邮政编码可见。就像如果我双击纽约,纽约邮政编码就会打开。 R 中是否有一个包/函数可以帮助我做到这一点?

以下是两者的静态屏幕截图,以明确我计划集成的内容。

r leaflet geojson
4个回答
6
投票

我同意 Yehoshapat Schellekens 的观点,在 R 中可能没有网络编程语言的灵活性。但很少有 R 不够灵活,无法实现精美的结果! :) 这里有一个基本需要的“香草”示例。您可以使用一些 JS 自定义弹出窗口。

library(shiny)
library(leaflet)
library(maps)
library(maptools)
library(sp)
library(rgeos)

mapStates = map("state", fill = TRUE, plot = FALSE)
mapCounty = map("county", fill = TRUE, plot = FALSE)

shinyApp(
  ui = fluidPage(leafletOutput('myMap'),
             br(),
             leafletOutput('myMap2')),

  server <- function(input, output, session) {
      output$myMap <- renderLeaflet({
        leaflet() %>%
          addProviderTiles("Stamen.TonerLite",
                           options = providerTileOptions(noWrap = TRUE)) %>%
          addPolygons(lng = mapStates$x, 
                      lat = mapStates$y, 
                      fillColor = topo.colors(10, alpha = NULL), 
                      stroke = FALSE)
  })
 
  observeEvent(input$myMap_shape_click, {
        click <- input$myMap_shape_click
        if(is.null(click))
          return()       
    
    lat <- click$lat
    lon <- click$lng

    coords <- as.data.frame(cbind(lon, lat))
    point <- SpatialPoints(coords)
    mapStates_sp <- map2SpatialPolygons(mapStates, IDs = mapStates$names)
    i <- point [mapStates_sp, ]
    selected <- mapStates_sp [i]
    mapCounty_sp <- map2SpatialPolygons(mapCounty, IDs = mapCounty$names)
    z <- over(mapCounty_sp, selected)
    r <- mapCounty_sp[(!is.na(z))] 

    output$myMap2 <- renderLeaflet({
        leaflet() %>% 
          addProviderTiles("Stamen.TonerLite",
                       options = providerTileOptions(noWrap = TRUE)) %>%
          addPolygons(data=r,
                      fillColor = topo.colors(10, alpha = NULL), 
                      stroke = FALSE)
    })  
  })
})

注意:示例中使用的数据集似乎具有不同的准确度(州和县的不完全重叠)。因此,空间匹配所占的县比预期的多(那些在州内加上那些与州边界相交的县)。使用名称作为 ID(参数

layerId
)来实现完美匹配。


3
投票

我使用 G. Cocca 的代码创建了相同类型的应用程序,经过几个月的反复摆弄,我想出了一个更优雅的解决方案来解决您的问题。为了简单的再现性,我使用卢旺达 shapefile 作为示例(因为它们比 GADM 的美国 shapefile 小得多,但您总是可以用您自己的美国 shapefile 替换它们)。

library(raster)
library(shiny)
library(leaflet)
library(RColorBrewer)

#load in shapefiles for state and county level 
states <- getData("GADM", country = "rwa", level = 1)
counties <- getData("GADM", country = "rwa", level = 2)

#define color palettes for states
pal <- brewer.pal(8, "Dark2")
statePal <- colorFactor(pal, states@data$NAME_1)


shinyApp(

  ui = fluidPage(
    leafletOutput('myMap', width = "100%"), 
    br(), 
    leafletOutput("myMap2", width = "100%")
  ), #END UI

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

    #default state level map output
    output$myMap <- renderLeaflet({
      leaflet() %>% 
        addTiles() %>% 
        addPolygons(data = states, 
                    fillColor = ~statePal(states@data$NAME_1), 
                    fillOpacity = 1, 
                    color = "white", 
                    stroke = T, 
                    weight = 1, 
                    layerId = states@data$NAME_1) #this sets the click id, very important! 
    }) #END RENDERLEAFLET OUTPUT

    observeEvent(input$myMap_shape_click, {

      #define click object
      click <- input$myMap_shape_click

      #subset counties shapefile so that only counties from the clicked state are mapped
      selected <- counties[counties$NAME_1 == click$id,]

      #define color palette for counties 
      countyPal <- colorFactor(pal, selected@data$NAME_2)

      #if click id isn't null (i.e. if ANY polygon is clicked on), draw map of counties
      if(!is.null(click$id)){
        output$myMap2 <- renderLeaflet({
          leaflet() %>% 
            addTiles() %>% 
            addPolygons(data = selected, 
                        fillColor = ~countyPal(selected@data$NAME_2), 
                        fillOpacity = 1, 
                        color = "white", 
                        stroke = T, 
                        weight = 1)
        }) #END RENDERLEAFLET
      } #END CONDITIONAL
    }) #END OBSERVE EVENT 
  }) #END SHINYAPP

第一个输出是你的州级地图。使用此代码,当您单击感兴趣的状态时,将创建一个单击对象,该对象具有对应于该状态名称的

click$id
(在
layerId
调用的
addPolygons
定义中建立)。使用
click$id
作为选定的州名称,然后您可以按该州对县级多边形进行子集化并将其绘制为地图。

设计这张地图的选项真的是无穷无尽的。希望这可以帮助!


2
投票

您无法通过 R 创建它,您需要通过良好的旧 java 脚本运行它,特别是传单。

请记住,R 不运行地图,它所做的只是创建 HTML 文件的 java 脚本模板,您的 Web 浏览器运行其余部分(不是 R 解释器)

您正在寻找的专业术语是事件绑定,只需单击一下即可触发放大您的原始美国地图,并打开带有邮政编码的州的新地图。

一般说明(这都是 java 脚本,没有 R!):

转到 http://leafletjs.com/reference.html 并找到事件,您需要 dblclick 事件。

然后你需要创建一个打开新地图的函数。

记住,如果你想做复杂的事情,R 会给你非常有限的解决方案,所以我的建议是当你需要漂亮的 java 脚本可视化时,直接去源代码:)


1
投票

您的要求需要大量定制。如果您精通 JavaScript,只需检查 geojson2svg 即可,它提供了很大的灵活性。基本上它将 GeoJSON 转换为 SVG,这就是您可以使用纯 HTML 和 JavaScript 实现的所有内容。这里有一些例子.

© www.soinside.com 2019 - 2024. All rights reserved.