-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy pathHeatmap.min.js
More file actions
1 lines (1 loc) · 10.1 KB
/
Copy pathHeatmap.min.js
File metadata and controls
1 lines (1 loc) · 10.1 KB
1
!function(t){var e=function(){var t=function(t){var e={data:[],heatmap:t};this.max=1,this.get=function(t){return e[t]},this.set=function(t,a){e[t]=a}};t.prototype={addDataPoint:function(t,e){if(!(t<0||e<0)){var a=this,i=a.get("heatmap"),n=a.get("data");if(n[t]||(n[t]=[]),n[t][e]||(n[t][e]=0),n[t][e]+=arguments.length<3?1:arguments[2],a.set("data",n),a.max<n[t][e])return i.get("actx").clearRect(0,0,i.get("width"),i.get("height")),void a.setDataSet({max:n[t][e],data:n},!0);i.drawAlpha(t,e,n[t][e],!0)}},setDataSet:function(t,e){var a=this.get("heatmap"),i=[],n=t.data,o=n.length;if(a.clear(),this.max=t.max,a.get("legend")&&a.get("legend").update(t.max),null!=e&&e){for(var s in n)if(void 0!==s)for(var l in n[s])void 0!==l&&a.drawAlpha(s,l,n[s][l],!1)}else for(;o--;){var r=n[o];a.drawAlpha(r.x,r.y,r.count,!1),i[r.x]||(i[r.x]=[]),i[r.x][r.y]||(i[r.x][r.y]=0),i[r.x][r.y]=r.count}a.colorize(),this.set("data",n)},exportDataSet:function(){var t=this.get("data"),e=[];for(var a in t)if(void 0!==a)for(var i in t[a])void 0!==i&&e.push({x:parseInt(a,10),y:parseInt(i,10),count:t[a][i]});return{max:this.max,data:e}},generateRandomDataSet:function(t){var e=this.get("heatmap"),a=e.get("width"),i=e.get("height"),n={},o=Math.floor(1e3*Math.random()+1);n.max=o;for(var s=[];t--;)s.push({x:Math.floor(Math.random()*a+1),y:Math.floor(Math.random()*i+1),count:Math.floor(Math.random()*o+1)});n.data=s,this.setDataSet(n)}};var e=function(t){this.config=t;var e={element:null,labelsEl:null,gradientCfg:null,ctx:null};this.get=function(t){return e[t]},this.set=function(t,a){e[t]=a},this.init()};e.prototype={init:function(){var t,e,a=this,i=a.config,n=i.title||"Legend",o=i.position,s=i.offset||10,l=(i.gradient,document.createElement("ul")),r="";a.processGradientObject(),o.indexOf("t")>-1?r+="top:"+s+"px;":r+="bottom:"+s+"px;",o.indexOf("l")>-1?r+="left:"+s+"px;":r+="right:"+s+"px;",(t=document.createElement("div")).style.cssText="border-radius:5px;position:absolute;"+r+"font-family:Helvetica; width:256px;z-index:10000000000; background:rgba(255,255,255,1);padding:10px;border:1px solid black;margin:0;",t.innerHTML="<h3 style='padding:0;margin:0;text-align:center;font-size:16px;'>"+n+"</h3>",l.style.cssText="position:relative;font-size:12px;display:block;list-style:none;list-style-type:none;margin:0;height:15px;",(e=document.createElement("div")).style.cssText=["position:relative;display:block;width:256px;height:15px;border-bottom:1px solid black; background-image:url(",a.createGradientImage(),");"].join(""),t.appendChild(l),t.appendChild(e),a.set("element",t),a.set("labelsEl",l),a.update(1)},processGradientObject:function(){var t=this.config.gradient,e=[];for(var a in t)t.hasOwnProperty(a)&&e.push({stop:a,value:t[a]});e.sort(function(t,e){return t.stop-e.stop}),e.unshift({stop:0,value:"rgba(0,0,0,0)"}),this.set("gradientArr",e)},createGradientImage:function(){var t,e=this.get("gradientArr"),a=e.length,i=document.createElement("canvas"),n=i.getContext("2d");i.width="256",i.height="15",t=n.createLinearGradient(0,5,256,10);for(var o=0;o<a;o++)t.addColorStop(1/(a-1)*o,e[o].value);n.fillStyle=t,n.fillRect(0,5,256,10),n.strokeStyle="black",n.beginPath();for(o=0;o<a;o++)n.moveTo(.5+(1/(a-1)*o*256|0),0),n.lineTo(.5+(1/(a-1)*o*256|0),0==o?15:5);return n.moveTo(255.5,0),n.lineTo(255.5,15),n.moveTo(255.5,4.5),n.lineTo(0,4.5),n.stroke(),this.set("ctx",n),i.toDataURL()},getElement:function(){return this.get("element")},update:function(t){for(var e,a,i=this,n=i.get("gradientArr"),o=i.get("ctx"),s=i.get("labelsEl"),l="",r=0;r<n.length;r++)e=t*n[r].stop|0,a=o.measureText(e).width/2|0,0==r&&(a=0),r==n.length-1&&(a*=2),l+='<li style="position:absolute;left:'+(((1/(n.length-1)*r*256||0)|0)-a+.5)+'px">'+e+"</li>";s.innerHTML=l}};var a=function(e){var a={radius:40,element:{},canvas:{},acanvas:{},ctx:{},actx:{},legend:null,visible:!0,width:0,height:0,max:!1,gradient:!1,opacity:180,premultiplyAlpha:!1,bounds:{l:1e3,r:0,t:1e3,b:0},debug:!1};this.store=new t(this),this.get=function(t){return a[t]},this.set=function(t,e){a[t]=e},this.configure(e),this.init()};return a.prototype={configure:function(t){var a=this;if(a.set("radius",t.radius||40),a.set("element",t.element instanceof Object?t.element:document.getElementById(t.element)),a.set("visible",null==t.visible||t.visible),a.set("max",t.max||!1),a.set("gradient",t.gradient||{.45:"rgb(0,0,255)",.55:"rgb(0,255,255)",.65:"rgb(0,255,0)",.95:"yellow",1:"rgb(255,0,0)"}),a.set("opacity",parseInt(255/(100/t.opacity),10)||180),a.set("width",t.width||0),a.set("height",t.height||0),a.set("debug",t.debug),t.legend){var i=t.legend;i.gradient=a.get("gradient"),a.set("legend",new e(i))}},resize:function(){var t=this,e=t.get("element"),a=t.get("canvas"),i=t.get("acanvas");a.width=i.width=t.get("width")||e.style.width.replace(/px/,"")||t.getWidth(e),this.set("width",a.width),a.height=i.height=t.get("height")||e.style.height.replace(/px/,"")||t.getHeight(e),this.set("height",a.height)},init:function(){var t=this,e=document.createElement("canvas"),a=document.createElement("canvas"),i=e.getContext("2d"),n=a.getContext("2d"),o=t.get("element");t.initColorPalette(),t.set("canvas",e),t.set("ctx",i),t.set("acanvas",a),t.set("actx",n),t.resize(),e.style.cssText=a.style.cssText="position:absolute;top:0;left:0;z-index:10000000;",t.get("visible")||(e.style.display="none"),o.appendChild(e),t.get("legend")&&o.appendChild(t.get("legend").getElement()),t.get("debug")&&document.body.appendChild(a),n.shadowOffsetX=15e3,n.shadowOffsetY=15e3,n.shadowBlur=15},initColorPalette:function(){var t,e,a,i=this,n=document.createElement("canvas"),o=i.get("gradient");for(var s in n.width="1",n.height="256",e=(t=n.getContext("2d")).createLinearGradient(0,0,1,256),(a=t.getImageData(0,0,1,1)).data[0]=a.data[3]=64,a.data[1]=a.data[2]=0,t.putImageData(a,0,0),a=t.getImageData(0,0,1,1),i.set("premultiplyAlpha",a.data[0]<60||a.data[0]>70),o)e.addColorStop(s,o[s]);t.fillStyle=e,t.fillRect(0,0,1,256),i.set("gradient",t.getImageData(0,0,1,256).data)},getWidth:function(t){var e=t.offsetWidth;return t.style.paddingLeft&&(e+=t.style.paddingLeft),t.style.paddingRight&&(e+=t.style.paddingRight),e},getHeight:function(t){var e=t.offsetHeight;return t.style.paddingTop&&(e+=t.style.paddingTop),t.style.paddingBottom&&(e+=t.style.paddingBottom),e},colorize:function(t,e){var a,i,n,o,s,l,r,h,d,g,p=this,c=p.get("width"),u=p.get("radius"),f=p.get("height"),m=p.get("actx"),x=p.get("ctx"),v=3*u,y=p.get("premultiplyAlpha"),b=p.get("gradient"),w=p.get("opacity"),P=p.get("bounds");null!=t&&null!=e?(t+v>c&&(t=c-v),t<0&&(t=0),e<0&&(e=0),e+v>f&&(e=f-v),a=t,i=e,o=t+v,n=e+v):(a=P.l<0?0:P.l,o=P.r>c?c:P.r,i=P.t<0?0:P.t,n=P.b>f?f:P.b),r=(l=(s=m.getImageData(a,i,o-a,n-i)).data).length;for(var T=3;T<r;T+=4)(d=4*(h=l[T]))&&(g=h<w?h:w,l[T-3]=b[d],l[T-2]=b[d+1],l[T-1]=b[d+2],y&&(l[T-3]/=255/g,l[T-2]/=255/g,l[T-1]/=255/g),l[T]=g);s.data=l,x.putImageData(s,a,i)},drawAlpha:function(t,e,a,i){var n=this,o=n.get("radius"),s=n.get("actx"),l=(n.get("max"),n.get("bounds")),r=t-1.5*o|0,h=e-1.5*o|0,d=t+1.5*o|0,g=e+1.5*o|0;s.shadowColor="rgba(0,0,0,"+(a?a/n.store.max:"0.1")+")",s.shadowOffsetX=15e3,s.shadowOffsetY=15e3,s.shadowBlur=15,s.beginPath(),s.arc(t-15e3,e-15e3,o,0,2*Math.PI,!0),s.closePath(),s.fill(),i?n.colorize(r,h):(r<l.l&&(l.l=r),h<l.t&&(l.t=h),d>l.r&&(l.r=d),g>l.b&&(l.b=g))},toggleDisplay:function(){var t=this,e=t.get("visible"),a=t.get("canvas");a.style.display=e?"none":"block",t.set("visible",!e)},getImageData:function(){return this.get("canvas").toDataURL()},clear:function(){var t=this,e=t.get("width"),a=t.get("height");t.store.set("data",[]),t.get("ctx").clearRect(0,0,e,a),t.get("actx").clearRect(0,0,e,a)},cleanup:function(){this.get("element").removeChild(this.get("canvas"))}},{create:function(t){return new a(t)},util:{mousePosition:function(t){var e,a;if(t.layerX?(e=t.layerX,a=t.layerY):t.offsetX&&(e=t.offsetX,a=t.offsetY),void 0!==e)return[e,a]}}}}();t.h337=t.heatmapFactory=e}(window);var BMapLib=window.BMapLib=BMapLib||{};!function(){var t=BMapLib.HeatmapOverlay=function(t){this.conf=t,this.heatmap=null,this.latlngs=[],this.bounds=null};t.prototype=new BMap.Overlay,t.prototype.initialize=function(t){this._map=t;var e=document.createElement("div");e.style.position="absolute",e.style.top=0,e.style.left=0,e.style.border=0,e.style.width=this._map.getSize().width+"px",e.style.height=this._map.getSize().height+"px",this.conf.element=e;var a=t.getPanes();return(a.mapPane||a.floatPane||a.markerPane).appendChild(e),this.heatmap=h337.create(this.conf),this._div=e,e},t.prototype.draw=function(){var t=this._map.getBounds();if(!t.equals(this.bounds)){this.bounds=t;var e=this._map.pointToOverlayPixel(t.getNorthEast()),a=this._map.pointToOverlayPixel(t.getSouthWest()),i=e.y,n=a.x,o=a.y-e.y,s=e.x-a.x;if(this.conf.element.style.left=n+"px",this.conf.element.style.top=i+"px",this.conf.element.style.width=s+"px",this.conf.element.style.height=o+"px",this.heatmap.store.get("heatmap").resize(),this.latlngs.length>0){this.heatmap.clear();var l=this.latlngs.length;for(d={max:this.heatmap.store.max,data:[]};l--;){var r=this.latlngs[l].latlng;if(t.containsPoint(r)){var h=this._map.pointToOverlayPixel(r),g=new BMap.Pixel(h.x-n,h.y-i),p=this.pixelTransform(g);d.data.push({x:p.x,y:p.y,count:this.latlngs[l].c})}}this.heatmap.store.setDataSet(d)}}},t.prototype.pixelTransform=function(t){for(var e=this.heatmap.get("width"),a=this.heatmap.get("height");t.x<0;)t.x+=e;for(;t.x>e;)t.x-=e;for(;t.y<0;)t.y+=a;for(;t.y>a;)t.y-=a;return t.x=t.x|0,t.y=t.y|0,t},t.prototype.setDataSet=function(t){var e=this._map.getBounds(),a={max:t.max,data:[]},i=t.data,n=i.length;for(this.latlngs=[];n--;){var o=new BMap.Point(i[n].lng,i[n].lat);if(e.containsPoint(o)){this.latlngs.push({latlng:o,c:i[n].count});var s=this._map.pointToOverlayPixel(o),l=this._map.pointToOverlayPixel(e.getSouthWest()).x,r=this._map.pointToOverlayPixel(e.getNorthEast()).y,h=new BMap.Pixel(s.x-l,s.y-r),d=this.pixelTransform(h);a.data.push({x:d.x,y:d.y,count:i[n].count})}}this.heatmap.clear(),this.heatmap.store.setDataSet(a)},t.prototype.addDataPoint=function(t,e,a){var i=new BMap.Point(t,e),n=this.pixelTransform(this._map.pointToOverlayPixel(i));this.heatmap.store.addDataPoint(n.x,n.y,a),this.latlngs.push({latlng:i,c:a})},t.prototype.toggle=function(){this.heatmap.toggleDisplay()},BMapLib.HeatmapOverlay=t}();