使用sf列

时间:2017-09-21 20:21:05

标签: r shiny leaflet sf

我在Shiny制作了一个小应用程序,用于保存国家和地区的数据,用户可以选择某个地区。然后我的想法是,我在应用程序中的小册子地图将放大并关注所选区域(即用户点击"欧洲"并且地图放大欧洲)。

我无法弄清楚如何使用简单要素geometry列作为传单地图的过滤器。这是一个简单的例子(不是Shiny,但问题与Shiny无关,我想)。

library(rnaturalearth) 
library(dplyr)
library(leaflet)

# sf data:
earth <- ne_countries(returnclass = "sf") %>% 
  select(Region = region_un, geometry)

# little dataset:
df <- data_frame(
  Region = c("Europe", "Africa", "Asia", "Oceania", "Americas"),
  Score = c(0.85, 0.77, 0.81, 0.93, 0.79)
)
# join:
df <- full_join(df, earth)

# simulate what I'm doing in Shiny:
input <- list()
input$region <- "Europe"

df2 <- filter(df, Region == input$region)

leaflet(df2) %>% addTiles()

这会产生: enter image description here

与使用df(未过滤的数据帧)相同。关于如何解决这个问题的任何想法?我无法在Shiny / leaflet文档中找到它。

1 个答案:

答案 0 :(得分:1)

我们可以使用sf::st_coordinatesdf2$geometry中提取值,获取平均纬度和经度,然后使用leaflet::setView()关注我们感兴趣的区域:

library(sf)
coords <- st_coordinates(df2$geometry)
lng <- mean(coords[,1])
lat <- mean(coords[,2])

leaflet(df2) %>% addTiles() %>%
    setView(lng, lat, zoom = 3) # 3 for "continent" level

enter image description here

有一些特殊的方法可以在闪亮的设置leaflet中更新leafletProxy()地图,这些方法在docs中得到了很好的描述。