我正在使用R leaftlet软件包来创建一个交互式的美国地区分布图。有几个在线教程,我能够创建与弹出窗口和缩放交互式国家级Map。我也能够创建一个单独的邮政编码级Map再次与弹出窗口。我想在一张Map上同时显示两个视图,但在放大一个州或双击一个州时,要显示邮政编码。例如如果我双击纽约,将打开纽约邮政编码。R中是否有软件包/函数可以帮助我做到这一点?下面是这两个的静态截图,以明确我计划集成的内容。
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)以实现完全匹配。
layerId
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的选择是无穷无尽的,真的。希望这对你有帮助!
click$id
addPolygons
bfnvny8b3#
你不能通过R创建这个,你需要通过好的旧java脚本运行这个,特别是传单。请记住,R并不运行map,它所做的只是创建一个HTML文件的java-script模板,Web浏览器将运行其余部分(不是R解释器)您正在寻找的专业词汇是事件绑定,单击它将触发缩放您的原始美国Map,并打开一个带有邮政编码的州的新Map。一般说明(这是所有的java脚本,没有R!):转到http://leafletjs.com/reference.html并查找事件,您需要 dblclick 事件。然后,您需要创建一个打开新Map的函数。请记住,如果你想做复杂的事情,R会给予你非常有限的解决方案,所以我的建议是,当你需要漂亮的JavaScript可视化时,直接去源代码:)
5w9g7ksd4#
你的需求需要大量的定制。如果你擅长JavaScript,只需选择geojson2svg,它提供了很大的灵活性。基本上它将GeoJSON转换为SVG,这就是你可以用普通HTML和JavaScript实现的全部内容。下面是一些examples。
4条答案
按热度按时间n8ghc7c11#
我同意Yehoshapat Schellekens的观点,在R中,一个人可能没有Web编程语言的灵活性。但很少有R没有足够的灵活性来实现花哨的结果!:)这里有一个你基本需要的“香草”示例。你可以用一些JS定制窗口弹出窗口。
注意:示例中使用的数据集似乎具有不同的准确性(州和县之间的重叠不完全)。因此,空间匹配考虑的县比预期的多(州边界内的县加上与州边界相交的县)。请改用名称作为ID(参数
layerId
)以实现完全匹配。3qpi33ja2#
我已经用G. Cocca的代码创建了一个相同类型的应用程序,经过几个月的反复修改,我想出了一个更优雅的解决方案。为了简单的可重复性,我用卢旺达的shapefile作为例子(因为它们比GADM的美国shapefile小得多,但你总是可以用你自己的美国shapefile替换它们)。
第一个输出是州级别Map,使用这段代码,当您单击感兴趣的州时,将创建一个click对象,该对象具有对应于该州名称的
click$id
(在addPolygons
调用中的layerId
定义中建立)。以click$id
作为所选状态名称,然后,您可以按州划分县级多边形的子集,并将其绘制为Map。设计这张Map的选择是无穷无尽的,真的。希望这对你有帮助!
bfnvny8b3#
你不能通过R创建这个,你需要通过好的旧java脚本运行这个,特别是传单。
请记住,R并不运行map,它所做的只是创建一个HTML文件的java-script模板,Web浏览器将运行其余部分(不是R解释器)
您正在寻找的专业词汇是事件绑定,单击它将触发缩放您的原始美国Map,并打开一个带有邮政编码的州的新Map。
一般说明(这是所有的java脚本,没有R!):
转到http://leafletjs.com/reference.html并查找事件,您需要 dblclick 事件。
然后,您需要创建一个打开新Map的函数。
请记住,如果你想做复杂的事情,R会给予你非常有限的解决方案,所以我的建议是,当你需要漂亮的JavaScript可视化时,直接去源代码:)
5w9g7ksd4#
你的需求需要大量的定制。如果你擅长JavaScript,只需选择geojson2svg,它提供了很大的灵活性。基本上它将GeoJSON转换为SVG,这就是你可以用普通HTML和JavaScript实现的全部内容。下面是一些examples。