动态地理信息可视化——leaflet填充地图

这一篇是leaflet动态地图的第四篇,也是最值得推荐的一篇,这一篇涉及到热力地图填充,通过该篇内容,大家可以体会大leaflet在线地图的R借口在处理热力地图上面颜色标度映射的强大优势。

加载包:

library(plyr) library(maps) library(mapdata) library(leaflet) library(stringi) library(maptools) library(htmltools) library(RColorBrewer) library(ggplot2) library(rgdal)

地图素材加载:(leaflet支持多种地图素材,比如常见的shapefile格式、json格式以及其他在线地图,但是因为json格式本来还没有很熟练,这里用shp格式地图素材为例进行加讲解)。

肯定会有小伙伴儿会问,既然leaflet本身就是在线地图,为啥还要费事儿加载shp地图素材就进行映射,因为leaflet在线地图提供的地图底图本身具有多级缩放特性,每一缩放级别都有对应的行政区划界线,但是这些参数和行政区划是封装在底层的js语言中的,我们无法使用R语言直接进行调用,只能作为一个图层素材进行背景修饰,说白了,其实我们想要的仅仅是多级缩放的动态切换效果,这样再结合我们自定义的地图素材,可以呈现出更加完美的效果。(只有热力填充地图需要定义区域界线,而点图和线图都可以直接利用leaflet本身的地图素材,因为只需要坐标点位置即可)。

我们常用的地图素材资源无非以下三种,R包内置的地图数据、shapefile格式和json格式。以下是三种格式素材导入并在leaflet中制作的地图的基本代码:

maps包:

mapStates<-map("state",fill=TRUE,plot=FALSE) leaflet(mapStates) %>% addTiles() %>%addPolygons(fillColor=topo.colors(10,alpha =NULL), stroke = FALSE)

mapWorld<-map("world",fill=TRUE,col=rainbow(200),ylim=c(-60,90),mar=c(0,0,0,0)) leaflet(mapWorld) %>% addTiles() %>%addPolygons(fillColor = topo.colors(10, alpha = NULL), stroke = FALSE)

shapefile:

American_map <-readShapePoly("C:/rstudy/USA_map/STATES.SHP") American_map$STATE_NAME = iconv(American_map$STATE_NAME,"UTF8","CP936") leaflet(American_map)%>%addTiles()%>%addPolygons(popup=~STATE_NAME,fillColor=topo.colors(10,alpha=NULL),stroke=FALSE)

json文件:

library(jsonlite)

geoData<-readLines("D:/R/mapdata/State/USA.json",warn=FALSE)%>%paste(collapse="\n")%>%fromJSON(simplifyVector=FALSE) geoData$style=list(weight=1,color="red",fillColor="green",opacity=1,fill=TRUE,fillOpacity=0.6) leaflet()%>%setView(lng=-98.961387,lat=39.708533,zoom=3)%>%addTiles()%>%addGeoJSON(geoData)

前两种素材作图过程大同小异,特别是一些标度的属性声明很类似ggplot中的函数过程,但是json格式的素材操作起来就不是很友好,他的标度属性是要在数据文件中新建style的list对象进行生命,而且json格式中的list非常多,结构相对复杂,至今我也没完全搞明白如果自由操作。

下面是承接上面shapefile格式素材做展现的四中颜色标度(三种连续性标度和一种分类标度的映射过程)。

#colorQuantile(连续性数值变量的百分比颜色过度):

pal <- colorQuantile("Greens",American_map@data$POP1990) leaflet(American_map)%>%addTiles()%>% addPolygons(color=~pal(American_map@data$POP1990),fillOpacity = 0.8,weight=1)%>% addLegend(pal=pal,values=American_map@data$POP1990,position="bottomleft",title = "1990年人口数量(万人)")

以下两种同属连续性数值变量(使用颜色数量不同)

colorNumeric(多色过度): pal<-colorNumeric(c("darkgreen","yellow","orangered"),American_map@data$POP1990) leaflet(American_map)%>%addTiles() %>% addPolygons(color=~pal(American_map@data$POP1990),fillOpacity = 0.8,weight=1)%>% addLegend(pal=pal,values=American_map@data$POP1990,position="bottomleft",title = "1990年人口数量(万人")

colorNumeric(单色过度): pal<-colorNumeric("Greens",American_map@data$POP1990) leaflet(American_map)%>%addTiles()%>% addPolygons(color=~pal(American_map@data$POP1990),fillOpacity = 0.8,weight=1)%>% addLegend(pal=pal,values=American_map@data$POP1990,position="bottomleft",title="1990年人口数量(万人)")

以下两种也同属连续性数值标量的颜色标度映射(但是可以自定义分组数量,其实实质上是对变量分割,后以分组形式填充,更准确的说,确实是应用了变量转换的方式(数值转有序因子),但是过程是自动进行的,而不是像在ggplot中一样不需手动转换)

colorBin(单色渐变分组过度):

pal<-colorBin("Greens",American_map@data$POP1990,10) leaflet(American_map)%>%addTiles()%>% addPolygons(color=~pal(American_map@data$POP1990),fillOpacity=0.8,weight=1)%>% addLegend(pal=pal,values=American_map@data$POP1990,position="bottomleft",title="1990年人口数量(万人)")

colorBin(多色色渐变分组过度):

pal<-colorBin(c("darkgreen","yellow","orangered"),American_map@data$POP1990,8) leaflet(American_map) %>% addTiles() %>% addPolygons(color=~pal(American_map@data$POP1990),fillOpacity=0.8,weight=1)%>% addLegend(pal=pal,values=American_map@data$POP1990,position="bottomleft",title="1990年人口数量(万人)")

离散标度:(这个例子是用在变量本身就是因子变量的情况下,算是分类变量情况下的颜色标度映射)

china_map<-readShapePoly("c:/rstudy/bou2_4p.shp") mydata<-read.csv("c:/rstudy/geshengzhibiao.csv") mydata$type<-factor(sample(LETTERS[1:5],33,replace=TRUE)) shape <- merge(china_map,mydata,by="NAME") pal <- colorFactor(c("green","red","blue","yellow","brown"), domain = c("A", "B","C","D","E"))#设置色盘: i_popup<-paste0("<strong>Province:</strong>",shape$NAME,"<br>", "<strong>Level:</strong>",shape$type)

#设置弹出窗口

leaflet(shape)%>%addTiles()%>% setView(116.387021,39.969369,zoom=3)%>% addPolygons(fillColor=~pal(shape$type),fillOpacity=0.8,color="#000000",weight=1,popup=i_popup)%>% addLegend(pal=pal,values=shape@data$type,position="bottomright",title=paste0("小魔方基团2016年","<br>","营业分布等级"))

以上地图效果都支持多节自动缩放和弹窗动态信息显示(需设置popup属性及少量html交互代码)

leaflet在线地图底层由js源码编写,天然支持html语言,如能结合html搭配使用,可以在动态地图元素中,特别是弹窗中无缝嵌入图片、超链接甚至视频等多类元素,感兴趣的小伙伴儿可以自行探索。

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

原文发表时间:2017-02-12

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习AI算法工程

并行爬虫和数据清洗工具(开源)

etlpy是python编写的网页数据抓取和清洗工具,核心文件etl.py不超过500行,具备如下特点 爬虫和清洗逻辑基于xml定义,不需手工编写 基于pyth...

51540
来自专栏菩提树下的杨过

silverlight:telerik RadControls中RadGridView的一个Bug及解决办法

当RadGridView中嵌套RadComboBox,且RadGridView的高度不够出现滚动条时,上下拉动滚动条后,RadComboBox中的选中值将丢失!...

22570
来自专栏我的小碗汤

用go语言爬取珍爱网 | 第三回

Seed把需要爬的request送到engine,engine负责将request里的url送到fetcher去爬取数据,返回utf-8的信息,然后engine...

22230
来自专栏CSDN技术头条

解析大型.NET ERP系统 20条数据库设计规范

数据库设计规范是个技术含量相对低的话题,只需要对标准和规范的坚持即可做到。当系统越来越庞大,严格控制数据库的设计人员,并且有一份规范书供执行参考。在程序框架中,...

31870
来自专栏jouypub

Spring Task中cron表达式详解

_{秒}:取值范围(0-59),不允许为空值,若值不合法,调度器将抛出SchedulerException异常

23310
来自专栏数据结构与算法

2821 天使之城

2821 天使之城  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果 题目描述 Descriptio...

32860
来自专栏吴伟祥

一些免费的学习资源 原

HTML5 Canvas编程:http://blog.csdn.net/column/details/canvas-programming.html GTK编...

54230
来自专栏小狼的世界

Python数据分析笔记

本书中推荐了edm和ipython作为数据分析的环境,我还是刚开始使用这种集成的环境,觉得交互方面,比传统的命令行方式提高了不少。

16430
来自专栏嵌入式程序猿

【电机控制不得不学习的干货:】 飞思卡尔MCU正交编/解码器模块

在电机控制领域,我们经常需要得到电机的转速,位置来执行算法,那么想知道转速是如何获得的吗?看过来,猿来你在这里O(∩_∩)O~ 正交编码器简介 飞思卡尔增强型正...

320110
来自专栏magicsoar

二维码知识介绍

一、二维码的分类 二维码,从字面上看就是用两个维度(水平方向和垂直方向)来进行数据的编码,条形码只利用了一个维度(水平方向)表示信息,在另一个维度(垂直方向)没...

411100

扫码关注云+社区

领取腾讯云代金券