核心提示:前言日前,项目中需要对不同型号的轮船停泊情况做一个热力图统计,实现方式为echarts。主要需求如下:通过将接口返回的数据在前端以热力图的形式展现出来,横坐标为日期,纵坐标为轮船型号。如果当天有停泊,...
前言
日前,项目中需要对不同型号的轮船停泊情况做一个热力图统计,实现方式为echarts。主要需求如下:通过将接口返回的数据在前端以热力图的形式展现出来,横坐标为日期,纵坐标为轮船型号。如果当天有停泊,则在该时间轴上显示出来,如果没有,则不显示该热力。
分析
首先,我们来看一下接口返回的json数据格式,
//国家舰机(含区域)活动情况架次统计 - 修改时间范围或点击区域触发 var ActInfo={ "code":"SUCCESS", "data":[ { "lb":"空中目标", "data":[ {"rq":"20161105","xh":"U-2","jc":20}, {"rq":"20161106","xh":"U-2","jc":15}, {"rq":"20161106","xh":"P-3C","jc":30}, {"rq":"20161106","xh":"P-4C","jc":30}, {"rq":"20161106","xh":"P-5C","jc":30}, {"rq":"20161106","xh":"P-6C","jc":30}, {"rq":"20161106","xh":"P-7C","jc":30}, {"rq":"20161106","xh":"P-8C","jc":30}, {"rq":"20161106","xh":"P-9C","jc":30}, {"rq":"20161105","xh":"U-2","jc":20}, {"rq":"20161106","xh":"T-2","jc":15}, {"rq":"20161106","xh":"T-3C","jc":30}, {"rq":"20161106","xh":"T-4C","jc":30}, {"rq":"20161106","xh":"T-5C","jc":30}, {"rq":"20161106","xh":"T-6C","jc":30}, {"rq":"20161106","xh":"T-7C","jc":30}, {"rq":"20161106","xh":"T-8C","jc":30}, {"rq":"20161106","xh":"T-9C","jc":30} ] }, { "lb":"海洋目标", "data":[ {"rq":"20161101","xh":"春雨","jc":1}, {"rq":"20161102","xh":"石垣","jc":1}, {"rq":"20161103","xh":"石垣","jc":1}, {"rq":"20161104","xh":"石垣","jc":1}, {"rq":"20161102","xh":"播磨","jc":2}, {"rq":"20161104","xh":"苹果","jc":10}, {"rq":"20161105","xh":"微软","jc":4}, {"rq":"20161110","xh":"华为","jc":5}, {"rq":"20161117","xh":"中兴","jc":1} {"rq":"20161101","xh":"春雨1","jc":1}, {"rq":"20161102","xh":"石垣1","jc":1}, {"rq":"20161102","xh":"播磨1","jc":2}, {"rq":"20161104","xh":"苹果1","jc":10}, {"rq":"20161105","xh":"微软1","jc":4}, {"rq":"20161110","xh":"华为1","jc":5}, {"rq":"20161117","xh":"中兴1","jc":1}, ] } ] }
我们这里只需要对他的轮船数据进行可视化即可。
通过查找echarts的文档,发现echarts官网有个示例满足该条件,链接如下。https://echarts.baidu.com/demo.html#heatmap-cartesian。配置项代码如下:
app.title = '笛卡尔坐标系上的热力图'; var hours = ['12a', '1a', '2a', '3a', '4a', '5a', '6a', '7a', '8a', '9a','10a','11a', '12p', '1p', '2p', '3p', '4p', '5p', '6p', '7p', '8p', '9p', '10p', '11p']; var days = ['Saturday', 'Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday', 'Sunday']; var data = [[0,0,5],[0,1,1],[0,2,0],[0,3,0],[0,4,0],[0,5,0],[0,6,0],[0,7,0],[0,8,0],[0,9,0],[0,10,0],[0,11,2],[0,12,4],[0,13,1],[0,14,1],[0,15,3],[0,16,4],[0,17,6],[0,18,4],[0,19,4],[0,20,3],[0,21,3],[0,22,2],[0,23,5],[1,0,7],[1,1,0],[1,2,0],[1,3,0],[1,4,0],[1,5,0],[1,6,0],[1,7,0],[1,8,0],[1,9,0],[1,10,5],[1,11,2],[1,12,2],[1,13,6],[1,14,9],[1,15,11],[1,16,6],[1,17,7],[1,18,8],[1,19,12],[1,20,5],[1,21,5],[1,22,7],[1,23,2],[2,0,1],[2,1,1],[2,2,0],[2,3,0],[2,4,0],[2,5,0],[2,6,0],[2,7,0],[2,8,0],[2,9,0],[2,10,3],[2,11,2],[2,12,1],[2,13,9],[2,14,8],[2,15,10],[2,16,6],[2,17,5],[2,18,5],[2,19,5],[2,20,7],[2,21,4],[2,22,2],[2,23,4],[3,0,7],[3,1,3],[3,2,0],[3,3,0],[3,4,0],[3,5,0],[3,6,0],[3,7,0],[3,8,1],[3,9,0],[3,10,5],[3,11,4],[3,12,7],[3,13,14],[3,14,13],[3,15,12],[3,16,9],[3,17,5],[3,18,5],[3,19,10],[3,20,6],[3,21,4],[3,22,4],[3,23,1],[4,0,1],[4,1,3],[4,2,0],[4,3,0],[4,4,0],[4,5,1],[4,6,0],[4,7,0],[4,8,0],[4,9,2],[4,10,4],[4,11,4],[4,12,2],[4,13,4],[4,14,4],[4,15,14],[4,16,12],[4,17,1],[4,18,8],[4,19,5],[4,20,3],[4,21,7],[4,22,3],[4,23,0],[5,0,2],[5,1,1],[5,2,0],[5,3,3],[5,4,0],[5,5,0],[5,6,0],[5,7,0],[5,8,2],[5,9,0],[5,10,4],[5,11,1],[5,12,5],[5,13,10],[5,14,5],[5,15,7],[5,16,11],[5,17,6],[5,18,0],[5,19,5],[5,20,3],[5,21,4],[5,22,2],[5,23,0],[6,0,1],[6,1,0],[6,2,0],[6,3,0],[6,4,0],[6,5,0],[6,6,0],[6,7,0],[6,8,0],[6,9,0],[6,10,1],[6,11,0],[6,12,2],[6,13,1],[6,14,3],[6,15,4],[6,16,0],[6,17,0],[6,18,0],[6,19,0],[6,20,1],[6,21,2],[6,22,2],[6,23,6]]; data = data.map(function (item) { return [item[1], item[0], item[2] || '-']; }); option = { tooltip: { position: 'top' }, animation: false, grid: { height: '50%', y: '10%' }, xAxis: { type: 'category', data: hours, splitArea: { show: true } }, yAxis: { type: 'category', data: days, splitArea: { show: true } }, visualMap: { min: 0, max: 10, calculable: true, orient: 'horizontal', left: 'center', bottom: '15%' }, series: [{ name: 'Punch Card', type: 'heatmap', data: data, label: { normal: { show: true } }, itemStyle: { emphasis: { shadowBlur: 10, shadowColor: 'rgba(0, 0, 0, 0.5)' } } }] };
在官网的这个例子中,主要需要将数据格式转换为[[0,0,5],[0,1,1],[0,2,0],[0,3,0],[0,4,0],[0,5,0],[0,6,0],[0,7,0],[0,8,0],[0,9,0],[0,10,0],…]这么一个二维数组。
最初,我想到的办法是以日期作为横坐标,型号作为纵坐标,然后层层遍历日期,型号,json数据。定义一个数组,寻到的匹配的值则将其添加到该数组中,如果没有匹配值,则添加”-“,代码大致如下所示:
var xAxisDatas=initXAxis(); var yAxisDatas=initYAxis(); function drawHeatMap(heatMapUrl) { $.post(heatMapUrl,function (resp) { if(resp&&resp.code=="SUCCESS"&&resp.data&&resp.data.length&&resp.data[1].data&&resp.data[1].data.length){ var respData=resp.data[1].data; var valDataArr=[]; for(var i=0;i上述方法虽然简单,但是性能上却很差,没寻找一组json数据都需要遍历日期*型号遍,当数据很多时,这个方法几乎是不可用的。 后来,经过思考,找到了另外一种方法作为替代,代码如下所示:
function drawHeatMapQuick(heatMapUrl) { $.post(heatMapUrl,function (resp) { if(resp&&resp.code=="SUCCESS"&&resp.data&&resp.data.length&&resp.data[1].data&&resp.data[1].data.length) { var respData = resp.data[1].data; var valDataArr=[]; for(var i=0;i