2017-09-21 30 views
1

我在Shiny中製作了一個小應用程序,該應用程序爲國家和地區保存數據,以及用戶可以選擇區域的位置。然後,我的想法是,我在應用程序中的傳單地圖將放大並聚焦在所選地區(即用戶點擊「歐洲」,地圖放大歐洲)。用sf列調整Leaflet(R)中的邊界

我不明白我應該如何使用簡單功能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

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

有一些特殊的方法在Shiny設置中更新leaflet地圖主要是leafletProxy(),那些在docs中描述得相當不錯。

+1

完美地工作,謝謝!我不知道'st_coordinates()'函數,非常有用。 – RobertMc