R中文方面的資料還遠不如英文,以后會不定期更新一些R的官方文檔。文檔基于Google翻譯+人工矯正。
下文是rleaflet的官方說明文檔的Google翻譯版。
目錄
介紹
Leaflet是交互式地圖中最受歡迎的開源JavaScript庫之一。它被“紐約時報”和“華盛頓郵報”,GitHub和Flickr等網站以及OpenStreetMap,Mapbox和CartoDB等GIS專家使用。
這個R包可以很容易地集成和控制R中的Leaflet映射。
特征
- 交互式平移/縮放
- 使用以下任意組合撰寫地圖:
- 地圖瓷磚
- 標記
- 多邊形
- 行
- 彈出窗口
- 以GeoJSON
- 直接從R控制臺或RStudio創建地圖
- 在knitr / R Markdown文檔和Shiny應用程序中嵌入地圖
- 使用緯度/經度列從
sp
或sf
包或數據框輕松渲染空間對象 - 使用地圖邊界和鼠標事件來驅動Shiny邏輯
- 以非球形墨卡托投影顯示地圖
- 使用來自傳單插件存儲庫的所選插件來擴充地圖功能
安裝
要安裝此R包,請在R提示符下運行此命令:
#下載穩定版本
install.packages("leaflet")
# 想要體驗最新功能,下載開發版本,執行以下命令。
devtools::install_github("rstudio/leaflet")
安裝后,您可以在R控制臺,R Markdown文檔和Shiny應用程序中使用此軟件包。
基本用法
您可以使用以下基本步驟創建Leaflet映射:
- 通過調用創建一個地圖小部件
leaflet()
。 - 添加層通過使用層功能(例如(即,特征)到地圖
addTiles
,addMarkers
,addPolygons
)來修改窗口小部件的地圖。 - 根據需要重復步驟2。
- 打印地圖窗口小部件以顯示它。
這是一個基本的例子:
library(leaflet)
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R")
m # Print the map
如果你不熟悉magrittr管道運算符(%>%
),這里是不使用管道的等價物:
下一步
我們強烈建議您在瀏覽本網站的其余部分之前先進入“地圖窗口小部件”頁面,因為它描述了我們將在其他頁面的示例中使用的常用習慣用法。
雖然我們已經嘗試為Leaflet提供類似R的接口,但是當您不清楚某些參數的含義時,您可能需要偶爾查看Leaflet 的API文檔。
地圖小工具
該函數leaflet()
返回一個Leaflet映射小部件,該小部件存儲可以在以后修改或更新的對象列表。這個包中的大多數函數都有一個參數map
作為它們的第一個參數,這使得%>%
在magrittr包中使用管道運算符變得很容易,正如你在引言中的例子中看到的那樣。
初始化選項
可以使用某些參數初始化地圖窗口小部件。這可以通過填充options
參數來實現,如下所示。
# Set value for the minZoom and maxZoom settings.
leaflet(options = leafletOptions(minZoom = 0, maxZoom = 18))
的leafletOptions()
可傳遞的小葉中描述的任何選項的參考文件。使用leafletOptions()
,您可以設置自定義CRS和描述都顯示在一個非球面墨卡托投影地圖投影。
地圖方法
您可以使用一系列方法操作地圖窗口小部件的屬性。?setView
有關詳細信息,請參閱幫助頁面。
-
setView()
設置地圖視圖的中心和縮放級別; -
fitBounds()
使視圖適合矩形[lng1, lat1]
-[lng2, lat2]
; -
clearBounds()
清除邊界,以便視圖將由地圖圖層中的緯度/經度數據范圍自動確定(如果提供);
數據對象
兩者leaflet()
和地圖圖層函數都有一個可選data
參數,用于接收以下幾種形式之一的空間數據:
- 從基地R:
- lng / lat矩陣
- 帶有lng / lat列的數據框
- 從sp包:
SpatialPoints[DataFrame]
-
Line
/Lines
SpatialLines[DataFrame]
-
Polygon
/Polygons
SpatialPolygons[DataFrame]
- 從地圖包:
- 從中返回的數據幀
map()
- 從中返回的數據幀
該data
參數用于為需要它的函數導出空間數據; 例如,如果data
是一個SpatialPolygonsDataFrame
對象,那么調用addPolygons
該地圖小部件將知道從中添加多邊形SpatialPolygonsDataFrame
。
從sp對象派生這些變量很簡單,因為它們總是以相同的方式表示空間數據。另一方面,對于普通矩陣或數據幀,任何數字列都可能包含空間數據。所以我們根據列名稱進行猜測:
- 通過查找名為
lat
或latitude
(不區分大小寫)的列來猜測緯度變量 - 經度變量由尋找猜到
lng
,long
或longitude
你總是可以明確識別提供經/緯度列lng
和lat
參數的層功能。
例如,我們不指定參數的值lat
,lng
在addCircles()
下面,但是將自動使用列Lat
和Long
數據框中的值df
:
# add some circles to a map
df = data.frame(Lat = 1:10, Long = rnorm(10))
leaflet(df) %>% addCircles()
您還可以顯式指定Lat和Long列(有關~語法的詳細信息,請參閱下文):
leaflet(df) %>% addCircles(lng = ~Long, lat = ~Lat)
地圖圖層可以使用不同的數據對象來覆蓋其中提供的數據leaflet()。我們可以將上面的例子重寫為:
leaflet() %>% addCircles(data = df)
leaflet() %>% addCircles(data = df, lat = ~ Lat, lng = ~ Long)
以下是分別使用sp和maps的示例:
library(sp)
Sr1 = Polygon(cbind(c(2, 4, 4, 1, 2), c(2, 3, 5, 4, 2)))
Sr2 = Polygon(cbind(c(5, 4, 2, 5), c(2, 3, 2, 2)))
Sr3 = Polygon(cbind(c(4, 4, 5, 10, 4), c(5, 3, 2, 5, 5)))
Sr4 = Polygon(cbind(c(5, 6, 6, 5, 5), c(4, 4, 3, 3, 4)), hole = TRUE)
Srs1 = Polygons(list(Sr1), "s1")
Srs2 = Polygons(list(Sr2), "s2")
Srs3 = Polygons(list(Sr4, Sr3), "s3/4")
SpP = SpatialPolygons(list(Srs1, Srs2, Srs3), 1:3)
leaflet(height = "300px") %>% addPolygons(data = SpP)
library(maps)
mapStates = map("state", fill = TRUE, plot = FALSE)
leaflet(data = mapStates) %>% addTiles() %>%
addPolygons(fillColor = topo.colors(10, alpha = NULL), stroke = FALSE)
公式界面
所有圖層函數的參數都可以采用普通的R對象,例如lat參數的數字向量,或參數的顏色字符向量color。它們也可以采用單側公式,在這種情況下,公式將使用data參數作為環境進行評估。例如,~ x表示x數據對象中的變量,您可以在右側編寫任意表達式,例如~ sqrt(x + 1)。
m = leaflet() %>% addTiles()
df = data.frame(
lat = rnorm(100),
lng = rnorm(100),
size = runif(100, 5, 20),
color = sample(colors(), 100)
)
m = leaflet(df) %>% addTiles()
m %>% addCircleMarkers(radius = ~size, color = ~color, fill = FALSE)
m %>% addCircleMarkers(radius = runif(100, 4, 10), color = c('red'))
使用Basemaps
Leaflet使用地圖圖塊支持底圖,由Google Maps推廣,現在幾乎所有交互式Web地圖都使用它。
默認(OpenStreetMap)平鋪
添加切片的最簡單方法是addTiles()
不帶參數調用; 默認情況下,使用OpenStreetMap磁貼。
m <- leaflet() %>% setView(lng = -71.0589, lat = 42.3601, zoom = 12)
m %>% addTiles()
第三方瓷磚
或者,可以使用該addProviderTiles()
函數添加許多流行的免費第三方底圖,該函數使用leaflet-providers插件實現。請看這里的完整集。
為方便起見,傳單還提供了插件支持的所有第三方磁貼提供程序的命名列表。這使您可以使用您喜歡的R IDE(如RStudio)的自動完成功能,而不必記住或查找支持的磁貼提供程序; 只需鍵入providers$
并選擇其中一個選項即可。您還可以使用names(providers)
查看所有選項。
m %>% addProviderTiles(providers$Stamen.Toner)
m %>% addProviderTiles(providers$CartoDB.Positron)
m %>% addProviderTiles(providers$Esri.NatGeoWorldMap)
leaflet() %>% addTiles() %>% setView(-93.65, 42.0285, zoom = 4) %>%
addWMSTiles(
"http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi",
layers = "nexrad-n0r-900913",
options = WMSTileOptions(format = "image/png", transparent = TRUE),
attribution = "Weather data ? 2012 IEM Nexrad"
)
結合瓷磚層
您不僅限于在地圖上使用單個底圖; 您可以通過添加多個圖塊層來堆疊它們。這通常僅在前面的瓷磚由半透明瓷磚組成或通過options參數具有調整的不透明度時才有意義。
m %>% addProviderTiles(providers$MtbMap) %>%
addProviderTiles(providers$Stamen.TonerLines,
options = providerTileOptions(opacity = 0.35)) %>%
addProviderTiles(providers$Stamen.TonerLabels)
標記
使用標記來調出地圖上的點。標記位置以緯度/經度坐標表示,可以顯示為圖標或圓圈。
數據源
標記的點數據可以來自各種來源:
SpatialPoints
或SpatialPointsDataFrame
對象(來自sp包)
POINT,sfc_POINT
和sf
對象(來自sf包); 僅限X和Y尺寸將被考慮
雙列數字矩陣(第一列是經度,第二列是緯度)
帶有緯度和邏輯列的數據框。您可以明確告訴標記函數哪些列包含坐標數據(例如addMarkers(lng = ~Longitude, lat = ~Latitude)),或者讓函數查找名為lat/ latitude和lon/ lng/ long/的列longitude(不區分大小寫)。
只需提供數字向量lng
和lat
參數
請注意,此時不支持MULTIPOINT
來自sf的對象。
圖標標記
使用addMarkers
或添加圖標標記addAwesomeMarkers
。它們的默認外觀是掉針。與大多數圖層函數一樣,popup參數可用于添加要在單擊時顯示的消息,該label選項可用于在懸停或靜態上顯示文本標簽。
data(quakes)
# Show first 20 rows from the `quakes` dataset
leaflet(data = quakes[1:20,]) %>% addTiles() %>%
addMarkers(~long, ~lat, popup = ~as.character(mag), label = ~as.character(mag))
自定義標記圖標
您可以通過多種方式之一提供自定義標記,具體取決于方案。對于這些方法中的每一種,圖標可以作為URL或文件路徑提供。
對于將單個圖標應用于一組標記的簡單情況,請使用makeIcon()。
greenLeafIcon <- makeIcon(
iconUrl = "http://leafletjs.com/examples/custom-icons/leaf-green.png",
iconWidth = 38, iconHeight = 95,
iconAnchorX = 22, iconAnchorY = 94,
shadowUrl = "http://leafletjs.com/examples/custom-icons/leaf-shadow.png",
shadowWidth = 50, shadowHeight = 64,
shadowAnchorX = 4, shadowAnchorY = 62
)
leaflet(data = quakes[1:4,]) %>% addTiles() %>%
addMarkers(~long, ~lat, icon = greenLeafIcon)
如果要應用的幾個圖標僅由幾個參數(即它們共享相同的大小和錨點但具有不同的URL)而不同,請使用該icons()功能。icons()類似地執行data.frame(),因為任何比標記數短的參數將被回收以適應。
quakes1 <- quakes[1:10,]
leafIcons <- icons(
iconUrl = ifelse(quakes1$mag < 4.6,
"http://leafletjs.com/examples/custom-icons/leaf-green.png",
"http://leafletjs.com/examples/custom-icons/leaf-red.png"
),
iconWidth = 38, iconHeight = 95,
iconAnchorX = 22, iconAnchorY = 94,
shadowUrl = "http://leafletjs.com/examples/custom-icons/leaf-shadow.png",
shadowWidth = 50, shadowHeight = 64,
shadowAnchorX = 4, shadowAnchorY = 62
)
leaflet(data = quakes1) %>% addTiles() %>%
addMarkers(~long, ~lat, icon = leafIcons)
最后,如果您有一組多個參數不同的圖標,則使用該iconList()功能可能更方便。它允許您創建(命名或未命名)makeIcon()圖標列表,并按位置或名稱從該列表中進行選擇。
# Make a list of icons. We'll index into it based on name.
oceanIcons <- iconList(
ship = makeIcon("ferry-18.png", "ferry-18@2x.png", 18, 18),
pirate = makeIcon("danger-24.png", "danger-24@2x.png", 24, 24)
)
# Some fake data
df <- sp::SpatialPointsDataFrame(
cbind(
(runif(20) - .5) * 10 - 90.620130, # lng
(runif(20) - .5) * 3.8 + 25.638077 # lat
),
data.frame(type = factor(
ifelse(runif(20) > 0.75, "pirate", "ship"),
c("ship", "pirate")
))
)
leaflet(df) %>% addTiles() %>%
# Select from oceanIcons based on df$type
addMarkers(icon = ~oceanIcons[type])
令人敬畏的圖標
Leaflet使用令人敬畏的標記傳單插件支持更多可自定義的標記。
該addAwesomeMarkers()
功能類似于addMarkers()
功能,但還允許您指定標記的自定義顏色以及Font Awesome,Bootstrap Glyphicons和Ion圖標圖標庫中的圖標。
在類似的makeIcon
,icons
和iconList
上述功能,你有makeAwesomeIcon
,awesomeIcons
和awesomeIconList
功能,使您可以添加真棒圖標。
# first 20 quakes
df.20 <- quakes[1:20,]
getColor <- function(quakes) {
sapply(quakes$mag, function(mag) {
if(mag <= 4) {
"green"
} else if(mag <= 5) {
"orange"
} else {
"red"
} })
}
icons <- awesomeIcons(
icon = 'ios-close',
iconColor = 'black',
library = 'ion',
markerColor = getColor(df.20)
)
leaflet(df.20) %>% addTiles() %>%
addAwesomeMarkers(~long, ~lat, icon=icons, label=~as.character(mag))
所述library
參數必須是“離子”,“FA”,或“glyphicon”中的一個。該icon
參數必須由相應的庫支持的任何有效的圖標(W / O庫名稱的前綴)的名稱。
標記集群
當地圖上有大量標記時,您可以使用Leaflet.markercluster插件對它們進行聚類。要啟用此插件,您可以提供參數的選項列表clusterOptions
,例如
leaflet(quakes) %>% addTiles() %>% addMarkers(
clusterOptions = markerClusterOptions()
)
使用該函數的freezeAtZoom
參數,markerClusterOptions()
您可以將聚類設置為凍結為特定縮放級別。例如markerClusterOptions(freezeAtZoom = 5)
,無論用戶的實際縮放級別如何,都將在縮放級別5凍結群集。
圓圈標記
圓形標記與常規圓形很相似(請參見“ 線條”和“形狀”),不同之處在于無論縮放級別如何,它們在屏幕像素上的半徑都保持不變。
您可以使用其默認外觀:
leaflet(df) %>% addTiles() %>% addCircleMarkers()
或者自定義顏色,半徑,筆觸,不透明度等。
# Create a palette that maps factor levels to colors
pal <- colorFactor(c("navy", "red"), domain = c("ship", "pirate"))
leaflet(df) %>% addTiles() %>%
addCircleMarkers(
radius = ~ifelse(type == "ship", 6, 10),
color = ~pal(type),
stroke = FALSE, fillOpacity = 0.5
)
彈出窗口
彈出窗口是包含任意HTML的小方框,指向地圖上的特定點。
使用此addPopups()功能可將獨立彈出窗口添加到地圖中。
content <- paste(sep = "<br/>",
"<b><a >Samurai Noodle</a></b>",
"606 5th Ave. S",
"Seattle, WA 98138"
)
leaflet() %>% addTiles() %>%
addPopups(-122.327298, 47.597131, content,
options = popupOptions(closeButton = FALSE)
)
彈出窗口的常見用途是在單擊標記或形狀時顯示它們。Leaflet包中的標記和形狀函數采用popup參數,您可以在其中傳遞HTML以輕松附加簡單的彈出窗口。
library(htmltools)
df <- read.csv(textConnection(
"Name,Lat,Long
Samurai Noodle,47.597131,-122.327298
Kukai Ramen,47.6154,-122.327157
Tsukushinbo,47.59987,-122.326726"
))
leaflet(df) %>% addTiles() %>%
addMarkers(~Long, ~Lat, popup = ~htmlEscape(Name))
在前面的示例中,htmltools::htmlEscape用于對名稱中可能被解釋為HTML的任何字符進行santize。雖然這個例子沒有必要(因為餐館名稱不包含HTML標記),但在數據可能來自文件或數據庫或來自用戶的任何情況下這樣做都很重要。
除了標記之外,您還可以在線條,圓形和其他多邊形等形狀上添加彈出窗口。
標簽
標簽是一種文本或HTML內容,可以附加到標記和形狀上,以便始終在鼠標上顯示或顯示。與彈出窗口不同,您不需要單擊標記/多邊形來顯示標簽。
library(htmltools)
df <- read.csv(textConnection(
"Name,Lat,Long
Samurai Noodle,47.597131,-122.327298
Kukai Ramen,47.6154,-122.327157
Tsukushinbo,47.59987,-122.326726"))
leaflet(df) %>% addTiles() %>%
addMarkers(~Long, ~Lat, label = ~htmlEscape(Name))
自定義標記標簽
您可以使用函數的labelOptions參數自定義標記標簽addMarkers。該labelOptions參數可以使用填充labelOptions()功能。如果noHide為false(默認值),則只有將鼠標懸停在標記上時才會顯示標簽; 如果noHide設置為true,則始終顯示標簽。
# Change Text Size and text Only and also a custom CSS
leaflet() %>% addTiles() %>% setView(-118.456554, 34.09, 13) %>%
addMarkers(
lng = -118.456554, lat = 34.105,
label = "Default Label",
labelOptions = labelOptions(noHide = T)) %>%
addMarkers(
lng = -118.456554, lat = 34.095,
label = "Label w/o surrounding box",
labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
addMarkers(
lng = -118.456554, lat = 34.085,
label = "label w/ textsize 15px",
labelOptions = labelOptions(noHide = T, textsize = "15px")) %>%
addMarkers(
lng = -118.456554, lat = 34.075,
label = "Label w/ custom CSS style",
labelOptions = labelOptions(noHide = T, direction = "bottom",
style = list(
"color" = "red",
"font-family" = "serif",
"font-style" = "italic",
"box-shadow" = "3px 3px rgba(0,0,0,0.25)",
"font-size" = "12px",
"border-color" = "rgba(0,0,0,0.5)"
)))
沒有標記的標簽
您可以使用此addLabelOnlyMarkers功能創建沒有附帶標記的標簽。
以上文章版權歸 RStudio,Inc ;
有Google翻譯;