文章目录
前言
作为一位不太地道且热爱可视化的Giser,在学习R语言的过程中,总会思考如何将R语言运用到地图上来,毕竟地图才是我们的王道,离开了地图,以后还怎么吃饭嘛。
那说到可视化,除了我们熟知的Kepler.gl,可以进行地图的交互式可视化操作,在R语言里,也有几个优秀的交互式地图可视化的包,其中Leaflet包,也就是今天的主角,是目前最受欢迎的交互式地图可视化的开源JavaScript库之一
leaflet包来自于htmlwidgets包(某个专为R语言量身定制的可视化JS库),优点在于简单易上手,可以使用LeafletJS库,实现地图的交互式平移、缩放,也可以实现任意地图的组合显示。
基本用法
leaflet包的基本用法:
- 加载leaflet包;
- 通过leaflet包创建各种地图控件(熟悉Arcgis的同学知道,地图控件类似于arcgis中放大缩小、识别、全局、加载数据等按钮);
- 通过类似于ggplot2包中的图层叠加来完成地图控件的加载,并修改地图控的参数
- 将各种地图图层叠加在主地图上,完成各种地图要素的显示。
实现过程
1. 初始化底图控件
首先我们需要用leaflet函数对地图控件进行初始化,它会生成一个地图容器,我们之后所以的地图控件都会在这个容器里面进行操作,可以理解成Arcgis里面的空白文档。
m <- leaflet()
2. 添加底图
接下来我们需要添加底图,需要使用addTiles函数,这里默认采用的底图是OSM的底图,即街区Tiles
library(leaflet)
x <- leaflet() %>%
addTiles()
当然除了OSM底图,leaflet包还提供了许多其他底图,如果想要添加的话,只需要再调用addProviderTiles函数即可,格式具体如下:
#esri提供的四幅底图
m1 <- leaflet() %>%
addTiles() %>%
addProviderTiles("Esri.WorldTerrain")
m2 <- leaflet()%>%
addTiles()%>%
addProviderTiles("Esri.WorldImagery")
m3 <- leaflet()%>%
addTiles()%>%
addProviderTiles("Esri.WorldStreetMap")
m4 <- leaflet()%>%
addTiles()%>%
addProviderTiles("Esri.NatGeoWorldMap")
#还有NASA的夜光遥感数据
leaflet()%>%
addTiles()%>%
addProviderTiles("NASAGIBS.ViirsEarthAtNight2012")
如果要使用第三方的底图的话,只要在参数providers$后面加tiles供应商的名字就行了,如下:
# 使用Stamen.Toner的tiles
m6 <- leaflet() %>%
addProviderTiles(providers$Stamen.Toner)
2.1 底图透明度的修改
那么多丰富的底图,作为小孩子才会挑,那大人都是都想叠加上面,那么这时候就不得不考虑底图透明度的问题了,因为只有半透明的时候才能看得到叠加在下面的其他底图嘛,这时候leaflet包提供了一个对底图进行修改的参数:option,也就是你可以输入一些自定义的内容给option,然后它会帮你修改叠加的底图。
那问题来了,怎么输入想要的内容给option呢?
这里官方爸爸说我给它专门准备了一个函数:providerTileOptions(),有什么无理的需求都可以通过这个函数告诉options,拿透明度来举例,providerTileOptions()里面有个opacity参数,这个参数是设置透明度的,opacity从0(完全透明)到1(完全不透明)。具体实现看下面:
leaflet() %>%
addTiles()%>%
addProviderTiles("NASAGIBS.ViirsEarthAtNight2012",#使用夜光遥感影像,并设置透明度为0.6
options = providerTileOptions(opacity=0.6)) %>%
addProviderTiles(providers$Stamen.TonerLines,#叠加一层tiles,显示公路和街道,并设置透明度为0.35
options = providerTileOptions(opacity=0.35))
3. 关于管道操作符“%>%”
还有许多的底图也可以通过上述的方法进行添加,这里就不一一赘述了。
在上面的代码里面,我们可以发现一种奇怪的符号:“%>%”,那这是什么符号呢?
依据官方的说法,这种符号叫“管道操作符”,它的作用就是将前一条语句作为一个变量,传递给下一条语句,并且作为第一个参数使用,这样就免去重复嵌套的麻烦,举个栗子:
第一种写法:
m <- leaflet()
a <- addTiles(m)
addMarkers(a,lng=113.544840,
lat=22.216005,
popup="纪念孙中山市政公园")
第二种写法:
m <-leaflet() %>%
addTiles()%>%
addMarkers(lng = 113.544840,
lat=22.216005,
popup="纪念孙中山市政公园")
上述两种写法的结果是一样的,leaflet() %>% addTiles() 相当于 addTiles(leaflet())
4. 添加地图控件
一般而言,地图控件包括以下:
(1)setView() ,设定地图的view(包括center位置和zoom level);
(2)flyTo(),切换到一个指定的location或zoom-level,使用光滑的pan-zoom;
(3)fitBounds() ,设定地图矩形区域边界。view将限制在[lng1, lat1] - [lng2, lat2];
(4)flyToBounds() ,切换到一个指定的地图矩形区域边界,使用光滑的pan/zoom;
(5)setMaxBounds() ,限定地图矩形区域最大边界;
(6)clearBounds() ,清除地图矩形区域边界,然后view将只会受地图层的经度和纬度数据限制。
挑了几个常用的地图控件来试试,示例代码如下:
library(leaflet) #设定中心坐标和zoom level
m<- leaflet() %>%
setView(lng = -71.0382679,
lat = 42.3489054,
zoom =18) %>%
addTiles()
#修改zoom为 = 3
m<- leaflet() %>%
setView(lng = -71.0382679,
lat = 42.3489054,
zoom =3) %>%
addTiles()
#显示第一个view
m %>% fitBounds(-72,40,-70,43)
# 设定view边界显示第二个view
m %>% clearBounds() # 清除边界限制, leaflet()默认为世界地图
5. 给地图添加图标(Markers)
有时候,我们的地图上有一些重要的信息希望展示给观看的人,那么这时候就得使用图标工具了,图标用于标记地图上特殊的点,点的位置依赖于经纬度来指定。
形如:
addMarkers(lng = 113.544840,
lat=22.216005,
popup="纪念孙中山市政公园")
lng跟lat参数用于指定经纬度,用于确定点位,popup参数用于表达点的信息。如果我们的数据是一种数据框的形式,例如有两列字段分别是经度跟纬度,就可以用**addMarkers(“经度”,“纬度”)**的形式指定
形如:
addMarkers(lng = ~Longitude
lat = ~Latitude,
popup = ~message)
6.在地图上画点
leaflet包支持各种与空间信息有关的对象,包括带有空间信息的数据框、二维矩阵、sf包、maps包中的各种空间图形信息等等。这些空间对象都可以通过leaflet绘制成图层,叠加在一起。
接下来就简单实操一下:
#生成100个点,数值范围在0~80之间,地球赤道到北极的纬度在0~90°之间,所以生成的范围应该在0-90之间
df <- data.frame(lat = runif(100,min=0,max=80),
#同理如上,经度的范围....应该不用讲了
lng = runif(100,min=0,max=360),
#设置生成点的大小
size = runif(100, 5, 10),
#rainbow是彩虹的意思,也就是彩虹配色的字段
colour = substr(rainbow(100),1,7))
df %>%
leaflet() %>%
addCircles() %>%
addCircleMarkers(lng=~lng,
lat=~lat,
radius = ~size,
color = ~colour,
fill = TRUE)%>%
addTiles()
7. 利用maps包提供的数据绘制地图
library(maps) #加载maps包
mapFrance = map("france",
fill = TRUE,
plot = FALSE) #读取法国的地图
leaflet(data = mapFrance) %>%
addTiles() %>%
#Color为颜色设置,topo.colors是指颜色向量,alpha设置透明度
addPolygons(fillColor = topo.colors(10,
alpha = NULL),
stroke = FALSE)
8.读取本地shapefile并进行绘制
library("rgdal") #加载rgdal包来读取shp文件
data <- readOGR("zhongshan2.shp",
stringsAsFactors = FALSE) #读取工作空间中的要素图层
Encoding(data@data$Name)<- "UTF-8" #由于中文容易乱码,所以用“utf-8”对中文字段进行编码
#自定义配色方案对地图进行可视化
Npal <- colorNumeric(palette = "YlGnBu",
domain = data$F2) #YIGnBu是
RColorBrewer包中万千配色之一,详细看后面的小科普;domain是用于配色的字段,理解成arcgis中根据图层的某个字段进行配色
leaflet(data)%>%
addTiles() %>%
addPolygons(stroke = TRUE,
smoothFactor = 0.3,
fillOpacity = 0.8, #填充透明度
color = ~Npal(data$F2))
#另一种配色
leaflet(data)%>%
addTiles()%>%
addPolygons(popup=~ID,
fillColor = topo.colors(10),
stroke = FALSE)
RColorBrewer
RColorBrewer包是R语言中的一款配色包,其包含了许多高大上的配色方案,我们上面使用的YIFnBu正是其中的一种,如下:
更多想了解的可以参考以下链接:
https://www.jianshu.com/p/a8856757a0d2
结语
关于leaflet包的介绍先到这里了~
下一节将更加讲解leaflet包中关于颜色、图例的设置所有的源码都已经打包,有需要自取
链接:
https://pan.baidu.com/s/14Av84k5dTy_XyeCRnSYrNA?pwd=h21o
提取码:h21o