R(七): R開發實例-map熱力圖

来源:http://www.cnblogs.com/tgzhu/archive/2016/08/18/5782611.html
-Advertisement-
Play Games

第四章通過REmap包完成基於map分佈圖示例,前面提到REmap基於Echart2.0, 一方面在移動終端適應效果差,另一方面REmap提供的熱力圖僅支持全國及省市大版塊map,基於上面的原因,參考 http://echarts.baidu.com/examples.html#chart-type ...


     第四章通過REmap包完成基於map分佈圖示例,前面提到REmap基於Echart2.0, 一方面在移動終端適應效果差,另一方面REmap提供的熱力圖僅支持全國及省市大版塊map,基於上面的原因,參考 http://echarts.baidu.com/examples.html#chart-type-heatmap ,利用第四章清洗後的數據結合Echart3熱力圖控制項開發完整可縮放地圖的熱力分佈。

目錄:

  • 效果圖
  • 線上構建Echart3腳本包
  • R熱力圖頁面模板
  • R腳本

效果圖:


線上構建Echart3腳本包:

  • 在瀏覽器打開 http://echarts.baidu.com/builder.html, 選擇 "下載" -->"線上構建", 在打開的頁面選擇要打包的圖表,點擊 “下載”
  • 簡單起見,你可以選擇所有控制項後打包, build 完後保存為 “echarts3.min.js”

R熱力圖頁面模板


  • 參考Echart 熱力圖文檔,在R腳本定義模板及Class, 保存命名:DemoTemp.R
  • 示例代碼如下:
    setClass("my.map",
             representation(
               id = "character",
               option = "character",
               content = "character"
             ))
    
    my.mapH = function(data) {
      
      if (.Platform$OS.type == "windows") {
        locate = Sys.getlocale("LC_CTYPE")
        Sys.setlocale("LC_CTYPE", "eng")
      }
      
      if (!is.data.frame(data)) {
        stop("Map data should be a data frame.")
      }
      
      if (ncol(data) < 3 | nrow(data) == 0) {
        stop("Data should have at least 3 columns and 1 row")
      }
      
      
      if (!is.numeric(data[1, 1]) |
          !is.numeric(data[1, 2]) |
          !is.numeric(data[1, 3])) {
        data[, 1] = as.numeric(data[, 1])
        data[, 2] = as.numeric(data[, 2])
        data[, 3] = as.numeric(data[, 3])
      }
      
      
      heatdata = apply(data, 1, function(x) {
        out = sprintf('[%s,%s,%s]', x[1], x[2], x[3])
        return(out)
      })
      
      heatdata = paste(heatdata, collapse = ",\n")
      
      ### write remap object
      output = new("my.map")
      output@id = paste('ID', format(Sys.time(), "%Y%m%d%H%M%S"),
                        round(proc.time()[3] * 100), sep = "_")
      
      output@option = html.data.H$option
      head = html.data.H$head
      foot = html.data.H$foot
      
      if (.Platform$OS.type == "windows") {
        Sys.setlocale("LC_CTYPE", "chs")
      }
      
      output@option = sub("forChange", "һ", output@option)
      
      output@option = sub("heatMapData",
                          heatdata, output@option)
      
      ## optionNameData
      output@option = sub("optionNameData",
                          paste0("option", output@id), output@option)
      outputFoot = sub("optionNameData",
                       paste0("option", output@id), foot)
      
      output@option = strsplit(output@option, "kkkmmm")[[1]][2]
      output@content = paste(head, output@option, outputFoot, sep = "\n")
      
      if (.Platform$OS.type == "windows") {
        Sys.setlocale("LC_CTYPE", locate)
      }
      return(output)
    }
    
    
    html.data.H = list(
      head = "<html>
      <head>
      <meta charset=\"utf-8\">
      <style type=\"text/css\">
      body {
      margin: 0;
      }
      #main {
      height: 100%;
      }
      </style>
      </head>
      <body>
      <div id=\"main\"></div>
      <script src=\"./js/echarts.js\"></script>
      <script src=\"./js/bmap.js\"></script>
      <script src = \"http://api.map.baidu.com/api?v=2.0&ak=密鑰\"></script>
      <script>
      var myChart = echarts.init(document.getElementById(\"main\"));
      
      ",
      option = "forChangekkkmmm
      var heatData = [heatMapData];
      var optionNameData =
      {
      animation: false,
      bmap: {
      center: [103.855096, 36.056805],
      zoom: 5,
      min: 4,
      max:12,
      roam: true
      },
      visualMap: {
      show: true,
      top: 'top',
      min: 1,
      max: 50,
      seriesIndex: 0,
      calculable: true,
      inRange: {
      color: ['blue', 'blue', 'green', 'yellow', 'red']
      }
      },
      series: [{
      type: 'heatmap',
      coordinateSystem: 'bmap',
      data: heatData,
      pointSize: 6,
      blurSize: 8
      }]
      }",
      foot = ";
      myChart.setOption(optionNameData);
      </script>
      </body>
      </html>"
      )
    View Code

 

 R腳本


  •  R腳本代碼,demo.rda 為清洗後保存的數據,示例
    run <- function(...) {
      map_name <- my.writeMapH()
      out(map_name)
    }
    
    my.writeMapH <- function() {
      
      path = c("/var/www/html")
      file_name = paste0("3.0/Demo")
      full_path = paste0(path, "/", file_name, ".html")
      if (file.exists(full_path)) {
        return(file_name)
      }
      
      source("/var/FastRWeb/web.R/DemoTemp.R")
      tmp <- load("/var/FastRWeb/web.R/demo.rda")
      data <- data.frame(pdata$lon,pdata$lat,c(1))
      out <- my.mapH(data)
      
      writeLines(out@content, full_path, useBytes = T)
      return(file_name);
    }
    View Code
  •  通過FastRWeb框架調用R腳本成功後,返回的是在/var/www/html目錄下生成的文件名
  • client再次發起請求,調用html文件
  • 註意: 在/var/www/html 目錄下部署腳本引用的 js 文件

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • title: Android Button的基本使用 tags: Button,按鈕 Button介紹: Button(按鈕)繼承自TextView,在Android開發中,Button是常用的控制項,用起來也很簡單,你可以在界面xml描述文檔中定義,也可以在程式中創建後加入到界面中,其效果都是一樣的 ...
  • 前言:swift語法基礎篇(二)來了,想學習swift的朋友可以拿去參考哦,有興趣可以相互探討,共同學習哦. 一.可選類型(重點內容) 1.什麼是可選類型? 1.1在OC開發中,如果一個變數暫停不使用,可以賦值為0(基本屬性類型)或者賦值為空(對象類型) 1.2在swift開發中,nil也是一個特殊 ...
  • 在應用圖標右上角添加消息數提醒,可以很方便的告知用戶該應用中有無新消息需要處理。下麵用xcode 7.3.1來簡要說明一下如何用swift語言進行此功能的實現。 1、修改 AppDelegate.swift 2 修改在ViewController.swift 3 編譯運行 第一次會彈出詢問是否允許推 ...
  • Socket 是應用層與 TCP / IP 協議通信的中間軟體抽象層,它是一組介面 TCP:面向連接、傳輸可靠(保證數據正確性,保證數據順序)、用於傳輸大量數據(流模式)、速度慢,建立連接需要開銷較多(時間,系統資源)。 UDP:面向非連接、傳輸不可靠、用於傳輸少量數據(數據包模式)、速度快 常用的 ...
  • 給工程師一個標準的估算項目時間 一個曾經與我一起工作過的經驗豐富的項目經理聲稱,他拿到程式員的時間估算以後,先將它乘以π,然後轉化下一個時間數量級後,才能得到真正的值。1天轉化成3.14周。他過去因為程式員不擅長估算時間而吃盡了苦頭。我創建了一個用來翻譯程式員時間估算的表格,來儘量縮小估算錯誤。 時 ...
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.h RootViewController.m ...
  • 之前對HTTPS通信過程有過瞭解,HTTPS是應用HTTP協議使用SSL加密的版本,在TCP和HTTP之間增加SSL協議。通過握手階段認證雙方身份,協商對稱秘鑰對通信信息進行加密。此處只描述常用的伺服器單向驗證,大致過程簡要描述如下: 0:事先Web伺服器把自己的公鑰和Web信息提交給權威CA,CA ...
  • 分析文本內容基本的步驟:提取文本中的詞語 -> 統計詞語頻率 -> 詞頻屬性可視化。詞頻:能反映詞語在文本中的重要性,一般越重要的詞語,在文本中出現的次數就會越多。詞雲:讓詞語的頻率屬性可視化,更加直觀清晰。文本下載地址(http://www.yuandn.com/booktxt/59797/#do ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...