ECharts模擬百度遷徙實例

来源:https://www.cnblogs.com/gwzzayy/archive/2019/08/02/11289024.html
-Advertisement-
Play Games

本實例原始信息: 作者: "anix" 演示地址: "Echarts模擬遷徙" 源碼地址: "GitHub ananix qianxi" 前言 “百度地圖春節人口遷徙大數據”(簡稱“百度遷徙”)是百度在春運期間推出的技術品牌項目,為業界首個以“人群遷徙”為主題的大數據可視化項目。 準備 開發工具 由 ...


本實例原始信息:
作者:anix
演示地址:Echarts模擬遷徙
源碼地址:GitHub-ananix-qianxi

前言

“百度地圖春節人口遷徙大數據”(簡稱“百度遷徙”)是百度在春運期間推出的技術品牌項目,為業界首個以“人群遷徙”為主題的大數據可視化項目。

百度遷徙,圖片來自於百度百科

準備

  • 開發工具
    由於是前端頁面項目,所以一般的編輯器都可以,推薦使用vs code
    如果要自己掛載本地geo地圖,則需要本地伺服器環境,使用vs code時,安裝Live Server插件即可
  • 引入文件
    echarts文件*
    地圖文件
    jquery文件

編寫

  1. 引入資源
<!-- 線上資源-->
  <!-- <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script> -->
  <!-- <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js"></script> -->
<!--本地資源-->  
    <script src="js/echarts.js"></script>
    <script src="js/jquery.js"></script>
    <!-- <script src="js/china.js"></script> -->
  1. 準備dom(將來放echarts圖表的位置)
<div id="container" style="height: 100%"></div>
  1. 初始化一個 echarts 實例
 // 基於準備好的dom,初始化echarts實例
 // 方式一:使用china.js地圖初始化方式
 // var myChart = echarts.init(document.getElementById('container'));
 // 方式二:使用地定義geo地圖文件初始化方法,需要提前準備好china.json地圖文件
 $.get('js/map/china.json', function (chinaJson) {
            //註冊地圖
            echarts.registerMap('china', chinaJson);
            //初始化echarts實例
            var dom = document.getElementById("container");
            var myChart = echarts.init(dom);
                        
                        //...option
                        //...data
                        //...set
                        //...
                        
        });
  1. 指定圖表的配置項和數據
// 在上一步option的位置
//  0 準備option對象
option = null;
// 1 準備數據
            // 地區坐標信息
            var geoCoordMap = {
                '上海': [121.4648, 31.2891],
                '東莞': [113.8953, 22.901],
                '東營': [118.7073, 37.5513],
                '中山': [113.4229, 22.478],
                '臨汾': [111.4783, 36.1615],
                            //...
                //此處省略部分數據...
                '長治': [112.8625, 36.4746],
                '陽泉': [113.4778, 38.0951],
                '青島': [120.4651, 36.3373],
                '韶關': [113.7964, 24.7028]
            };

            // 準備流向信息,value為地區的數據值
            var BJData = [
                [{ name: '北京' }, { name: '上海', value: 95 }],
                [{ name: '北京' }, { name: '廣州', value: 90 }],
                [{ name: '北京' }, { name: '大連', value: 80 }],
                [{ name: '北京' }, { name: '南寧', value: 70 }],
                [{ name: '北京' }, { name: '南昌', value: 60 }],
                [{ name: '北京' }, { name: '拉薩', value: 50 }],
                [{ name: '北京' }, { name: '長春', value: 40 }],
                [{ name: '北京' }, { name: '包頭', value: 30 }],
                [{ name: '北京' }, { name: '重慶', value: 20 }],
                [{ name: '北京' }, { name: '常州', value: 10 }]
            ];

            var SHData = [
                [{ name: '上海' }, { name: '包頭', value: 95 }],
                //省略部分數據...
            ];

            var GZData = [
                [{ name: '廣州' }, { name: '福州', value: 95 }],
                //省略部分數據...
                [{ name: '廣州' }, { name: '海口', value: 10 }]
            ];

            var LZData = [
                [{ name: '蘭州' }, { name: '福州', value: 95 }],
               //省略部分數據...
            ];
                        
            // 流向圖標,可自定義
            var planePath = 'arrow'
                    
            var convertData = function (data) {
                var res = [];
                for (var i = 0; i < data.length; i++) {
                    var dataItem = data[i];
                    var fromCoord = geoCoordMap[dataItem[0].name];
                    var toCoord = geoCoordMap[dataItem[1].name];
                    if (fromCoord && toCoord) {
                        res.push({
                            fromName: dataItem[0].name,
                            toName: dataItem[1].name,
                            coords: [fromCoord, toCoord]
                        });
                    }
                }
                return res;
            };
                    
            var color = ['#a6c84c', '#ffa022', '#46bee9'];
                        // 準備自己個性化的數據
            var lanzhou = {
                name: '點',
                type: 'effectScatter',
                coordinateSystem: 'geo',
                zlevel: 3,
                rippleEffect: {
                    brushType: 'stroke'
                    //波紋的繪製方式,可選 'stroke' 和 'fill'
                },
                showEffectOn: "render",//顯示漣漪
                label: {
                    normal: {
                        show: true,
                        position: 'left',
                        formatter: '{b}'
                    }
                },
                symbolSize: function (val) {
                    return val[2] / 180;
                },
                itemStyle: {
                    normal: {
                        color: "red"
                    }
                },
                                
                                // 
                data: [
                    {
                        name: "lanzhou",
                        value: [103.5901, 36.3043, 1092],
                        tooltip: {
                            //formatter: '中心資源校: <br />{b0}'
                            formatter: function (item, ticket, callback) {
                                let res = "中心資源校:" + item.name + "<br />地區教學點:";
                                for (let i = 0, l = LZData.length; i < l; i++) {
                                    res += '<br/>& ' + LZData[i][1].name;
                                }
                                return res
                            },
                        }
                    }
            //...
            // 準備系列series   
            var series = [lanzhou];
            [['北京', BJData], ['上海', SHData], ['廣州', GZData], ['蘭州', LZData]].forEach(function (item, i) {
                series.push({
                    name: item[0] + ' Top10',
                    type: 'lines',
                    zlevel: 1,
                    effect: {
                        show: true,
                        period: 6,
                        trailLength: 0.7,
                        color: '#fff',
                        symbolSize: 3
                    },
                    lineStyle: {
                        normal: {
                            color: color[i],
                            width: 0,
                            curveness: 0.2
                        }
                    },
                    data: convertData(item[1])
                },
                    {
                        name: item[0] + ' Top10',
                        type: 'lines',
                        zlevel: 2,
                        tooltip: {
                            //formatter: '{a} >{b}{c1}{d}'
                            formatter: function (sdasd, ticket, callback) {
                                let res = "" + sdasd.data.fromName + "->>>" + sdasd.data.toName;
                                return res
                            },
                        },
                        symbol: ['none', 'arrow'],
                        symbolSize: 10,
                        effect: {
                            show: true,
                            period: 6,
                            trailLength: 0,
                            symbol: planePath,
                            symbolSize: 8
                        },
                        lineStyle: {
                            normal: {
                                color: color[i],
                                width: 1,
                                opacity: 0.6,
                                curveness: 0.2
                            }
                        },
                        data: convertData(item[1])
                    },

                    //地圖上的點
                    {
                        name: item[0] + ' Top10',
                        type: 'effectScatter',
                        coordinateSystem: 'geo',
                        zlevel: 2,
                        rippleEffect: {
                            brushType: 'stroke'
                            //波紋的繪製方式,可選 'stroke' 和 'fill'
                        },
                        showEffectOn: "emphasis",//高亮時候顯示漣漪
                        label: {
                            normal: {
                                show: true,
                                position: 'right',
                                formatter: '{b}'
                            }
                        },
                        symbolSize: function (val) {
                            return val[2] / 8;
                        },
                        itemStyle: {
                            normal: {
                                color: color[i]
                            }
                        },
                        tooltip: {
                            formatter: '地區教學點: <br />{b0} '
                        },
                        data: item[1].map(function (dataItem) {
                            return {
                                name: dataItem[1].name,
                                value: geoCoordMap[dataItem[1].name].concat([dataItem[1].value])
                            };
                        })
                    });
            });                 
// 2 將數據放到option里
option = {
                backgroundColor: '#404a59',
                title: {
                    text: '教育資源流向',
                    subtext: '數據純屬虛構',
                    left: 'center',
                    textStyle: {
                        color: '#fff'
                    }
                },
                tooltip: {
                    trigger: 'item',
                    //formatter: '中心資源校:{b0}<br />地區教學點:{b1}{c}{d}'

                },
                legend: {
                    orient: 'vertical',
                    top: 'bottom',
                    left: 'right',
                    data: ['北京 Top10', '上海 Top10', '廣州 Top10', '蘭州 Top10'],
                    textStyle: {
                        color: '#fff'
                    },
                    selectedMode: 'multiple'//'single' 或者 'multiple' 使用單選或者多選模式
                },
                geo: {
                    map: 'china',
                    label: {
                        emphasis: {
                            show: false
                        }
                    },
                    roam: true,
                    itemStyle: {
                        normal: {
                            areaColor: '#323c48',
                            borderColor: '#404a59'
                        },
                        emphasis: {
                            areaColor: '#2a333d'
                        }
                    }
                },
                series: series
        };
  1. 註冊option顯示圖表
     if (option && typeof option === "object") {
         //註冊option顯示圖表
        myChart.setOption(option, true);
       }
  1. 加自己的相關控制代碼
           //自己的控制代碼
            myChart.on('click', function (params) {
                var labelselect;
                if (params.componentSubType === 'effectScatter') {
                    // 點擊到了 effectScatter 上
                    switch (params.name + " Top10") {
                        case "上海 Top10":
                            labelselect = {
                                "上海 Top10": true,
                                "蘭州 Top10": false,
                                "北京 Top10": false,
                                "廣州 Top10": false
                            };
                            break;
                        case "lanzhou Top10":
                            labelselect = {
                                "上海 Top10": false,
                                "蘭州 Top10": true,
                                "北京 Top10": false,
                                "廣州 Top10": false
                            };
                            break;
                        case "北京 Top10":
                            labelselect = {
                                "上海 Top10": false,
                                "蘭州 Top10": false,
                                "北京 Top10": true,
                                "廣州 Top10": false
                            };
                            break;
                        case "廣州 Top10":
                            labelselect = {
                                "上海 Top10": false,
                                "蘭州 Top10": false,
                                "北京 Top10": false,
                                "廣州 Top10": true
                            };
                            break;
                        default:
                            labelselect = {
                                "上海 Top10": false,
                                "蘭州 Top10": false,
                                "北京 Top10": false,
                                "廣州 Top10": false
                            };
                    }
                }
                option.legend.selected = labelselect;
                myChart.setOption(option, true);
            });

測試

其他工具自行啟動服務訪問文件即可
vs code右鍵,點擊open with live server即可
。。。

擴展

結合百度地圖的模擬遷徙


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

-Advertisement-
Play Games
更多相關文章
  • 前置閱讀:簡述JavaScript模塊化(一) 在前面一文中,我們對前端模塊化所經歷的三個階段進行了瞭解: CommonJs,由於是同步的,所以主要應用於伺服器端,以Node.js為代表。 AMD,非同步模塊定義,預載入,推薦依賴前置。以require.js為代表。 CMD,通用模塊載入,懶載入,推薦 ...
  • 與數學中的集合概念類似,集合由一組無序的元素組成,且集合中的每個元素都是唯一存在的。可以回顧一下中學數學中集合的概念,我們這裡所要定義的集合也具有空集(即集合的內容為空)、交集、並集、差集、子集的特性。 在ES6中,原生的Set類已經實現了集合的全部特性,稍後我們會介紹它的用法。 我們使用JavaS ...
  • 一、HTML代碼如下: 二、JavaScript代碼如下: ...
  • 輪播效果: HTML: JS: ...
  • 在早期編寫JavaScript時,我們只需在<script>標簽內寫入JavaScript的代碼就可以滿足我們對頁面交互的需要了。但隨著時間的推移,時代的發展,原本的那種簡單粗暴的編寫方式所帶來的諸如邏輯混亂,頁面複雜,可維護性差,全局變數暴露等問題接踵而至,前輩們為瞭解決這些問題提出了很種的解決方 ...
  • 一、redux-saga解決非同步 redux-thunk 和 redux-saga 使用redux它們是必選的,二選一,它們兩個都可以很好的實現一些複雜情況下redux,本質都是為瞭解決非同步action而生,使redux保持完整性,不至於太過混亂。redux-saga 是一個用於管理Redux 應用 ...
  • 因為項目需求,最近開始轉到微信公眾號開發,接觸到了Vue框架,這個效果的實現雖說是基於Vue框架下實現的,但是同樣也可以借鑒到其他地方,原理都是一樣的。 進入正題,先看下效果圖: 其實js做這個效果還是挺簡單的,因為在css中我們可以設置一個元素的position: fixed;,這樣它就可以固定在 ...
  • 本例結合我的前兩篇博客,使用jquery moblie框架搭建了一個簡單的手機版博客園;項目地址為http://blog.mdzz.tv:1011,這裡我僅爬取了博客園首頁的鏈接,點擊每一項即跳轉到博客園相應的頁面,源碼已放在github上了,地址https://github.com/guasses... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...