我正在使用 R 传单包来创建美国的交互式等值线
网上有几个教程,我可以创建带有弹出窗口和缩放功能的交互式州级地图。此外,我还能够使用弹出窗口再次创建一个单独的邮政编码级别地图。
我希望在一张地图中显示两个视图,但在我放大一个州或双击一个州时让邮政编码可见。就像如果我双击纽约,纽约邮政编码就会打开。 R 中是否有一个包/函数可以帮助我做到这一点?
以下是两者的静态屏幕截图,以明确我计划集成的内容。
我同意 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
)来实现完美匹配。
我使用 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
作为选定的州名称,然后您可以按该州对县级多边形进行子集化并将其绘制为地图。
设计这张地图的选项真的是无穷无尽的。希望这可以帮助!
您无法通过 R 创建它,您需要通过良好的旧 java 脚本运行它,特别是传单。
请记住,R 不运行地图,它所做的只是创建 HTML 文件的 java 脚本模板,您的 Web 浏览器运行其余部分(不是 R 解释器)
您正在寻找的专业术语是事件绑定,只需单击一下即可触发放大您的原始美国地图,并打开带有邮政编码的州的新地图。
一般说明(这都是 java 脚本,没有 R!):
转到 http://leafletjs.com/reference.html 并找到事件,您需要 dblclick 事件。
然后你需要创建一个打开新地图的函数。
记住,如果你想做复杂的事情,R 会给你非常有限的解决方案,所以我的建议是当你需要漂亮的 java 脚本可视化时,直接去源代码:)
您的要求需要大量定制。如果您精通 JavaScript,只需检查 geojson2svg 即可,它提供了很大的灵活性。基本上它将 GeoJSON 转换为 SVG,这就是您可以使用纯 HTML 和 JavaScript 实现的所有内容。这里有一些例子.