數據視化Echarts+百度地圖API實現市縣區級下鑽


開始

  這兩天公司有個頁面需要做數據可視化的展示,數據視化采用的是Echarts+百度地圖API做展示,需要用到縣級區級下鑽的一個聯動效果發現網上關於Echarts做到縣區級下鑽的資料很少,有的話也不是很詳細,對於剛接觸Echarts的讓人來說可能有些搞不明白,在這里我把Echarts下鑽開發過程中總結的知識分享給大家,也能使自己加深印象,當然啦,對於一些在軟件行業折騰了幾年的老油條來說,這些都是一些非常基礎的東西。但是還是希望能幫助到那些剛接觸Echarts遇到類似問題需要幫助的人。如果哪里寫的不對,或者有更好的方法,也歡迎大家吐槽留言,互相學習。

進入正題

  我這里用的是Echarts2.2.7,這是官網http://echarts.baidu.com/echarts2/;首先下載Echarts包引入Echarts.js

  然后再准備兩個個DIV,配置路徑,使用MAP,官網有說明http://echarts.baidu.com/echarts2/doc/start.html

  這里就不細說了,講下官網沒有的。中國地圖下鑽到省級聯動效果。

第一步

加載中國地圖都准備好了后再函數里定義一個option來設置中國地圖的樣式如下:

 1 function (ec) {
 2       // 基於准備好的dom,初始化echarts圖表
 3       var myChart = ec.init(document.getElementById('main'));
 4       var SubordinateMap = ec.init(document.getElementById('subordinate'));
 5 
 6       option = {
 7           tooltip : {
 8               trigger: 'item', //提示框的觸發類型。
 9               formatter: '{b}' //內容格式器可以支持異步回調函數。返回一個你想要提示的字符串就可以了
10           },
11           dataRange: { //值域選擇
12               min: 0,
13               max: 100,
14               calculable: false,
15               show: false,
16               color: ['#ff3333', 'orange', 'yellow', 'lime', 'aqua'],
17               textStyle: {  //文字顏色
18                   color: '#fff'
19               }
20           },
21           series: [   //圖表生成的數據內容數組
22               {
23                   name: '中國',
24                   type: 'map',   //圖表類型為地圖
25                   mapType: 'china',   //地圖類型中國地圖,
26                   selectedMode: 'single', //選中模式,可以設置多選模式和單選,不能選擇則刪除刪除屬性
27                   hoverable: false,   //懸浮是否高亮
28                   itemStyle:{
29                       normal: {        //地圖樣式
30                           borderColor: '#71D1FF', //地圖邊界顏色
31                           color: '#070C67'  //地圖顏色
32                       },
33                       emphasis: {   //地圖選中時樣式
34                           label: {
35                               show: true,
36                               textStyle: {
37                                   color: '#fff' //選中時區域名字顏色
38                               },
39                           },
40                           color: '#71D1FF' //選中時顏色
41                       }
42                   },
43                   data:[
44                       {name:'廣東',selected:true}   //廣東默認別選中
45                   ],
46                   geoCoord: {   //每個城市對應的經緯度
47                       '上海': [121.4648,31.2891] }...//類似數據省略

這個是全國地圖,最后在使用setOption()方法加載地圖:

1 myChart.setOption(option, true);

第二步通過on事件實現省級下鑽

添加一個省級對象(類似第一步的option)設置樣式數據等,Echarts2.2.7這里不需要下載省級地圖,直接通過Data設置數據讀取就可以了:

 1                 //省級
 2                 provinceO = {
 3                     title: { //標題
 4                         text: '全國34個省市自治區',
 5                         subtext: '省級'
 6                     },
 7                     tooltip: {
 8                         trigger: 'item'  //提示框的觸發類型。
 9                     },
10                     legend: {   //圖列
11                         orient: 'vertical', //圖列顯示的方式
12                         x: 'right',
13                         data: ['隨機數據']
14                     },
15                     series: [
16                         {
17                             name: '隨機數據',
18                             type: 'map',
19                             mapType: '湖南',  //要顯示的省份,下鑽就是通過on事件來更改屬性
20                             selectedMode: 'single', //選中模式,可以設置多選模式和單選,不能選擇則刪除刪除屬性
21                             itemStyle: {
22                                 normal: {
23                                     label: { show: true }, //是否顯示城市名字
24                                     borderColor: '#71D1FF',  //地圖邊界顏色
25                                     color: '#070C67'
26                                 },
27                                 emphasis: { label: { show: true } } //選中后樣式
28 
29                             },
30                             data: [
31                                 { name: '重慶市', value: Math.round(Math.random() * 1000) }}....//類似數據省略


通過on來更改series下的mapType屬性,然后通過setOption方法來給第二個DIV加載地圖(當然也可以直接給第一個DIV重新加載),這樣就實現下鑽到省的聯動效果了;

1               var ecConfig = require('echarts/config');
2                    myChart.on(ecConfig.EVENT.MAP_SELECTED, function (param) {
3                      var name = param.target;//獲得選中的城市
4                      provinceO.series[0].mapType = name;//設置series的mapType屬性為當前選中的城市
5                      SubordinateMap.setOption(provinceO, true);//給SubordinateMapDIV重現加載地圖
6 
7                  });

第三步通實現市級下鑽效果
通過一個數組綁定每個城市對應的文件名:

1 var cityMap = {
2                       "北京市": "110100", //每個城市對應的json文件名
3                       "天津市": "120100",
4                       "上海市": "310100",
5                       "重慶市": "500100"}//重復數據省略

通過循環引入地圖數據:

 1           var mapType = [];
 2                  var mapGeoData = require('echarts/util/mapData/params');
 3                  //console.log(mapGeoData)
 4                  for (var city in cityMap) { //通過循環來引入數據
 5                      mapType.push(city);
 6                      // 自定義擴展圖表類型
 7                      mapGeoData.params[city] = {
 8                          getGeoJson: (function (c) {
 9                              var geoJsonName = cityMap[c]; //通過cityMap數組得到JSON文件名
10                              return function (callback) {
11                                  $.getJSON('geoJson/' + geoJsonName + '.json', callback);  //得到地圖JSON文件數據,首先你本地路徑下得有這個JSON文件
12                              }
13                          })(city)
14                      }
15                  }

添加一個市級對象設置樣式數據,跟上面不同的是這里需要地圖數據,因為Echarts沒有帶市級地圖,需要自己去網上找地圖數據:

 1           //市級
 2                 cityO = {
 3                     title: { //標題
 4                         text: '全國344個主要城市'
 5                     },
 6                     tooltip: {
 7                         trigger: 'item',   //提示框的觸發類型。
 8                         formatter: '{b}'  //內容格式器可以支持異步回調函數。返回一個你想要提示的字符串就可以了
 9                     },
10                     series: [  //圖表生成的數據內容數組
11                         {
12                             name: '全國344個主要城市(縣)地圖',
13                             type: 'map',  //類型為地圖,
14                             mapType: '北京市', //要顯示的市,下鑽就是通過on事件來更改屬性
15                             selectedMode: 'single',//選中模式,可以設置多選模式和單選,不能選擇則刪除刪除屬性
16                             itemStyle: {
17                                 normal: {
18                                     label: { show: true }, //是否顯示城市名字
19                                     borderColor: '#71D1FF',  //地圖邊界顏色
20                                     color:'#070C67'
21                                 },
22                                 emphasis: { label: { show: true } } //選中后的樣式
23                             },
24                             data: []
25                         }
26                     ]
27                 };

然后通過on來更改series下的mapType屬性,在通過setOption方法來給第二個DIV重新加載地圖就實現下鑽到市級了。

1           SubordinateMap.on(ecConfig.EVENT.MAP_SELECTED, function (param) {
2                 var name = param.target;//獲得選中的城市
3                 cityO.series[0].mapType = name;//設置series的mapType屬性為當前選中的城市
4                 SubordinateMap.setOption(cityO, true);//給SubordinateMapDIV重現加載地圖
5             });

如果你還需要下鑽到更小范圍比如區級,那就只能跟百度地圖API結合了,PS:當然也可以用Ehcarts自定義地圖實現但是每個縣的區級地圖JSON數據網上也沒有,
並且Echarts生成也只能生成到縣。

如何下鑽到縣區級:
實現效果:點擊某個市的縣后,在到百度地圖上框出邊界線,設置縮放級別調整視角。(如果想要更好的效果也可以把邊除了框出來的城市外其他的城市不顯示)

引入百度地圖API,在頁面上添加一個DIV來加載百度地圖,然后初始化百度地圖:

 1   function (echarts, BMapExtension) {
 2                var BMapExt = new BMapExtension($('#main')[0], BMap, echarts, {
 3                    enableMapClick: false
 4                });
 5                map = BMapExt.getMap();
 6                var container = BMapExt.getEchartsContainer();
 7 
 8                var startPoint = { //經緯度
 9                    x: 104.114129,
10                    y: 37.550339
11                };
12                var point = new BMap.Point(startPoint.x, startPoint.y);
13                map.centerAndZoom(point, 5); //根據經緯度調整視角
14                map.enableScrollWheelZoom(true); //開啟滾輪縮放
15                // 地圖自定義樣式
16                map.setMapStyle({
17                    styleJson: [
18                          {
19                              "featureType": "background",
20                              "elementType": "all",
21                              "stylers": {
22                                  "color": "#444444"
23                              }
24                          }
25                       ]
26                  })
27             }

通過Echarts加載的市級地圖的on事件觸發百度地圖設置函數:

1        var myChart = echarts.init(document.getElementById('main'));
2        var ecConfig = require('echarts/config');
3        myChart.on(ecConfig.EVENT.MAP_SELECTED, function (param) {
4                getBoundary(param.target);
5        });   

由於沒個城市的大小,形狀都不一樣,在DIV里面顯示的效果就不一樣,有大的城市沒有顯示全,有些小的又放的太小了,並且視角也不是最佳視角,所以我這了定義的一個數組用來存放每個下鑽城市
的視角位置,已經縮放級別,這樣就跟根據自己設置的DIV大小來調整地圖的大小了。

 1 //定義一個數組來存放每個城市的視角位置,和放大級別
 2        var PositionData = [{ name: '濟寧市', long: 116.782471, lat: 35.226815, zoom: 10 }, { name: '新鄉市', long: 114.172514, lat: 35.216547, zoom: 10 }, { name: '甘孜藏族自治州', long: 99.935306, lat: 31.093953, zoom: 8 }]
 3        function getBoundary(city) {
 4            var ply;
 5            var bdary = new BMap.Boundary();
 6            bdary.get(city, function (rs) {       //獲取行政區域
 7                //map.clearOverlays();        //清除地圖覆蓋物
 8                var count = rs.boundaries.length; //行政區域的點有多少個
 9                for (var i = 0; i < count; i++) {
10                    ply = new BMap.Polygon(rs.boundaries[i], { strokeWeight: 3, strokeColor: "#ffff00", fillColor: "none" }); //建立多邊形覆蓋物
11                    map.addOverlay(ply);  //添加覆蓋物 ,這里要用到初始化時的map ,
12                    //map.setViewport(ply.getPath());    //調整視野
13                }
14                for (var i = 0; i < PositionData.length; i++)
15                {
16                    if (PositionData[i].name == city) {
17                        //通過經緯度指定視野的中心位置,以及放大級別
18                        map.centerAndZoom(new BMap.Point(PositionData[i].long, PositionData[i].lat), PositionData[i].zoom);
19                        break;
20                    }
21                    else {
22                        if (i == PositionData.length - 1) {
23                            //如果數組里沒有該城市視角數據和放大級別數據時就設置默認的視角位置和放大級別
24                            map.centerAndZoom(city, 10);
25                        }
26                    }
27                }
28            });
29        }   

最后
如果想實現下鑽到區級,原理一樣,這里就不講了,需要源碼或地圖數據的,可以聯系我,如果有什么更好的方法,歡迎吐槽留言。

當然你也可以請我喝杯咖啡(學的,不發個二維碼都沒啥期待,哈哈哈)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM