Leaflet包:从入门到跑路(一)

前言

作为一位不太地道且热爱可视化的Giser,在学习R语言的过程中,总会思考如何将R语言运用到地图上来,毕竟地图才是我们的王道,离开了地图,以后还怎么吃饭嘛。
在这里插入图片描述
那说到可视化,除了我们熟知的Kepler.gl,可以进行地图的交互式可视化操作,在R语言里,也有几个优秀的交互式地图可视化的包,其中Leaflet包,也就是今天的主角,是目前最受欢迎的交互式地图可视化的开源JavaScript库之一

leaflet包来自于htmlwidgets包(某个专为R语言量身定制的可视化JS库),优点在于简单易上手,可以使用LeafletJS库,实现地图的交互式平移、缩放,也可以实现任意地图的组合显示。

基本用法

leaflet包的基本用法:

  1. 加载leaflet包;
  2. 通过leaflet包创建各种地图控件(熟悉Arcgis的同学知道,地图控件类似于arcgis中放大缩小、识别、全局、加载数据等按钮);
  3. 通过类似于ggplot2包中的图层叠加来完成地图控件的加载,并修改地图控的参数
  4. 将各种地图图层叠加在主地图上,完成各种地图要素的显示。

实现过程

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
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值