R成精系列-rleaflet官方说明

R中文方面的资料还远不如英文,以后会不定期更新一些R的官方文档。文档基于Google翻译+人工矫正。
下文是rleaflet的官方说明文档的Google翻译版。
目录

介绍

Leaflet是交互式地图中最受欢迎的开源JavaScript库之一。它被“纽约时报”“华盛顿邮报”GitHubFlickr等网站以及OpenStreetMapMapboxCartoDB等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. 添加通过使用层功能(例如(即,特征)到地图addTilesaddMarkersaddPolygons)来修改窗口小部件的地图。
  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图标图标库中的图标。

在类似的makeIconiconsiconList上述功能,你有makeAwesomeIconawesomeIconsawesomeIconList功能,使您可以添加真棒图标。

# 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 href='http://www.samurainoodle.com'>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阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270