Leaflet包:从入门到跑路(一)
文章目錄
- 前言
- 基本用法
- 實(shí)現(xiàn)過(guò)程
- 1. 初始化底圖控件
- 2. 添加底圖
- 2.1 底圖透明度的修改
- 3. 關(guān)于管道操作符“%>%”
- 4. 添加地圖控件
- 5. 給地圖添加圖標(biāo)(Markers)
- 6.在地圖上畫(huà)點(diǎn)
- 7. 利用maps包提供的數(shù)據(jù)繪制地圖
- 8.讀取本地shapefile并進(jìn)行繪制
- 結(jié)語(yǔ)
前言
作為一位不太地道且熱愛(ài)可視化的Giser,在學(xué)習(xí)R語(yǔ)言的過(guò)程中,總會(huì)思考如何將R語(yǔ)言運(yùn)用到地圖上來(lái),畢竟地圖才是我們的王道,離開(kāi)了地圖,以后還怎么吃飯嘛。
那說(shuō)到可視化,除了我們熟知的Kepler.gl,可以進(jìn)行地圖的交互式可視化操作,在R語(yǔ)言里,也有幾個(gè)優(yōu)秀的交互式地圖可視化的包,其中Leaflet包,也就是今天的主角,是目前最受歡迎的交互式地圖可視化的開(kāi)源JavaScript庫(kù)之一
leaflet包來(lái)自于htmlwidgets包(某個(gè)專(zhuān)為R語(yǔ)言量身定制的可視化JS庫(kù)),優(yōu)點(diǎn)在于簡(jiǎn)單易上手,可以使用LeafletJS庫(kù),實(shí)現(xiàn)地圖的交互式平移、縮放,也可以實(shí)現(xiàn)任意地圖的組合顯示。
基本用法
leaflet包的基本用法:
實(shí)現(xiàn)過(guò)程
1. 初始化底圖控件
首先我們需要用leaflet函數(shù)對(duì)地圖控件進(jìn)行初始化,它會(huì)生成一個(gè)地圖容器,我們之后所以的地圖控件都會(huì)在這個(gè)容器里面進(jìn)行操作,可以理解成Arcgis里面的空白文檔。
m <- leaflet()2. 添加底圖
接下來(lái)我們需要添加底圖,需要使用addTiles函數(shù),這里默認(rèn)采用的底圖是OSM的底圖,即街區(qū)Tiles
library(leaflet) x <- leaflet() %>%addTiles()
當(dāng)然除了OSM底圖,leaflet包還提供了許多其他底圖,如果想要添加的話(huà),只需要再調(diào)用addProviderTiles函數(shù)即可,格式具體如下:
如果要使用第三方的底圖的話(huà),只要在參數(shù)providers$后面加tiles供應(yīng)商的名字就行了,如下:
# 使用Stamen.Toner的tiles m6 <- leaflet() %>%addProviderTiles(providers$Stamen.Toner)2.1 底圖透明度的修改
那么多豐富的底圖,作為小孩子才會(huì)挑,那大人都是都想疊加上面,那么這時(shí)候就不得不考慮底圖透明度的問(wèn)題了,因?yàn)橹挥邪胪该鞯臅r(shí)候才能看得到疊加在下面的其他底圖嘛,這時(shí)候leaflet包提供了一個(gè)對(duì)底圖進(jìn)行修改的參數(shù):option,也就是你可以輸入一些自定義的內(nèi)容給option,然后它會(huì)幫你修改疊加的底圖。
那問(wèn)題來(lái)了,怎么輸入想要的內(nèi)容給option呢?
這里官方爸爸說(shuō)我給它專(zhuān)門(mén)準(zhǔn)備了一個(gè)函數(shù):providerTileOptions(),有什么無(wú)理的需求都可以通過(guò)這個(gè)函數(shù)告訴options,拿透明度來(lái)舉例,providerTileOptions()里面有個(gè)opacity參數(shù),這個(gè)參數(shù)是設(shè)置透明度的,opacity從0(完全透明)到1(完全不透明)。具體實(shí)現(xiàn)看下面:
leaflet() %>%addTiles()%>%addProviderTiles("NASAGIBS.ViirsEarthAtNight2012",#使用夜光遙感影像,并設(shè)置透明度為0.6options = providerTileOptions(opacity=0.6)) %>%addProviderTiles(providers$Stamen.TonerLines,#疊加一層tiles,顯示公路和街道,并設(shè)置透明度為0.35options = providerTileOptions(opacity=0.35))3. 關(guān)于管道操作符“%>%”
還有許多的底圖也可以通過(guò)上述的方法進(jìn)行添加,這里就不一一贅述了。
在上面的代碼里面,我們可以發(fā)現(xiàn)一種奇怪的符號(hào):“%>%”,那這是什么符號(hào)呢?
依據(jù)官方的說(shuō)法,這種符號(hào)叫“管道操作符”,它的作用就是將前一條語(yǔ)句作為一個(gè)變量,傳遞給下一條語(yǔ)句,并且作為第一個(gè)參數(shù)使用,這樣就免去重復(fù)嵌套的麻煩,舉個(gè)栗子:
第一種寫(xiě)法:
m <- leaflet() a <- addTiles(m) addMarkers(a,lng=113.544840,lat=22.216005,popup="紀(jì)念孫中山市政公園")第二種寫(xiě)法:
m <-leaflet() %>%addTiles()%>%addMarkers(lng = 113.544840,lat=22.216005,popup="紀(jì)念孫中山市政公園")上述兩種寫(xiě)法的結(jié)果是一樣的,leaflet() %>% addTiles() 相當(dāng)于 addTiles(leaflet())
4. 添加地圖控件
一般而言,地圖控件包括以下:
(1)setView() ,設(shè)定地圖的view(包括center位置和zoom level);(2)flyTo(),切換到一個(gè)指定的location或zoom-level,使用光滑的pan-zoom;(3)fitBounds() ,設(shè)定地圖矩形區(qū)域邊界。view將限制在[lng1, lat1] - [lng2, lat2];(4)flyToBounds() ,切換到一個(gè)指定的地圖矩形區(qū)域邊界,使用光滑的pan/zoom;(5)setMaxBounds() ,限定地圖矩形區(qū)域最大邊界; (6)clearBounds() ,清除地圖矩形區(qū)域邊界,然后view將只會(huì)受地圖層的經(jīng)度和緯度數(shù)據(jù)限制。挑了幾個(gè)常用的地圖控件來(lái)試試,示例代碼如下:
library(leaflet) #設(shè)定中心坐標(biāo)和zoom level m<- leaflet() %>%setView(lng = -71.0382679,lat = 42.3489054,zoom =18) %>%addTiles()#修改zoom為 = 3 m<- leaflet() %>%setView(lng = -71.0382679,lat = 42.3489054,zoom =3) %>%addTiles()#顯示第一個(gè)view m %>% fitBounds(-72,40,-70,43)# 設(shè)定view邊界顯示第二個(gè)view m %>% clearBounds() # 清除邊界限制, leaflet()默認(rèn)為世界地圖
5. 給地圖添加圖標(biāo)(Markers)
有時(shí)候,我們的地圖上有一些重要的信息希望展示給觀看的人,那么這時(shí)候就得使用圖標(biāo)工具了,圖標(biāo)用于標(biāo)記地圖上特殊的點(diǎn),點(diǎn)的位置依賴(lài)于經(jīng)緯度來(lái)指定。
形如:
lng跟lat參數(shù)用于指定經(jīng)緯度,用于確定點(diǎn)位,popup參數(shù)用于表達(dá)點(diǎn)的信息。如果我們的數(shù)據(jù)是一種數(shù)據(jù)框的形式,例如有兩列字段分別是經(jīng)度跟緯度,就可以用**addMarkers(“經(jīng)度”,“緯度”)**的形式指定
形如:
6.在地圖上畫(huà)點(diǎn)
leaflet包支持各種與空間信息有關(guān)的對(duì)象,包括帶有空間信息的數(shù)據(jù)框、二維矩陣、sf包、maps包中的各種空間圖形信息等等。這些空間對(duì)象都可以通過(guò)leaflet繪制成圖層,疊加在一起。
接下來(lái)就簡(jiǎn)單實(shí)操一下:
7. 利用maps包提供的數(shù)據(jù)繪制地圖
library(maps) #加載maps包 mapFrance = map("france",fill = TRUE,plot = FALSE) #讀取法國(guó)的地圖 leaflet(data = mapFrance) %>%addTiles() %>%#Color為顏色設(shè)置,topo.colors是指顏色向量,alpha設(shè)置透明度addPolygons(fillColor = topo.colors(10,alpha = NULL),stroke = FALSE)8.讀取本地shapefile并進(jìn)行繪制
library("rgdal") #加載rgdal包來(lái)讀取shp文件 data <- readOGR("zhongshan2.shp",stringsAsFactors = FALSE) #讀取工作空間中的要素圖層 Encoding(data@data$Name)<- "UTF-8" #由于中文容易亂碼,所以用“utf-8”對(duì)中文字段進(jìn)行編碼#自定義配色方案對(duì)地圖進(jìn)行可視化 Npal <- colorNumeric(palette = "YlGnBu",domain = data$F2) #YIGnBu是 RColorBrewer包中萬(wàn)千配色之一,詳細(xì)看后面的小科普;domain是用于配色的字段,理解成arcgis中根據(jù)圖層的某個(gè)字段進(jìn)行配色leaflet(data)%>%addTiles() %>%addPolygons(stroke = TRUE,smoothFactor = 0.3,fillOpacity = 0.8, #填充透明度color = ~Npal(data$F2)) #另一種配色 leaflet(data)%>%addTiles()%>%addPolygons(popup=~ID,fillColor = topo.colors(10),stroke = FALSE)RColorBrewer
RColorBrewer包是R語(yǔ)言中的一款配色包,其包含了許多高大上的配色方案,我們上面使用的YIFnBu正是其中的一種,如下:
更多想了解的可以參考以下鏈接:
https://www.jianshu.com/p/a8856757a0d2
結(jié)語(yǔ)
關(guān)于leaflet包的介紹先到這里了~
下一節(jié)將更加講解leaflet包中關(guān)于顏色、圖例的設(shè)置所有的源碼都已經(jīng)打包,有需要自取
鏈接:
https://pan.baidu.com/s/14Av84k5dTy_XyeCRnSYrNA?pwd=h21o
提取碼:h21o
總結(jié)
以上是生活随笔為你收集整理的Leaflet包:从入门到跑路(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网上购车平台蛋蛋订车上私户兴起,与汽车之
- 下一篇: 机器视觉工程师前景如何,计算机视觉工程师