時空維度挖掘(二)之 leaflet

概述

本文是時空維度挖掘系列的第二篇,將引進空間挖掘中的重量級嘉賓 leaflet。在互聯網競爭日益激烈的今天,一方面,online業務藍海愈來愈少,擴展成本也愈來愈高,許多互聯網企業開始介入地推,甚至出現了好比望京掃碼一條街這樣的經典案例;另外一方面,offline的傳統行業在經歷這幾年的洗禮,不斷增強線下精細化運營的基礎設施,支付寶微信支付走進街邊小店。打通線上線下的供應鏈一體化,成爲了BAT以外的幾乎惟一機會,也就是馬雲口中所謂的新零售。在這樣的機會窗口下,在地圖的基礎設施上孕育出了像 AirBnb、Uber、滴滴、美團、餓了嗎等等新時代獨角獸。html

咱們能夠預見,當下掌握空間維度挖掘對於洞察新零售時代經濟走向很是重要,本文將簡單介紹空間維度挖掘中的一些經常使用工具,並重點介紹空間可視化框架leaflet。前端

空間挖掘關鍵R包

  • sp: 處理地理數據的基礎包
  • rgdal: 封裝 GDAL (一個開源地理數據抽象庫,提供很是豐富的地理數據讀寫驅動))
  • rgeos: 封裝 GEOS 一個開源幾何引擎, 提供幾何模型、幾何關係判斷、基本幾何計算操做等功能
  • proj4:PROJ4 一個開源地圖投影庫,提供豐富的地圖投影轉換算法。
  • tmap: 專題圖(thematic map)
  • ggmap: 添加地圖圖層:別錄 Google Maps, Open Street Maps
  • leaflet: 現代移動優先的交互式地圖繪製框架
  • spatstat: 空間點格局分析
  • gstat: 地質統計學建模
  • leaflet.extras:leaflet 插件
  • leaflet.esri: ESRI拓展包
  • spdep: 空間相關性分析
  • gstat:空間插值

對於空間數據挖掘的一些入門介紹能夠參考此文:R空間數據處理與可視化git

什麼是 leaflet

leaflet.js 是一個現代面向用戶體驗的輕量GIS庫,適用於免費、專業、快速的地圖原型開發,擁有豐富第三方插件生態系統,已經成爲數據科學在空間數據可視化領域的事實標準,至關於GIS中的ggplotgithub

R 中的leaflet 包是由 RStudio 公司製做的leaflet.js封裝,在此基礎上還有若干 leaflet 插件,好比leaflet.esrileaflet.extras 能夠提供諸如熱力圖之類的高級功能等。web

核心要素

leaflet 主要包含了下面9個核心要素算法

  1. 基礎組件:規定地圖的底圖、初始化視角、圖層等
  2. 標記(扎針)
  3. 彈窗:表示相應事件
  4. 幾何圖形:用點線面表示熱點、線路、區域等
  5. GeoJSON/TopoJSON:一般按行政區域劃分
  6. 柵格:一般按米制經緯度劃分
  7. 圖例與顏色
  8. 圖層控制:圖層分組與綁定
  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 = '&copy; <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)
  ) # 分組控制

clipboard.png

更進一步,圖層數量增長,須要分組的時候,就涉及到多組圖層的控制。經過addLayersControl 來增長圖層的分組控制能力。後端

圖層服務器能夠做爲單獨的一項服務來定製後端服務,而後經過分享相應的圖層再疊加的方式加速前端呈現的性能。

Shiny與事件控制

clipboard.png

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()

clipboard.png

# 經過 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個部分組成:

  1. data: 原始的dataframe
  2. coords.nrs: 原始數據在那一列(nrow)
  3. coords: 座標信息
  4. bbox: 經過一個矩形來定義地圖視野中的邊界
  5. proj4string: 這是座標參考系統(Coor Reference System 簡稱 CRS)

算法

空間計算中點、線、面的數據

http://desktop.arcgis.com/zh-cn/arcmap/latest/tools/analysis-toolbox/GUID-6FD5566F-FE23-4289-AA6D-AC1A6CA0CF6E-web.png

1、疊置分析

2、鄰域分析

3、窗口分析

案例

clipboard.png

clipboard.png

參考資料

相關產品

相關文章
相關標籤/搜索