R语言在线地图神器:Leaflet for R包(一)

2024-06-12 19:58

本文主要是介绍R语言在线地图神器:Leaflet for R包(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

做Javascript相关地图开发的码农,特别关心可视化和开源的同学,都听说过Leaflet这样一个神包(神马,你没有听说过……好吧,当我没说,你自己先搜索一下……)

用官方(自吹自擂)的话来说,Leaflet包是号称最受欢迎的JS的开源交互式地图包( most popular open-source JavaScript libraries for interactive maps),可以直接加载 OpenStreetMap, Mapbox, and CartoDB的底图数据(谢天谢地,这些底图都没有被墙,热泪盈眶啊有木有)。下面就是用Leaflet做的一个地图:

当然,虾神我年轻的时候写过一段时间JS,受伤太深,形成心理阴影了,所以看见JS就有缺氧的赶脚,这里直接无视JS,跳到R语言,进入正文。

今天要讲的是Leaflet for R 这样一个神奇的包。

LeafletR主要是用R语言的语法封装了JS版的Leaflet,可以在R语言的plot窗口,利用html5技术显示各种地图,还可以绘制自己的要素图形。

它有如下功能:
  •     交互地图浏览(缩放、平移)
  •     使用多种底图进行任意组合
  •     加载地图瓦片(WMTS)
  •     点要素定位标记
  •     多边形要素标记
  •     线要素标记
  •     弹出窗口
  •     解析加载GeoJson
  •     从R或者RSutido创建地图窗口
  •     可以把地图嵌入 knitr/R包所生成的Markdown文档中,或者是Shiny制作的APP中。
  •     可以直接获取通过SP包生成就(加载)的空间对象以及包含经纬度的数据框进行展示。
  •     可以设定地图范围以及封装自定义的鼠标事件。

下面我们从安装开始:
因为Leaflet是一个标准的R语言包,所以直接通过命令就可以安装了:
install.packages("leaflet")


下面来看看这个包的基本用法:

一般来说,它的基本使用步骤如下:

1、加载leaflet包
2、通过leaflet包创建地图控件。
3、通过图层操作的方法(如addTiles、 addMarkers、 addPolygons)来处理图层数据,并且修改地图插件的各种参数,来把图层显示在地图控件上。
4、可以重复第三步,可以增加更多的图层数据。
5、把地图部件显示出来。完成绘图。

下面来看一个例子:
m <- leaflet()
at <- addTiles(m)

addMarkers(at,lng=116.391, lat=39.912, popup="这里是北京")


结果如下:

官方的文档里面,对于这种需要重复进行容器嵌套的写法,提供了管道操作符“%>%”来实现,它的主要作用就是把前面的语句(变量)传递给下一个语句,并且作为第一个参数使用,上面那三个语句,利用管道操作符来写,如下,输出结果是完全一样的,但是语句变得简单了。

leaflet()%>%addTiles()%>%addMarkers(lng=116.391, lat=39.912, popup="这里是北京")

简单解释一下管道操作符:

leaflet() %>% addTiles() 
等同于:
m <- leaflet()
at <- addTiles(m)


就是把leaflet()语句创建的地图控件,传递给addTiles()这个方法,并且作为第一个参数来使用。虽然开始用起来怪怪的,但是习惯之后发现这种写法也很舒服,下面的代码,我尽量把两种写法都用上。


二、地图控件

在leaflet包初始化的时候,一般调用leaflet()这个方法,这个方法就是对地图控件进行初始化,会生成一个地图容器,以后所有的图层操作,都在这个容器内处理。一般来说,这个方法都被作为其他方法的第一个参数来使用。我们可以通过显示参数设定或者通过管道操作符%>%来把这个容器传递给其他的方法。

地图控件的基本方法有下面这三个:

setView() :设定地图的显示级别缩放比例、和地图的中心点。
fitBounds():设定地图的范围,一般是一个矩形,结构是:[lng1, lat1] – [lng2, lat2]。
clearBounds():清除地图的范围设定。

下面来看个例子:
m<- leaflet()
m<- setView(m,lng=116.38,lat=39.9,zoom=9)
addTiles(m)


或者用管道操作符

leaflet()%>%setView(lng=116.38,lat=39.9,zoom=9)%>%addTiles()

结果如下:



初始化改为3级的话,结果如下:
leaflet()%>%setView(lng=116.38,lat=39.9,zoom=3)%>%addTiles()


leaflet包支持各种与空间信息有关的对象,包括使用sp包定义的空间对象,和R语言中带有空间信息的数据框等,如下所示:
与R相关的:
  • 由经纬度信息组成矩阵
  • 带有经纬度字段的数据框。

与sp包相关的:
  • SpatialPoints[DataFrame]
  • Line/Lines
  • SpatialLines[DataFrame]
  • Polygon/Polygons
  • SpatialPolygons[DataFrame]

还有就是maps包里面的各种空间图形信息

这些对象都可以直接用于leaflet里面的方法,作为图层添加到地图上。下面我们通过leaflet来绘制一些地图

当然,最简单的,还是绘制点,通过经纬度,把点画上去,我们先生成一批随机点:
df = data.frame(Lat = rnorm(100), Lon = rnorm(100))
然后画上去:
m <-leaflet(df)
addCircles(m)

#写法2:
df %>%leaflet()%>%addCircles()



或者自定义polygon,然后绘制成多边形的方法

下面用自定义的坐标,绘制出一个马里奥大叔:



library(sp)
library(leaflet)
Sr1 = Polygon(cbind(c(3.344726563,17.1270752,17.41589355,20.37432861,20.51867676,27.01287842,27.37371826,30.47668457,30.76531982,44.54748535,44.25891113,41.01190186,40.79528809,37.69250488,37.5480957,48.08331299,47.72247314,44.61968994,44.40332031,34.37310791,34.37310791,41.15612793,41.15612793,44.54748535,44.69189453,47.79467773,48.0112915,44.61968994,44.40332031,38.05328369,37.76470947,44.54748535,44.61968994,34.58972168,34.4453125,17.27148438,17.27148438,13.9520874,13.66351318,10.12768555,10.34429932,17.05487061,17.05487061,10.48852539,10.34429932,6.88067627,6.952697754,3.416870117,3.416870117,9.983520508,10.34429932,6.808288574,6.664123535,3.200500488,3.344726563), 
                    
c(0.063720703,0.208129883,6.19732666,6.05291748,12.25848389,12.11431885,6.05291748,6.05291748,-0.15270996,1-0.152709961,3.022277832,2.877929688,5.836486816,5.908691406,11.96990967,12.04211426,24.0927124,24.30908203,27.2677002,27.33990479,30.29827881,30.22607422,32.89611816,32.89611816,36.28747559,36.28747559,39.24609375,39.24609375,42.27667236,42.34887695,45.3795166,45.3795166,48.48248291,48.62670898,54.54388428,54.54388428,48.84332275,48.41027832,42.49328613,42.56530762,33.54547119,33.11248779,30.58691406,30.44268799,27.48413086,27.19549561,24.81427002,24.5256958,12.18652344,12.04211426,6.413696289,6.05291748,3.238708496,3.094482422,0.063720703)))
srs1 = Polygons(list(Sr1), "s1")
SpP = SpatialPolygons(list(srs1))
leaflet(height = "900px") %>% addPolygons(data = SpP)
addPolygons(leaflet(height = "600px"),data = SpP)


当然,上面两种画法是没有加载底图的,下面我们加载底图绘制一些点,比如生成一批在亚洲范围内的点,然后用彩虹色进行随机渲染,并且画到地图上:

df = data.frame(
  lat = runif(100,min=0,max=70),
  lng = runif(100,min=0,max=160),
  size = runif(100, 5, 10),
  co = substr(rainbow(100),1,7)
)
m <- leaflet(data=df)
m<- addTiles(m)
addCircleMarkers(m,lng=~lng,lat=~lat,radius = ~size, color = ~co, fill = TRUE)


#管道操作符写法:
df%>%leaflet()%>%addTiles()%>%
  addCircleMarkers(lng=~lng,lat=~lat,radius = ~size, color = ~co, fill = TRUE)



当然,除了自己通过数据框定义,还可以直接用现成的空间对象,比如R语言里面有一个maps包,这个包里面就给了很多现成的空间数据,我们通过maps包提供的数据直接来绘制地图:
################################################
#利用maps包里面的数据绘制不同颜色的美国各州地图
################################################
library(maps)
mapStates = map("state", fill = TRUE, plot = FALSE)

m <- leaflet(data = mapStates)
at <- addTiles(m)
addPolygons(at,fillColor = topo.colors(10, alpha = NULL), stroke = FALSE)

#管道操作符写法
leaflet(data = mapStates) %>% addTiles() %>%
  addPolygons(fillColor = topo.colors(10, alpha = NULL), stroke = FALSE)




当然,如果我们有本地的shape file,也可以通过maptools包来读取,变成空间对象,然后也可以画出来了,如下所示:
#####################################################
#绘制Shape file的多边形
####################################################
library(maptools)
path <- "E:/example/ch2/china/"
poly <- readShapePoly(paste(path,"CNPG_S.shp",sep =""))
#转换字符编码
poly$FIRST_NAME = iconv(poly$FIRST_NAME,"UTF8","CP936")
#绘制全国,并且以省的名字为弹出窗

addPolygons(addTiles(leaflet()),data = poly,popup=~FIRST_NAME,
            fillColor = topo.colors(10, alpha = NULL), stroke = FALSE
            )

#管道操作符写法
leaflet(poly)%>%addTiles()%>%addPolygons(popup=~FIRST_NAME,
                                         fillColor = topo.colors(10, alpha = NULL), 
                                         stroke = FALSE)



再比如,我们筛选出有南字结尾的省,并且画出来(河南、湖南、云南、海南)
d =poly[substr(poly$FIRST_NAME,2,2)=="南",]

addPolygons(addTiles(leaflet()),data = d,popup=~FIRST_NAME
           ,fillColor = topo.colors(5, alpha = NULL), stroke = FALSE)

#管道操作符
d%>%leaflet()%>%addTiles()%>%addPolygons(popup=~FIRST_NAME
                                         ,fillColor = topo.colors(5, alpha = NULL), 
                                         stroke = FALSE)



后面还有多篇文章,在编写过程中,待续未完。

这篇关于R语言在线地图神器:Leaflet for R包(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055192

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而