You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

4 lines
10 KiB

/*! AMap Heatmap - v1.0.0 - 2014-07-27
* http://git.oschina.net/zjzhome/heatmap-amap.js
* Copyright (c) 2014 zjzhome; Licensed MIT */
!function(a){var b=function(){var a=function(a){var b={data:[],heatmap:a};this.max=1,this.get=function(a){return b[a]},this.set=function(a,c){b[a]=c}};a.prototype={addDataPoint:function(a,b){if(!(0>a||0>b)){var c=this,d=c.get("heatmap"),e=c.get("data");return e[a]||(e[a]=[]),e[a][b]||(e[a][b]=0),e[a][b]+=arguments.length<3?1:arguments[2],c.set("data",e),c.max<e[a][b]?(d.get("actx").clearRect(0,0,d.get("width"),d.get("height")),void c.setDataSet({max:e[a][b],data:e},!0)):void d.drawAlpha(a,b,e[a][b],!0)}},setDataSet:function(a,b){var c=this,d=c.get("heatmap"),e=[],f=a.data,g=f.length;if(d.clear(),this.max=a.max,d.get("legend")&&d.get("legend").update(a.max),null!=b&&b){for(var h in f)if(void 0!==h)for(var i in f[h])void 0!==i&&d.drawAlpha(h,i,f[h][i],!1)}else for(;g--;){var j=f[g];d.drawAlpha(j.x,j.y,j.count,!1),e[j.x]||(e[j.x]=[]),e[j.x][j.y]||(e[j.x][j.y]=0),e[j.x][j.y]=j.count}d.colorize(),this.set("data",f)},exportDataSet:function(){var a=this,b=a.get("data"),c=[];for(var d in b)if(void 0!==d)for(var e in b[d])void 0!==e&&c.push({x:parseInt(d,10),y:parseInt(e,10),count:b[d][e]});return{max:a.max,data:c}},generateRandomDataSet:function(a){var b=this.get("heatmap"),c=b.get("width"),d=b.get("height"),e={},f=Math.floor(1e3*Math.random()+1);e.max=f;for(var g=[];a--;)g.push({x:Math.floor(Math.random()*c+1),y:Math.floor(Math.random()*d+1),count:Math.floor(Math.random()*f+1)});e.data=g,this.setDataSet(e)}};var b=function(a){this.config=a;var b={element:null,labelsEl:null,gradientCfg:null,ctx:null};this.get=function(a){return b[a]},this.set=function(a,c){b[a]=c},this.init()};b.prototype={init:function(){var a,b,c=this,d=c.config,e=d.title||"Legend",f=d.position,g=d.offset||10,h=(d.gradient,document.createElement("ul")),i="";c.processGradientObject(),i+=f.indexOf("t")>-1?"top:"+g+"px;":"bottom:"+g+"px;",i+=f.indexOf("l")>-1?"left:"+g+"px;":"right:"+g+"px;",a=document.createElement("div"),a.style.cssText="border-radius:5px;position:absolute;"+i+"font-family:Helvetica; width:256px;z-index:10000000000; background:rgba(255,255,255,1);padding:10px;border:1px solid black;margin:0;",a.innerHTML="<h3 style='padding:0;margin:0;text-align:center;font-size:16px;'>"+e+"</h3>",h.style.cssText="position:relative;font-size:12px;display:block;list-style:none;list-style-type:none;margin:0;height:15px;",b=document.createElement("div"),b.style.cssText=["position:relative;display:block;width:256px;height:15px;border-bottom:1px solid black; background-image:url(",c.createGradientImage(),");"].join(""),a.appendChild(h),a.appendChild(b),c.set("element",a),c.set("labelsEl",h),c.update(1)},processGradientObject:function(){var a=this,b=this.config.gradient,c=[];for(var d in b)b.hasOwnProperty(d)&&c.push({stop:d,value:b[d]});c.sort(function(a,b){return a.stop-b.stop}),c.unshift({stop:0,value:"rgba(0,0,0,0)"}),a.set("gradientArr",c)},createGradientImage:function(){var a,b=this,c=b.get("gradientArr"),d=c.length,e=document.createElement("canvas"),f=e.getContext("2d");e.width="256",e.height="15",a=f.createLinearGradient(0,5,256,10);for(var g=0;d>g;g++)a.addColorStop(1/(d-1)*g,c[g].value);f.fillStyle=a,f.fillRect(0,5,256,10),f.strokeStyle="black",f.beginPath();for(var g=0;d>g;g++)f.moveTo((1/(d-1)*g*256>>0)+.5,0),f.lineTo((1/(d-1)*g*256>>0)+.5,0==g?15:5);return f.moveTo(255.5,0),f.lineTo(255.5,15),f.moveTo(255.5,4.5),f.lineTo(0,4.5),f.stroke(),b.set("ctx",f),e.toDataURL()},getElement:function(){return this.get("element")},update:function(a){for(var b,c,d=this,e=d.get("gradientArr"),f=d.get("ctx"),g=d.get("labelsEl"),h="",i=0;i<e.length;i++)b=a*e[i].stop>>0,c=f.measureText(b).width/2>>0,0==i&&(c=0),i==e.length-1&&(c*=2),h+='<li style="position:absolute;left:'+(((1/(e.length-1)*i*256||0)>>0)-c+.5)+'px">'+b+"</li>";g.innerHTML=h}};var c=function(b){var c={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 a(this),this.get=function(a){return c[a]},this.set=function(a,b){c[a]=b},this.configure(b),this.init()};return c.prototype={configure:function(a){var c=this;if(c.set("radius",a.radius||40),c.set("element",a.element instanceof Object?a.element:document.getElementById(a.element)),c.set("visible",null!=a.visible?a.visible:!0),c.set("max",a.max||!1),c.set("gradient",a.gradient||{.45:"rgb(0,0,255)",.55:"rgb(0,255,255)",.65:"rgb(0,255,0)",.95:"yellow",1:"rgb(255,0,0)"}),c.set("opacity",parseInt(255/(100/a.opacity),10)||180),c.set("width",a.width||0),c.set("height",a.height||0),c.set("debug",a.debug),a.legend){var d=a.legend;d.gradient=c.get("gradient"),c.set("legend",new b(d))}},resize:function(){var a=this,b=a.get("element"),c=a.get("canvas"),d=a.get("acanvas");c.width=d.width=a.get("width")||b.style.width.replace(/px/,"")||a.getWidth(b),this.set("width",c.width),c.height=d.height=a.get("height")||b.style.height.replace(/px/,"")||a.getHeight(b),this.set("height",c.height)},init:function(){var a=this,b=document.createElement("canvas"),c=document.createElement("canvas"),d=b.getContext("2d"),e=c.getContext("2d"),f=a.get("element");a.initColorPalette(),a.set("canvas",b),a.set("ctx",d),a.set("acanvas",c),a.set("actx",e),a.resize(),b.style.cssText=c.style.cssText="position:absolute;top:0;left:0;z-index:10000000;",a.get("visible")||(b.style.display="none"),f.appendChild(b),a.get("legend")&&f.appendChild(a.get("legend").getElement()),a.get("debug")&&document.body.appendChild(c),e.shadowOffsetX=15e3,e.shadowOffsetY=15e3,e.shadowBlur=15},initColorPalette:function(){var a,b,c,d=this,e=document.createElement("canvas"),f=d.get("gradient");e.width="1",e.height="256",a=e.getContext("2d"),b=a.createLinearGradient(0,0,1,256),c=a.getImageData(0,0,1,1),c.data[0]=c.data[3]=64,c.data[1]=c.data[2]=0,a.putImageData(c,0,0),c=a.getImageData(0,0,1,1),d.set("premultiplyAlpha",c.data[0]<60||c.data[0]>70);for(var g in f)b.addColorStop(g,f[g]);a.fillStyle=b,a.fillRect(0,0,1,256),d.set("gradient",a.getImageData(0,0,1,256).data)},getWidth:function(a){var b=a.offsetWidth;return a.style.paddingLeft&&(b+=a.style.paddingLeft),a.style.paddingRight&&(b+=a.style.paddingRight),b},getHeight:function(a){var b=a.offsetHeight;return a.style.paddingTop&&(b+=a.style.paddingTop),a.style.paddingBottom&&(b+=a.style.paddingBottom),b},colorize:function(a,b){var c,d,e,f,g,h,i,j,k,l,m=this,n=m.get("width"),o=m.get("radius"),p=m.get("height"),q=m.get("actx"),r=m.get("ctx"),s=3*o,t=m.get("premultiplyAlpha"),u=m.get("gradient"),v=m.get("opacity"),w=m.get("bounds");null!=a&&null!=b?(a+s>n&&(a=n-s),0>a&&(a=0),0>b&&(b=0),b+s>p&&(b=p-s),c=a,d=b,f=a+s,e=b+s):(c=w.l<0?0:w.l,f=w.r>n?n:w.r,d=w.t<0?0:w.t,e=w.b>p?p:w.b),g=q.getImageData(c,d,f-c,e-d),h=g.data,i=h.length;for(var x=3;i>x;x+=4)j=h[x],k=4*j,k&&(l=v>j?j:v,h[x-3]=u[k],h[x-2]=u[k+1],h[x-1]=u[k+2],t&&(h[x-3]/=255/l,h[x-2]/=255/l,h[x-1]/=255/l),h[x]=l);g.data=h,r.putImageData(g,c,d)},drawAlpha:function(a,b,c,d){var e=this,f=e.get("radius"),g=e.get("actx"),h=(e.get("max"),e.get("bounds")),i=a-1.5*f>>0,j=b-1.5*f>>0,k=a+1.5*f>>0,l=b+1.5*f>>0;g.shadowColor="rgba(0,0,0,"+(c?c/e.store.max:"0.1")+")",g.shadowOffsetX=15e3,g.shadowOffsetY=15e3,g.shadowBlur=15,g.beginPath(),g.arc(a-15e3,b-15e3,f,0,2*Math.PI,!0),g.closePath(),g.fill(),d?e.colorize(i,j):(i<h.l&&(h.l=i),j<h.t&&(h.t=j),k>h.r&&(h.r=k),l>h.b&&(h.b=l))},toggleDisplay:function(){var a=this,b=a.get("visible"),c=a.get("canvas");c.style.display=b?"none":"block",a.set("visible",!b)},getImageData:function(){return this.get("canvas").toDataURL()},clear:function(){var a=this,b=a.get("width"),c=a.get("height");a.store.set("data",[]),a.get("ctx").clearRect(0,0,b,c),a.get("actx").clearRect(0,0,b,c)},cleanup:function(){var a=this;a.get("element").removeChild(a.get("canvas"))}},{create:function(a){return new c(a)},util:{mousePosition:function(a){var b,c;return a.layerX?(b=a.layerX,c=a.layerY):a.offsetX&&(b=a.offsetX,c=a.offsetY),"undefined"!=typeof b?[b,c]:void 0}}}}();a.h337=a.heatmapFactory=b}(window),function(){var a=AMap.Heatmap=function(a,b){this._map=a,this.bounds=a.getBounds(),this.config=b,this.lnglats=[];var c=document.createElement("div");c.style.position="absolute",c.style.top=0,c.style.left=0,c.style.width=this._map.getSize().getWidth()+"px",c.style.height=this._map.getSize().getHeight()+"px",this.config.element=c,document.getElementsByClassName("amap-overlays")[0].appendChild(c),this.heatmap=h337.create(this.config)};a.prototype.pixelTransform=function(a){for(var b=this.heatmap.get("width"),c=this.heatmap.get("height");a.x<0;)a.x+=b;for(;a.x>b;)a.x-=b;for(;a.y<0;)a.y+=c;for(;a.y>c;)a.y-=c;return a.x=a.x>>0,a.y=a.y>>0,a},a.prototype.start=function(){var a=this;AMap.event.addListener(a._map,"dragging",function(){a.change()}),AMap.event.addListener(this._map,"zoomchange",function(){a.change()})},a.prototype.change=function(){var a=this._map.getBounds();if(!a.getNorthEast().equals(this.bounds.getNorthEast())||!a.getSouthWest().equals(this.bounds.getSouthWest())){this.bounds=a;var b=this._map.lnglatToPixel(a.getNorthEast()),c=this._map.lnglatToPixel(a.getSouthWest()),e=b.y,f=c.x,g=c.y-b.y,h=b.x-c.x;if(this.config.element.style.width=h+"px",this.config.element.style.height=g+"px",this.heatmap.store.get("heatmap").resize(),this.lnglats.length>0){this.heatmap.clear();var i=this.lnglats.length;for(d={max:this.heatmap.store.max,data:[]};i--;){var j=this.lnglats[i].lnglat;if(a.contains(j)){var k=this._map.lnglatToPixel(j),l=new AMap.Pixel(k.x-f,k.y-e),m=this.pixelTransform(l);d.data.push({x:m.x,y:m.y,count:this.lnglats[i].c})}}this.heatmap.store.setDataSet(d)}}},a.prototype.setDataSet=function(a){var b=this._map.getBounds(),c={max:a.max,data:[]},d=a.data,e=d.length;for(this.lnglats=[];e--;){var f=new AMap.LngLat(d[e].lng,d[e].lat);if(b.contains(f)){this.lnglats.push({lnglat:f,c:d[e].count});var g=this._map.lnglatToPixel(f),h=this._map.lnglatToPixel(b.getSouthWest()).x,i=this._map.lnglatToPixel(b.getNorthEast()).y,j=new AMap.Pixel(g.x-h,g.y-i),k=this.pixelTransform(j);c.data.push({x:k.x,y:k.y,count:d[e].count}),this.heatmap.clear(),this.heatmap.store.setDataSet(c)}}},a.prototype.addDataPoint=function(a,b,c){var d=new AMap.LngLat(a,b),e=this.pixelTransform(this._map.lnglatToPixel(d));this.heatmap.store.addDataPoint(e.x,e.y,c),this.lnglats.push({lnglat:d,c:c})},a.prototype.toggle=function(){this.heatmap.toggleDisplay()},a.prototype.clear=function(){this.heatmap.clear()},a.prototype.remove=function(){this.heatmap.clearup()},AMap.Heatmap=a}();