查看原文
其他

动态地理信息可视化——leaflet在线地图简介

2017-01-24 小魔方 数据小魔方

最近稍微涉猎了一下leaflet这个包,突然感到发现了动态可视化的新大门,这个包所提供的地图类型、动态效果、图层展示方式都大大扩展了ggplot作图系统的在数据地图上的缺陷。


leaflet是业界比较流行的JS开源交互式地图包,它支持直接调用OpenStreetMap, Mapbox, and CartoDB等主流地图数据作为辅助图层来进行地理信息数据的可视化操作。


除了这些在线地图素材之外,它对于shapefile格式和json格式以及sp包的空间数据格式的地图数据都有着很好的支持,在图层函数中涵盖了点标记、线条和多边形等常用地理信息可视化图形要素。


该包的代码对R语言的文档输出系统有着良好的支持,可以很方便的嵌入knitr/rmarkdown文档中,也能无缝嵌入shiny系统的webapp中,兼容性可称之为逆天。


接下来以中国地图为例,先对该地图所能呈现和调用的地图类型做一个简短的介绍,深入应用系列技巧可能要等到年后才能陆续更新,大小耐心等吧!


library(plyr)

library(mapdata)

library(leaflet)

library(maptools)

library(ggplot2)


导入中国各省会城市地理信息数据:


province_city <- read.csv("c:/rstudy/chinaprovincecity.csv") 

province_city$size<-round(runif(34,5,10),2)

province_city$type<-factor(sample(LETTERS[1:5],34,replace=TRUE))

co<-substr(rainbow(34),1,7)

province_city<-data.frame(province_city,co)


leaflet函数的基本语法结构如下:


#该句加载地图数据,也可以说是对地图的初始化操作,相当于ggplot2作图系统中的ggplot()函数,会建立一个没有内容的空白图层面板。

m<-leaflet(data=province_city)    


#该句设定所要展示的图层中心位置,参数为带有数据的地图图层、经纬度信息以及呈现的缩放级别(3~9级不等)。

setView(m,lng=116.38,lat=39.9,zoom=3)


#该句会自动调用一个默认的地图图层作为页面底图。其实是一个图层函数,相当于ggplot系统的geom_XXX对象。

m<-addTiles(m)


#该句也是一个图层对象函数,主要呈现点对象信息,点标识为常见的雨滴形状,当然也可以进行自定义。

addMarkers(m,lng=~jd,lat=~wd,popup=~city) #地标符号



以上四局代码会制作出一个以province_city为数据源、以(116.38,39.9)为视觉中心,缩放级别为3级,点标识对象为city的中国行政地图出来。


而且图表原生支持动态操作,你可以使用鼠标滚轮进行放大缩小操作(也可以使用页面左上角的加减号进行操作),每一个点标识都是支持鼠标点击显示弹窗信息的。(弹窗信息中支持定义文本、图片、视频、超链接,当然这些需要对html语言有一定的操作经验)。


该函数的另一大特色是,原生支持管道函数操作,让你的代码简洁、易懂、高效。(很多R函数是需要打开dplyr包并借助其完成对于管道函数的支持)。


以上例子我们可以完全使用管道操作函数进行代码简化。


leaflet(province_city)%>%addTiles()%>%setView(lng=116.38,lat=39.9,zoom=3)%>%addMarkers(lng=~jd,lat=~wd,popup=~city) 



leaflet函数支持的点有三类(我所知的),默认的是雨滴形状(addMarkers),还有两种分别是addCircle、addCircleMarkers。


addCircle是实心点,只有一个颜色属性,addCircleMarkers是带轮廓的圆点,可以分别对轮廓和内园进行颜色设定,两者都支持大小(面积)映射。


当然剩余两种最为常见的地图图层属性就是线和面了,这是物理空间的重要三要素嘛


线图层:

addPolylines

面图层:addPolygons


其实这些对象和ggplot中的图层对象对应的很完整,geom_point()\geom_line\geom_polygon


除此之外,无外乎颜色映射参数、图例参数等。


颜色映射对于数据地图而言是最复杂也最为重要的视觉对象,毕竟你的目光中要有很大一部分数据墨水比是由色彩来呈现的,但是小魔方再在前讲解ggplot数据地图系列的时候已经讲解过非常详细的颜色映射规则。


针对数据地图而言,颜色映射要依据数据类型而定,数值型变量(包含定距变量、定比变量)需要使用连续渐变色进行映射,因子变量(包含分类及有序)需要使用分类色、或者同色系的离散渐变进行颜色映射。


在leaflet函数中对颜色进行了非常精准和高效的分类。


1、用于连续数值的:colorNumeric,colorBin和colorQuantile;


2、用于分类输入,colorFactor。


colorNumeric:针对数值变量进行均匀插值,将颜色(定义的)连续均匀分布在数值区间内。


colorBin:针对数值型变量进行数量段的分组,然后按照组别分别填色。(其实相当于对数值型变量进行划组,生成有序的因子组,然后以分段因子变量的形式进行颜色映射,但是这个过程在leaflet函数中是自动化完成的,无需我们手工生成新变量,这一点儿是leaflet函数相对于ggplot函数在制作数据地图方面的重要优势)。


colorQuantile:也是针对数值型变量,只是是以百分比分位点的形式将数值变量划分为一组百分比分位点区间(其实理念和过程与colorBin一致,只是从绝对量分组变成了百分比分组),然后进行颜色映射。


colorFactor:这个就是单纯的分类变量(因子或者有序)映射的颜色设置方式。


图例对象:

addLegend:是添加图例的图层对象,相当于ggplot中的guilde函数。


接来下给大家大致展现以下leaflet所能呈现的最为常见的几种风格地图样式。


地图类型:

addProviderTiles("Esri.WorldStreetMap")  #浅色

addProviderTiles("Esri.WorldImagery")    #深色深色卫星云图

addProviderTiles("Esri.WorldTerrain")    #亮白色

addProviderTiles("Esri.NatGeoWorldMap")  #深沉轮廓色

addProviderTiles("Stamen.Toner")         #Third-Party Tiles

addProviderTiles("CartoDB.Positron")

addProviderTiles("Stamen.TonerLabels")   #


leaflet()%>%addTiles() #默认风格



leaflet()%>%addProviderTiles("Esri.WorldStreetMap")



leaflet()%>%addProviderTiles("Esri.WorldImagery")



leaflet()%>%addProviderTiles("Esri.WorldTerrain")



leaflet()%>%addProviderTiles("Esri.NatGeoWorldMap")



leaflet()%>%addProviderTiles("Stamen.Toner")


leaflet()%>%addProviderTiles("CartoDB.Positron")



leaflet()%>%addProviderTiles("Stamen.TonerLabels")



限于字数和篇幅,本篇不宜再写下去了(主要小编太困了,上下眼皮打架,已经困得不行了)


关于leaflet内容,年前先暂时先更新这一篇(如果回家还有时间的话,也许继续更新)。


我是分割线〜


欢迎关注魔方学院QQ群


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存