本文是時空維度挖掘系列的第二篇,將引進空間挖掘中的重量級嘉賓 leaflet。在互聯網競爭日益激烈的今天,一方面,online業務藍海愈來愈少,擴展成本也愈來愈高,許多互聯網企業開始介入地推,甚至出現了好比望京掃碼一條街這樣的經典案例;另外一方面,offline的傳統行業在經歷這幾年的洗禮,不斷增強線下精細化運營的基礎設施,支付寶微信支付走進街邊小店。打通線上線下的供應鏈一體化,成爲了BAT以外的幾乎惟一機會,也就是馬雲口中所謂的新零售。在這樣的機會窗口下,在地圖的基礎設施上孕育出了像 AirBnb、Uber、滴滴、美團、餓了嗎等等新時代獨角獸。html
咱們能夠預見,當下掌握空間維度挖掘對於洞察新零售時代經濟走向很是重要,本文將簡單介紹空間維度挖掘中的一些經常使用工具,並重點介紹空間可視化框架leaflet。前端
對於空間數據挖掘的一些入門介紹能夠參考此文:R空間數據處理與可視化git
leaflet.js 是一個現代面向用戶體驗的輕量GIS庫,適用於免費、專業、快速的地圖原型開發,擁有豐富第三方插件生態系統,已經成爲數據科學在空間數據可視化領域的事實標準,至關於GIS中的ggplot
。github
R 中的leaflet 包是由 RStudio 公司製做的leaflet.js封裝,在此基礎上還有若干 leaflet 插件,好比leaflet.esri、leaflet.extras 能夠提供諸如熱力圖之類的高級功能等。web
leaflet 主要包含了下面9個核心要素算法
經過圖層的疊加,咱們能夠根據自身需求觀測到不一樣維度的數據變化狀況,圖層的基本格式以下:shell
http://{s}.tile.osm.org/{z}/{x}/{y}.png
s
表示圖層提供方來源z
表示zoom縮放的比例x
表示經度y
表示緯度其中zoom的範圍在[0,20],其中0表示整個世界,13表示鄉鎮街道,19表示最小單位像素,一般圖層由256x256的png圖片拼接起來。json
目前,leaflet 經過addTiles()
函數便可實現圖層添加,默認的圖層提供方是 OpenStreetMap 簡稱OSM
,一樣咱們能夠添加高德地圖、百度地圖、MapBox、ESRI等等或自定義,這裏以高德地圖爲例(再次感謝高德數據分析師):segmentfault
x =116.310003 y =39.991957 leaflet() %>% addTiles( 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', tileOptions(tileSize=256, minZoom=9, maxZoom=17), attribution = '© <a href="http://ditu.amap.com/">高德地圖</a>', ) %>% # 添加高德底圖 也能夠用 leafletCN::amap() 代替 setView(lng = x,lat = y,zoom = 13) %>% # 設置默認視角 addMarkers(lng = x,lat=y)%>% # 添加標記點位 addGraticule(interval = 0.01,group = "graticule") %>% # 經緯網格 addLayersControl( overlayGroups = c("graticule"), options = layersControlOptions(collapsed = FALSE) ) # 分組控制
更進一步,圖層數量增長,須要分組的時候,就涉及到多組圖層的控制。經過addLayersControl
來增長圖層的分組控制能力。後端
圖層服務器能夠做爲單獨的一項服務來定製後端服務,而後經過分享相應的圖層再疊加的方式加速前端呈現的性能。
leaflet 中提供許多與shiny結合的事件控制特性,好比對不一樣leaflet對象的點擊、懸停、雙擊等等。
經過 leafletProxy()
能夠對 leaflet 地圖對象作額外的操做,好比切換圖層,添加圖層 addXXX,移除圖層 clearXXX。
假設如今經過 leaflet 地圖對象Id 爲 map:
leafletOutput("map", width = "100%", height = "100%")
leaflet 交互事件 遵循這個命名規則: input$MAPID_OBJCATEGORY_EVENTNAME
,
對應的輸出爲一個list,好比
{ "lat":23.12321, "lng":123.123123, "id":"map", "featureId":"xxx", # 只有geojson纔有 "properties":"xxx" # 只有geojson纔有 }
那麼能夠經過下面代碼捕捉對應事件:
input$map_shape_click # 獲取多邊形點擊 input$map_marker_click # 獲取標識點擊 input$map_geojson_click # 獲取geojson點擊 input$map_topojson_click # 獲取 topojson點擊 input$map_click # 任意點擊地圖位置 返回經緯度和圖層id,以list的形式返回, input$map_mouseover # 鼠標懸停 input$map_mouseout # 鼠標移出 input$map_bounds # 地圖視野邊界, 經過bounds 能夠控制數據只顯示視野內來加快數據渲染效果。返回的結果以 north, east, south, west 的一組list呈現 input$map_zoom # 返回視野深度 一般在 0-19之間
目前 leaflet.extras 也支持更多的插件中的事件。好比能夠經過多邊形的編輯實現地理圍欄:
leaflet::leaflet() %>% leafletCN::amap()%>% leaflet::setView(lng = 116,lat = 39, zoom = 12) %>% addDrawToolbar( targetGroup='draw', editOptions = editToolbarOptions(selectedPathOptions = selectedPathOptions())) %>% addLayersControl(overlayGroups = c('draw'), options = layersControlOptions(collapsed=FALSE)) %>% addStyleEditor()
# 經過 input$MAPID_draw_all_features 會返回地理圍欄的相關信息 # input$MAPID_draw_start 返回 繪製開始 信息 # input$MAPID_draw_stop 返回 繪製中止 信息 # input$MAPID_draw_new_feature 返回 建立繪製 信息 # input$MAPID_draw_edited_features 返回 編輯繪製 信息 # input$MAPID_draw_deleted_features 返回 刪除繪製 信息 observeEvent(input$map_draw_all_features,{ #print("All Features") num_features <- length(input$map_draw_all_features$features) if (is.null(unlist(input$map_draw_all_features$features[num_features]))){ return(NULL) }#判空 if(input$map_draw_all_features$features[[num_features]]$properties$feature_type != 'polygon') { return(NULL) } cords_list <- input$map_draw_all_features$features[[num_features]]$geometry$coordinates[[1]] })
這裏有一個用於表述地理數據的特殊數據框,被稱爲 SpatialPointsDataFrame,經過它能夠實現空間幾何中點、線、面的表達。
它主要有下面5個部分組成:
空間計算中點、線、面的數據