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

最近稍微涉猎了一下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内容,年前先暂时先更新这一篇(如果回家还有时间的话,也许继续更新)。

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2017-01-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏MixLab科技+设计实验室

人工智能Logo设计师Brandmark

封面由ARKie智能设计赞助 早在去年 mixlab 的一篇案例报告里,就介绍过 Brandmark 了,当时 Brandmark 还是 v1 的版本,现在已...

34530
来自专栏携程技术中心

干货 | ElasticSearch相关性打分机制

作者简介 孙咸伟,后端开发一枚,在携程技术中心市场营销研发部负责“携程运动”项目的开发和维护。 携程运动是携程旗下新业务,主要给用户提供羽毛球、游泳等运动项目的...

1.9K80
来自专栏量化投资与机器学习

【高能】用PyMC3进行贝叶斯统计分析(代码+实例)

问题类型1:参数估计 真实值是否等于X? 给出数据,对于参数,可能的值的概率分布是多少? 例子1:抛硬币问题 硬币扔了n次,正面朝上是h次。 参数问题 想知道...

1.1K100
来自专栏大数据文摘

手把手|如何用Python绘制JS地图?

558130
来自专栏大数据

有向无环图检测

01 — Spark背景介绍 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark 是一种与 Hadoop 相似的开源集群计算环...

47970
来自专栏web前端教室

javascript 算法初识

最近有空,想学习下算法。一直感觉它很高深的样子,尤其我数学又不好。 但我还是想学学看,万一能学到点东西呢,,, 先来了解下算法的定义:是指解题方案的准确而完整的...

20760
来自专栏落影的专栏

OpenGLES进阶教程7-天空盒效果

教程 OpenGLES入门教程1-Tutorial01-GLKit OpenGLES入门教程2-Tutorial02-shader入门 OpenGLES入门...

40160
来自专栏儿童编程

Python案例——喝墨水的小乌龟

(本文为前一篇文章《理解编程语言只需四个词-编程知识体系介绍(带python及scratch案例)》的说明案例之一)

24720
来自专栏算法channel

Spark|有向无环图(DAG)检测

01 — Spark背景介绍 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark 是一种与 Hadoop 相似的开源集群计算环...

58580
来自专栏斑斓

Spark 1.4为DataFrame新增的统计与数学函数

Spark一直都在快速地更新中,性能越来越快,功能越来越强大。我们既可以参与其中,也可以乐享其成。 目前,Spark 1.4版本在社区已经进入投票阶段,在Gi...

37070

扫码关注云+社区

领取腾讯云代金券