在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
做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技术显示各种地图,还可以绘制自己的要素图形。 它有如下功能:
下面我们从安装开始: 因为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) 或者用管道操作符 结果如下: 初始化改为3级的话,结果如下: leaflet()%>%setView(lng=116.38,lat=39.9,zoom=3)%>%addTiles() leaflet包支持各种与空间信息有关的对象,包括使用sp包定义的空间对象,和R语言中带有空间信息的数据框等,如下所示: 与R相关的:
与sp包相关的:
还有就是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) 后面还有多篇文章,在编写过程中,待续未完。 |
请发表评论