![3901436-3e74a25b1b3da6cc](https://i-blog.csdnimg.cn/blog_migrate/4e93f3e5aae3d7169d87e4600457c3b8.webp?x-image-process=image/format,png)
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!
对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。
作者:李誉辉
四川大学在读研究生
简
介
最近一直在寻找方便上手的地图包,实验了google地图包,百度地图包,发现还是有很多限制。
百度地图包搭配的REmap总是崩溃,
google地图包ggmap现在需要国际信用卡注册,总之,都不甚满意。
虽然ggplot2地图功能非常丰富,但是还是不够简单快捷。
尤其是当我们仅仅需要绘制一些简单的地图时。
经过圈子大佬的推荐,开始尝试leaflet包,确实给我很多惊喜。
leaflet包相对其它地图包,有很多优点和缺点,
首先,绘制地图简单快捷,因为都是基于供应商的tiles,一行代码就可以render出基本widget地图。
支持管道传参,一个图层一个图层进行添加,代码结构更加清晰。
其次,有很多tiles供应商可以选择,包括高德、google、Stamen, Esri, OpenWeatherMap,NASA,
等好几十个tiles供应商。当然其中一些需要注册。其中的google可以绕过注册,已经很难得了。
对于在地图上添加markers图标,shapes形状,线条等,异常方便快捷,这在ggplot2中很难做到的。
支持栅格数据,rasters栅格数据是基于像素点的地图。可以看出,leaflet具有很强的包容性。
支持多种投影坐标系,甚至可以自定义坐标系,这在某些特殊场景非常重要。
当然还有更重要的是,其具有一定交互能力,可以缩放拖拽,
简单的图层切换也不需要使用Shiny。使得更容易上手。
其它特点,首先tiles是基于供应商的,必须联网,
其次对颜色支持不一样,只支持HEX颜色空间和colors()中的颜色名称。 当然内置的几个palette函数,非常特别。
总之,笔者认为leaflet包与ggplot2包的互补性非常好,刚好弥补了ggplot2中画地图的不足。
对于大量数据需要呈现在地图上的场景,还是`ggplot2, leaflet中插入其它plots不便也没有必要。
下面是笔者总结的中文教程,使得新人能更快上手。
说明:以下图片皆为截图,限于技术问题,不能完全展现它的交互式功能。
1.Widget设置
Widget地图框的设置,就是确定Widget的基本参数,
包括CRS坐标系,widget的中心坐标,zoom level(缩放)的范围, widget边界坐标,data数据等。
1.1
leafletOptions()
leaflet()中有个options参数,用leafletOptions()函数来指定,可以控制widget缩放范围。
语法:
1leafletOptions(minZoom = NULL, maxZoom = NULL, crs = leafletCRS(),2 worldCopyJump = NULL, preferCanvas = NULL, ...)
关键参数:
minZoom,表示最低缩小倍数,作用于所有地图层。
maxZoom,表示最高放大倍数,作用于所有地图层。
crs, 表示指定坐标系统,
preferCanvas, 表示是否将leaflet.js路径呈现在地图上。
1library(leaflet)23leaflet(options= leafletOptions(minZoom=0, maxZoom =18))
1.2
中心、缩放、边界
关键函数:
setView() ,设定地图的view(包括center位置和zoom level)
flyTo() ,切换到一个指定的location或zoom-level,使用光滑的pan-zoom
fitBounds() ,设定地图矩形区域边界。view将限制在[lng1, lat1] - [lng2, lat2]
flyToBounds() ,切换到一个指定的地图矩形区域边界,使用光滑的pan/zoom
setMaxBounds() ,限定地图矩形区域最大边界
clearBounds() ,清除地图矩形区域边界, 然后view将只会受地图层的经度和纬度数据限制。
语法:
setView(map, lng, lat, zoom, options = list())
flyTo(map, lng, lat, zoom, options = list())
fitBounds(map, lng1, lat1, lng2, lat2, options = list())
flyToBounds(map, lng1, lat1, lng2, lat2, options = list())
setMaxBounds(map, lng1, lat1, lng2, lat2)
clearBounds(map)
参数解释:
map,表示leaflet()创建的map widget
lng, 表示map center的经度,东经为正
lat, 表示map center的纬度,北纬为正
zoom, 表示zoom level
options, 列表传参,传递zoom或pan参数。
lngl, latl, lng2, lat2, 表示widget边界的坐标。
1library(leaflet)23# 设定中心坐标和zoom level4m <- leaflet() %>% addTiles() %>% setView(-71.0382679,42.3489054, zoom =18)56# 显示第一个view7m %>% fitBounds(-72,40,-70,43) # 设定view边界89# 显示第二个view10m %>% clearBounds() # 清除边界限制, leaflet()默认为世界地图
![3901436-6001c1191d0c400d](https://i-blog.csdnimg.cn/blog_migrate/47e9edd30eb1587e19d704640f500290.webp?x-image-process=image/format,png)
![3901436-56ae38b3c21dbf2e](https://i-blog.csdnimg.cn/blog_migrate/362dfbc075fbc577e616106eae2c1595.webp?x-image-process=image/format,png)
1.3
Data数据
这里的Data不仅仅是画地图上行政区域的数据,而且包括要在地图上呈现的数据。
大多数图层添加函数都有data参数,通常使用%>%管道符逐渐传递data参数。
leaflet()通常支持下列几种形式的数据。
矩阵数据(由经度和纬度构成)。
数据框(由经度和纬度构成)。
从sp包传递的数据,包括:
SpatialPoints(数据框类型)
Line()/Lines()
SpatialLines()(数据框类型)
Polygon()/Polygons()
SpatialPolygons()(数据框类型)
从maps包传递的数据,主要是map()函数传递的数据框。
对于经度和纬度组成矩阵或数据框类型数据,在调动data添加图层时,会根据变量名进行猜测匹配:
若变量名称为lat,或latitude等,则猜测为纬度,猜测时,不区分大小写。
若变量名称为lng, long或 longitude等,则猜测为经度,猜测时,不区分大小写。
也可以手动指定经度和纬度变量,使用~语法。
在参数传递过程中,默认后面的data参数覆盖前面data参数。
1.3.1 data中经纬度的指定/猜测/覆盖
1library(leaflet)23# 自动猜测匹配
4set.seed(123)5df <- data.frame(Lat = 1:10, Long = rnorm(10))6leaflet(df)%>%addCircles()78# 手动指定经度和纬度变量,结果一样 leaflet(df) %>% addCircles(lng = ~Long,
9# lat = ~Lat)
1011# 在add_xxx()函数中重新指定参数进行覆盖,结果一样 leaflet() %>%
12# addCircles(data = df) leaflet() %>% addCircles(data = df, lat = ~Lat, lng
13# = ~Long)