放大到州以使用R Leaflet查看ZipCode

muk1a3rh  于 2023-03-05  发布在  其他
关注(0)|答案(4)|浏览(137)

我正在使用R leaftlet软件包来创建一个交互式的美国地区分布图。
有几个在线教程,我能够创建与弹出窗口和缩放交互式国家级Map。我也能够创建一个单独的邮政编码级Map再次与弹出窗口。
我想在一张Map上同时显示两个视图,但在放大一个州或双击一个州时,要显示邮政编码。例如如果我双击纽约,将打开纽约邮政编码。R中是否有软件包/函数可以帮助我做到这一点?
下面是这两个的静态截图,以明确我计划集成的内容。

n8ghc7c1

n8ghc7c11#

我同意Yehoshapat Schellekens的观点,在R中,一个人可能没有Web编程语言的灵活性。但很少有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)以实现完全匹配。

3qpi33ja

3qpi33ja2#

我已经用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

第一个输出是州级别Map,使用这段代码,当您单击感兴趣的州时,将创建一个click对象,该对象具有对应于该州名称的click$id(在addPolygons调用中的layerId定义中建立)。以click$id作为所选状态名称,然后,您可以按州划分县级多边形的子集,并将其绘制为Map。
设计这张Map的选择是无穷无尽的,真的。希望这对你有帮助!

bfnvny8b

bfnvny8b3#

你不能通过R创建这个,你需要通过好的旧java脚本运行这个,特别是传单。
请记住,R并不运行map,它所做的只是创建一个HTML文件的java-script模板,Web浏览器将运行其余部分(不是R解释器)
您正在寻找的专业词汇是事件绑定,单击它将触发缩放您的原始美国Map,并打开一个带有邮政编码的州的新Map。
一般说明(这是所有的java脚本,没有R!):
转到http://leafletjs.com/reference.html并查找事件,您需要 dblclick 事件。
然后,您需要创建一个打开新Map的函数。
请记住,如果你想做复杂的事情,R会给予你非常有限的解决方案,所以我的建议是,当你需要漂亮的JavaScript可视化时,直接去源代码:)

5w9g7ksd

5w9g7ksd4#

你的需求需要大量的定制。如果你擅长JavaScript,只需选择geojson2svg,它提供了很大的灵活性。基本上它将GeoJSON转换为SVG,这就是你可以用普通HTML和JavaScript实现的全部内容。下面是一些examples

相关问题