R成精系列-rleaflet官方說明

R中文方面的資料還遠不如英文,以后會不定期更新一些R的官方文檔。文檔基于Google翻譯+人工矯正。
下文是rleaflet的官方說明文檔的Google翻譯版。
目錄

介紹

Leaflet是交互式地圖中最受歡迎的開源JavaScript庫之一。它被“紐約時報”“華盛頓郵報”GitHubFlickr等網站以及OpenStreetMap,MapboxCartoDB等GIS專家使用。

這個R包可以很容易地集成和控制R中的Leaflet映射。

特征

  • 交互式平移/縮放
  • 使用以下任意組合撰寫地圖:
    • 地圖瓷磚
    • 標記
    • 多邊形
    • 彈出窗口
    • 以GeoJSON
  • 直接從R控制臺或RStudio創建地圖
  • knitr / R Markdown文檔和Shiny應用程序中嵌入地圖
  • 使用緯度/經度列從spsf包或數據框輕松渲染空間對象
  • 使用地圖邊界和鼠標事件來驅動Shiny邏輯
  • 以非球形墨卡托投影顯示地圖
  • 使用來自傳單插件存儲庫的所選插件來擴充地圖功能

安裝

要安裝此R包,請在R提示符下運行此命令:

 #下載穩定版本
install.packages("leaflet")
# 想要體驗最新功能,下載開發版本,執行以下命令。
devtools::install_github("rstudio/leaflet")

安裝后,您可以在R控制臺,R Markdown文檔和Shiny應用程序中使用此軟件包。

基本用法

您可以使用以下基本步驟創建Leaflet映射:

  1. 通過調用創建一個地圖小部件leaflet()
  2. 添加通過使用層功能(例如(即,特征)到地圖addTiles,addMarkersaddPolygons)來修改窗口小部件的地圖。
  3. 根據需要重復步驟2。
  4. 打印地圖窗口小部件以顯示它。

這是一個基本的例子:

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
屏幕快照 2018-10-20 上午9.43.50.png

如果你不熟悉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對象派生這些變量很簡單,因為它們總是以相同的方式表示空間數據。另一方面,對于普通矩陣或數據幀,任何數字列都可能包含空間數據。所以我們根據列名稱進行猜測:

  • 通過查找名為latlatitude(不區分大小寫)的列來猜測緯度變量
  • 經度變量由尋找猜到lnglonglongitude

你總是可以明確識別提供經/緯度列lnglat參數的層功能。

例如,我們不指定參數的值latlngaddCircles()下面,但是將自動使用列LatLong數據框中的值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)
屏幕快照 2018-10-20 上午9.53.51.png
library(maps)
mapStates = map("state", fill = TRUE, plot = FALSE)
leaflet(data = mapStates) %>% addTiles() %>%
  addPolygons(fillColor = topo.colors(10, alpha = NULL), stroke = FALSE)
屏幕快照 2018-10-20 上午9.54.51.png

公式界面
所有圖層函數的參數都可以采用普通的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)

標記

使用標記來調出地圖上的點。標記位置以緯度/經度坐標表示,可以顯示為圖標或圓圈。

數據源

標記的點數據可以來自各種來源:

SpatialPointsSpatialPointsDataFrame對象(來自sp包)
POINT,sfc_POINTsf對象(來自sf包); 僅限X和Y尺寸將被考慮
雙列數字矩陣(第一列是經度,第二列是緯度)
帶有緯度和邏輯列的數據框。您可以明確告訴標記函數哪些列包含坐標數據(例如addMarkers(lng = ~Longitude, lat = ~Latitude)),或者讓函數查找名為lat/ latitude和lon/ lng/ long/的列longitude(不區分大小寫)。
只需提供數字向量lnglat參數
請注意,此時不支持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 AwesomeBootstrap GlyphiconsIon圖標圖標庫中的圖標。

在類似的makeIcon,iconsiconList上述功能,你有makeAwesomeIcon,awesomeIconsawesomeIconList功能,使您可以添加真棒圖標。

# 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翻譯;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374