在Leaflet(R)中使用sf列调整边界

3
我正在使用Shiny制作一个小应用程序,其中包含有关国家和地区的数据,用户将能够选择一个地区。然后我想让应用程序中的leaflet地图缩放并聚焦于所选地区(例如,用户点击“欧洲”,地图就会缩放到欧洲)。
我无法确定如何使用简单特征geometry列作为leaflet地图的过滤器。以下是一个简单的示例(不涉及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个回答

2
我们可以使用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

在此输入图片描述

在Shiny环境中更新leaflet地图有一些特殊的方法,主要是使用leafletProxy(),这些方法在文档中有很好的描述。


1
非常完美,谢谢!我之前不知道 st_coordinates() 函数,非常有用。 - RobertMyles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接