我正在使用R leaftlet包创建一个美国互动的等值线
在线有几个教程,我可以创建带弹出窗口和缩放的交互式州级地图.此外,我还能够使用弹出窗口再次创建单独的邮政编码级别地图.
我想在一个地图本身的两个视图,但在我放大状态或双击状态时使邮政编码可见.如果我双击纽约,纽约邮政编码就会打开.R中有包/功能可以帮我这么做吗?
以下是两者的静态屏幕截图,以明确我计划集成的内容.
小智 5
我同意Yehoshapat Schellekens的说法,在R中,可能没有网络编程语言的灵活性.但很少R不够灵活,无法获得花哨的结果!:)在这里,您将了解一个基本需要的"香草"示例.您可以使用一些JS自定义Windows弹出窗口.
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)
})
})
})
Run Code Online (Sandbox Code Playgroud)
注意:示例中使用的数据集似乎具有不同的精度(对于州和县而言不是完美重叠).因此,空间匹配占了比预期更多的县(那些内部加上与州界相交的那些).使用名称作为ID来实现完美匹配.
您无法通过 R 创建它,您需要通过旧的 java 脚本(特别是传单)来运行它。
请记住,R 不运行地图,它所做的只是创建 HTML 文件的 java 脚本模板,您的 Web 浏览器运行其余部分(不是 R 解释器)
您正在寻找的专业词是“事件绑定”,只需单击一下即可触发放大您的原始美国地图,并打开一个带有邮政编码的州的新地图。
一般说明(这都是 java 脚本,没有 R!):
访问http://leafletjs.com/reference.html并找到事件,您需要dblclick事件。
然后您需要创建一个打开新地图的函数。
请记住,如果您想做复杂的事情,R 将为您提供非常有限的解决方案,所以我的建议是,当您需要漂亮的 Java 脚本可视化时,只需直接访问源代码:)