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.
		
		
		
		
		
			
		
			
				
					
					
						
							655 lines
						
					
					
						
							24 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							655 lines
						
					
					
						
							24 KiB
						
					
					
				
								(function (window) {
							 | 
						|
								    var utils = {
							 | 
						|
								        // color:rgb或rgba格式
							 | 
						|
								        // opacity: 透明度
							 | 
						|
								        calculateColor: function (color, opacity) {
							 | 
						|
								            if (color.indexOf('#') === 0) {
							 | 
						|
								                var color16 = color.slice(1);
							 | 
						|
								                var r = parseInt(color16.slice(0, 2), 16);
							 | 
						|
								                var g = parseInt(color16.slice(2, 4), 16);
							 | 
						|
								                var b = parseInt(color16.slice(4), 16);
							 | 
						|
								                return 'rgba(' + r + ',' + g + ',' + b + ',' + opacity + ')';
							 | 
						|
								            } else if (/^rgb\(/.test(color)) {
							 | 
						|
								                return color.replace(/rgb/, 'rgba').replace(')', ",") +
							 | 
						|
								                    opacity + ')';
							 | 
						|
								            } else {
							 | 
						|
								                return color.split(',').splice(0, 3).join(',') +
							 | 
						|
								                    opacity + ')';
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    };
							 | 
						|
								    var arrayUtils = {
							 | 
						|
								        forEach: function (arr, cb, scope) {
							 | 
						|
								            if (typeof Array.prototype.forEach === 'function') {
							 | 
						|
								                arr.forEach(cb, scope);
							 | 
						|
								            } else {
							 | 
						|
								                for (var i = 0, len = arr.length; i < len; i++) {
							 | 
						|
								                    cb.apply(scope, [arr[i], i, arr]);
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								        },
							 | 
						|
								        map: function (arr, cb, scope) {
							 | 
						|
								            if (typeof Array.prototype.map === 'function') {
							 | 
						|
								                return arr.map(cb, scope);
							 | 
						|
								            } else {
							 | 
						|
								                var mapped = [];
							 | 
						|
								                for (var i = 0, len = arr.length; i < len; i++) {
							 | 
						|
								                    mapped[i] = cb.apply(scope, [arr[i], i, arr]);
							 | 
						|
								                }
							 | 
						|
								                return mapped;
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    };
							 | 
						|
								
							 | 
						|
								    var Marker = (function () {
							 | 
						|
								        var M = function (options) {
							 | 
						|
								            this.x = options.x;
							 | 
						|
								            this.y = options.y;
							 | 
						|
								            this.rotation = options.rotation;
							 | 
						|
								            this.style = options.style;
							 | 
						|
								            this.color = options.color;
							 | 
						|
								            this.size = options.size;
							 | 
						|
								            this.borderWidth = options.borderWidth;
							 | 
						|
								            this.borderColor = options.borderColor;
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        M.prototype.draw = function (context) {
							 | 
						|
								            context.save();
							 | 
						|
								            context.translate(this.x, this.y);
							 | 
						|
								            context.rotate(this.rotation);
							 | 
						|
								
							 | 
						|
								            context.lineWidth = this.borderWidth || 0;
							 | 
						|
								            context.strokeStyle = this.borderColor || '#000';
							 | 
						|
								            context.fillStyle = this.color || '#000';
							 | 
						|
								            // 目前先只支持圆
							 | 
						|
								            context.beginPath();
							 | 
						|
								            if (this.style === 'circle') {
							 | 
						|
								                context.arc(0, 0, this.size, 0, Math.PI * 2, false);
							 | 
						|
								            } else if (this.style === 'arrow') {
							 | 
						|
								                // 将箭头后退,让箭头的尖头指向终点
							 | 
						|
								                context.moveTo(-this.size*2, -this.size);
							 | 
						|
								                context.lineTo(-this.size*5/4, 0);
							 | 
						|
								                context.lineTo(-this.size*2, this.size);
							 | 
						|
								                context.lineTo(0, 0);
							 | 
						|
								                context.lineTo(-this.size*2, -this.size);
							 | 
						|
								                //context.moveTo(this.size, this.size*2);
							 | 
						|
								                //context.lineTo(0, this.size * 5 / 4);
							 | 
						|
								                //context.lineTo(- this.size, this.size * 2);
							 | 
						|
								                //context.lineTo(0, 0);
							 | 
						|
								                //context.lineTo(this.size, this.size*2);
							 | 
						|
								            }
							 | 
						|
								            context.closePath();
							 | 
						|
								            context.stroke();
							 | 
						|
								            context.fill();
							 | 
						|
								            context.restore();
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        return M;
							 | 
						|
								    })();
							 | 
						|
								
							 | 
						|
								    var Arc = (function () {
							 | 
						|
								        var A = function (options) {
							 | 
						|
								            var startX = options.startX,
							 | 
						|
								                startY = options.startY,
							 | 
						|
								                endX = options.endX,
							 | 
						|
								                endY = options.endY;
							 | 
						|
								            //两点之间的圆有多个,通过两点及半径便可以定出两个圆,根据需要选取其中一个圆
							 | 
						|
								            var L = Math.sqrt(Math.pow(startX - endX, 2) + Math.pow(startY - endY, 2));
							 | 
						|
								            var m = (startX + endX) / 2; // 横轴中点
							 | 
						|
								            var n = (startY + endY) / 2; // 纵轴中点
							 | 
						|
								            var factor = 1.5;
							 | 
						|
								
							 | 
						|
								            var centerX = (startY - endY) * factor + m;
							 | 
						|
								            var centerY = (endX - startX) * factor + n;
							 | 
						|
								
							 | 
						|
								            var radius = Math.sqrt(Math.pow(L / 2, 2) + Math.pow(L * factor, 2));
							 | 
						|
								            var startAngle = Math.atan2(startY - centerY, startX - centerX);
							 | 
						|
								            var endAngle = Math.atan2(endY - centerY, endX - centerX);
							 | 
						|
								
							 | 
						|
								            // this.L = L;
							 | 
						|
								            this.startX = startX;
							 | 
						|
								            this.startY = startY;
							 | 
						|
								            this.endX = endX;
							 | 
						|
								            this.endY = endY;
							 | 
						|
								            this.centerX = centerX;
							 | 
						|
								            this.centerY = centerY;
							 | 
						|
								            this.startAngle = startAngle;
							 | 
						|
								            this.endAngle = endAngle;
							 | 
						|
								            this.startLabel = options && options.labels && options.labels[0],
							 | 
						|
								            this.endLabel = options && options.labels && options.labels[1],
							 | 
						|
								            this.radius = radius;
							 | 
						|
								            this.lineWidth = options.width || 1;
							 | 
						|
								            this.strokeStyle = options.color || '#000';
							 | 
						|
								            this.label = options.label;
							 | 
						|
								            this.font = options.font;
							 | 
						|
								            this.shadowBlur = options.shadowBlur;
							 | 
						|
								            this.endAngle = endAngle - this.lineWidth / radius; // 让线后退,与箭头结合
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        A.prototype.draw = function (context) {
							 | 
						|
								            context.save();
							 | 
						|
								            context.lineWidth = this.lineWidth;
							 | 
						|
								            context.strokeStyle = this.strokeStyle;
							 | 
						|
								            context.shadowColor = this.strokeStyle;
							 | 
						|
								            context.shadowBlur = this.shadowBlur || 2;
							 | 
						|
								
							 | 
						|
								            context.beginPath();
							 | 
						|
								            context.arc(this.centerX, this.centerY, this.radius, this.startAngle, this.endAngle, false);
							 | 
						|
								            context.stroke();
							 | 
						|
								            context.restore();
							 | 
						|
								
							 | 
						|
								            context.save();
							 | 
						|
								            context.fillStyle = this.strokeStyle;
							 | 
						|
								            if (this.label) {
							 | 
						|
								                context.font = this.font;
							 | 
						|
								                if (this.startLabel) {
							 | 
						|
								                    var x = this.startX - 15;
							 | 
						|
								                    var y = this.startY + 5;
							 | 
						|
								                    context.fillText(this.startLabel, x, y);
							 | 
						|
								                }
							 | 
						|
								                if (this.endLabel) {
							 | 
						|
								                    var z = this.endX - 15;
							 | 
						|
								                    var w = this.endY - 5;
							 | 
						|
								                    context.fillText(this.endLabel, z, w);
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								            context.restore();
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        return A;
							 | 
						|
								    })();
							 | 
						|
								
							 | 
						|
								    var Pulse = (function () {
							 | 
						|
								        function P(options) {
							 | 
						|
								            this.x = options.x;
							 | 
						|
								            this.y = options.y;
							 | 
						|
								            this.maxRadius = options.radius;
							 | 
						|
								            this.color = options.color;
							 | 
						|
								            this.shadowBlur = 5;
							 | 
						|
								            this.lineWidth = options.borderWidth;
							 | 
						|
								            this.r = 0;
							 | 
						|
								            this.factor = 2 / options.radius;
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        P.prototype.draw = function (context) {
							 | 
						|
								            // var vr = (this.maxRadius - this.r) * this.factor;
							 | 
						|
								            var vr = 0.5;
							 | 
						|
								            this.r += vr;
							 | 
						|
								            // this.shadowBlur = Math.floor(this.r);
							 | 
						|
								
							 | 
						|
								            context.save();
							 | 
						|
								            context.translate(this.x, this.y);
							 | 
						|
								            var strokeColor = this.color;
							 | 
						|
								            strokeColor = utils.calculateColor(strokeColor, 1 - this.r / this.maxRadius);
							 | 
						|
								            context.strokeStyle = strokeColor;
							 | 
						|
								            context.shadowBlur = this.shadowBlur;
							 | 
						|
								            context.shadowColor = strokeColor;
							 | 
						|
								            context.lineWidth = this.lineWidth;
							 | 
						|
								            context.beginPath();
							 | 
						|
								            context.arc(0, 0, this.r, 0, Math.PI * 2, false);
							 | 
						|
								            context.stroke();
							 | 
						|
								            context.restore();
							 | 
						|
								
							 | 
						|
								            if (Math.abs(this.maxRadius - this.r) < 0.8) {
							 | 
						|
								                this.r = 0;
							 | 
						|
								            }
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        return P;
							 | 
						|
								    })();
							 | 
						|
								
							 | 
						|
								    var Spark = (function () {
							 | 
						|
								        var S = function (options) {
							 | 
						|
								            var startX = options.startX,
							 | 
						|
								                startY = options.startY,
							 | 
						|
								                endX = options.endX,
							 | 
						|
								                endY = options.endY;
							 | 
						|
								
							 | 
						|
								            //两点之间的圆有多个,通过两点及半径便可以定出两个圆,根据需要选取其中一个圆
							 | 
						|
								            var L = Math.sqrt(Math.pow(startX - endX, 2) + Math.pow(startY - endY, 2));
							 | 
						|
								            var m = (startX + endX) / 2; // 横轴中点
							 | 
						|
								            var n = (startY + endY) / 2; // 纵轴中点
							 | 
						|
								            var factor = 1.5;
							 | 
						|
								
							 | 
						|
								            var centerX = (startY - endY) * factor + m;
							 | 
						|
								            var centerY = (endX - startX) * factor + n;
							 | 
						|
								
							 | 
						|
								            var radius = Math.sqrt(Math.pow(L / 2, 2) + Math.pow(L * factor, 2));
							 | 
						|
								            var startAngle = Math.atan2(startY - centerY, startX - centerX);
							 | 
						|
								            var endAngle = Math.atan2(endY - centerY, endX - centerX);
							 | 
						|
								
							 | 
						|
								            // 保证Spark的弧度不超过Math.PI
							 | 
						|
								            if (startAngle * endAngle < 0) {
							 | 
						|
								                if (startAngle < 0) {
							 | 
						|
								                    startAngle += Math.PI * 2;
							 | 
						|
								                    endAngle += Math.PI * 2;
							 | 
						|
								                } else {
							 | 
						|
								                    endAngle += Math.PI * 2;
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            this.tailPointsCount = 50; // 拖尾点数
							 | 
						|
								            this.centerX = centerX;
							 | 
						|
								            this.centerY = centerY;
							 | 
						|
								            this.startAngle = startAngle;
							 | 
						|
								            this.endAngle = endAngle;
							 | 
						|
								            this.radius = radius;
							 | 
						|
								            this.lineWidth = options.width || 1;
							 | 
						|
								            this.strokeStyle = options.color || '#fff';
							 | 
						|
								            this.factor = 2 / this.radius;
							 | 
						|
								            this.deltaAngle = (80 / Math.min(this.radius, 400)) / this.tailPointsCount;
							 | 
						|
								            this.trailAngle = this.startAngle;
							 | 
						|
								            this.arcAngle = this.startAngle;
							 | 
						|
								
							 | 
						|
								            this.animateBlur = true;
							 | 
						|
								
							 | 
						|
								            const size = options.size? options.size/2:1
							 | 
						|
								            this.marker = new Marker({
							 | 
						|
								                x: 50,
							 | 
						|
								                y: 80,
							 | 
						|
								                rotation: 50 * Math.PI / 180,
							 | 
						|
								                style: 'arrow',
							 | 
						|
								                color: 'rgb(255, 255, 255)',
							 | 
						|
								                size: size+1,
							 | 
						|
								                borderWidth: size ,
							 | 
						|
								                borderColor: this.strokeStyle
							 | 
						|
								            });
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        S.prototype.drawArc = function (context, strokeColor, lineWidth, startAngle, endAngle) {
							 | 
						|
								            context.save();
							 | 
						|
								            context.lineWidth = lineWidth;
							 | 
						|
								            // context.lineWidth = 5;
							 | 
						|
								            context.strokeStyle = strokeColor;
							 | 
						|
								            context.shadowColor = this.strokeStyle;
							 | 
						|
								            // context.shadowBlur = 5;
							 | 
						|
								            context.lineCap = "round";
							 | 
						|
								            context.beginPath();
							 | 
						|
								            context.arc(this.centerX, this.centerY, this.radius, startAngle, endAngle, false);
							 | 
						|
								            context.stroke();
							 | 
						|
								            context.restore();
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        S.prototype.draw = function (context) {
							 | 
						|
								            var endAngle = this.endAngle;
							 | 
						|
								            // 匀速
							 | 
						|
								            var angle = this.trailAngle + this.factor;
							 | 
						|
								            var strokeColor = this.strokeStyle;
							 | 
						|
								            if (this.animateBlur) {
							 | 
						|
								                this.arcAngle = angle;
							 | 
						|
								            }
							 | 
						|
								            this.trailAngle = angle;
							 | 
						|
								            strokeColor = utils.calculateColor(strokeColor, 0.1);
							 | 
						|
								
							 | 
						|
								            this.drawArc(context, strokeColor, this.lineWidth, this.startAngle, this.arcAngle);
							 | 
						|
								
							 | 
						|
								            // 拖尾效果
							 | 
						|
								            var count = this.tailPointsCount;
							 | 
						|
								            for (var i = 0; i < count; i++) {
							 | 
						|
								                var arcColor = utils.calculateColor(this.strokeStyle, 0.3 - 0.3 / count * i);
							 | 
						|
								                var tailLineWidth = 5;
							 | 
						|
								                if (this.trailAngle - this.deltaAngle * i > this.startAngle) {
							 | 
						|
								                    this.drawArc(context, arcColor,
							 | 
						|
								                        tailLineWidth - tailLineWidth / count * i,
							 | 
						|
								                        this.trailAngle - this.deltaAngle * i,
							 | 
						|
								                        this.trailAngle
							 | 
						|
								                    );
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            context.save();
							 | 
						|
								            context.translate(this.centerX, this.centerY);
							 | 
						|
								            this.marker.x = Math.cos(this.trailAngle) * this.radius;
							 | 
						|
								            this.marker.y = Math.sin(this.trailAngle) * this.radius;
							 | 
						|
								            this.marker.rotation = this.trailAngle + Math.PI / 2;
							 | 
						|
								            this.marker.draw(context);
							 | 
						|
								            context.restore();
							 | 
						|
								
							 | 
						|
								            if ((endAngle - this.trailAngle) * 180 / Math.PI < 0.5) {
							 | 
						|
								                this.trailAngle = this.startAngle;
							 | 
						|
								                this.animateBlur = false;
							 | 
						|
								            }
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        return S;
							 | 
						|
								    })();
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    var Migration = (function () {
							 | 
						|
								        var M = function (options) {
							 | 
						|
								            this.data = options.data;
							 | 
						|
								            this.store = {
							 | 
						|
								                arcs: [],
							 | 
						|
								                markers: [],
							 | 
						|
								                pulses: [],
							 | 
						|
								                sparks: []
							 | 
						|
								            };
							 | 
						|
								            this.playAnimation = true;
							 | 
						|
								            this.started = false;
							 | 
						|
								            this.context = options.context;
							 | 
						|
								            this.style = options.style;
							 | 
						|
								            this.init();
							 | 
						|
								        };
							 | 
						|
								
							 | 
						|
								        M.prototype.init = function () {
							 | 
						|
								            this.updateData(this.data);
							 | 
						|
								        };
							 | 
						|
								        /*
							 | 
						|
								         * Shape 必须拥有draw方法
							 | 
						|
								        */
							 | 
						|
								        M.prototype.add = function (Shape) {
							 | 
						|
								
							 | 
						|
								        };
							 | 
						|
								        M.prototype.remove = function () {
							 | 
						|
								
							 | 
						|
								        };
							 | 
						|
								        M.prototype.clear = function () {
							 | 
						|
								            this.store = {
							 | 
						|
								                arcs: [],
							 | 
						|
								                markers: [],
							 | 
						|
								                pulses: [],
							 | 
						|
								                sparks: []
							 | 
						|
								            };
							 | 
						|
								            // 更新状态
							 | 
						|
								            this.playAnimation = true;
							 | 
						|
								            this.started = false;
							 | 
						|
								            // 清除绘画实例,如果没有这个方法,多次调用start,相当于存在多个动画队列同时进行
							 | 
						|
								            window.cancelAnimationFrame(this.requestAnimationId);
							 | 
						|
								        };
							 | 
						|
								        /*
							 | 
						|
								         * 更新数据
							 | 
						|
								        */
							 | 
						|
								        M.prototype.updateData = function (data) {
							 | 
						|
								            if (!data || data.length === 0) {
							 | 
						|
								                return;
							 | 
						|
								            }
							 | 
						|
								            this.clear();
							 | 
						|
								            this.data = data;
							 | 
						|
								            if (this.data && this.data.length > 0) {
							 | 
						|
								                arrayUtils.forEach(this.data, function (element) {
							 | 
						|
								                    var arc = new Arc({
							 | 
						|
								                        startX: element.from[0],
							 | 
						|
								                        startY: element.from[1],
							 | 
						|
								                        endX: element.to[0],
							 | 
						|
								                        endY: element.to[1],
							 | 
						|
								                        labels: element.labels,
							 | 
						|
								                        label: this.style.arc.label,
							 | 
						|
								                        font: this.style.arc.font,
							 | 
						|
								                        width: element.arcWidth || this.style.arc.width,
							 | 
						|
								                        color: element.color
							 | 
						|
								                    });
							 | 
						|
								                    var marker = new Marker({
							 | 
						|
								                        x: element.to[0],
							 | 
						|
								                        y: element.to[1],
							 | 
						|
								                        rotation: arc.endAngle + Math.PI / 2,
							 | 
						|
								                        style: 'arrow',
							 | 
						|
								                        color: element.color,
							 | 
						|
								                        size: element.arcWidth || this.style.arc.width+3,
							 | 
						|
								                        borderWidth: 0,
							 | 
						|
								                        borderColor: element.color
							 | 
						|
								                    });
							 | 
						|
								                    var pulse = new Pulse({
							 | 
						|
								                        x: element.to[0],
							 | 
						|
								                        y: element.to[1],
							 | 
						|
								                        radius: this.style.pulse.radius,
							 | 
						|
								                        color: element.color,
							 | 
						|
								                        borderWidth: this.style.pulse.borderWidth
							 | 
						|
								                    });
							 | 
						|
								                    var spark = new Spark({
							 | 
						|
								                        startX: element.from[0],
							 | 
						|
								                        startY: element.from[1],
							 | 
						|
								                        endX: element.to[0],
							 | 
						|
								                        endY: element.to[1],
							 | 
						|
								                        width: 15,
							 | 
						|
								                        color: element.color,
							 | 
						|
								                        size: element.arcWidth
							 | 
						|
								                    });
							 | 
						|
								
							 | 
						|
								                    this.store.arcs.push(arc);
							 | 
						|
								                    this.store.markers.push(marker);
							 | 
						|
								                    this.store.pulses.push(pulse);
							 | 
						|
								                    this.store.sparks.push(spark);
							 | 
						|
								                }, this);
							 | 
						|
								            }
							 | 
						|
								        };
							 | 
						|
								        /*
							 | 
						|
								        */
							 | 
						|
								        M.prototype.start = function (canvas) {
							 | 
						|
								            var that = this;
							 | 
						|
								            if (!this.started) {
							 | 
						|
								                (function drawFrame() {
							 | 
						|
								                    that.requestAnimationId = window.requestAnimationFrame(drawFrame, canvas);
							 | 
						|
								
							 | 
						|
								                    if (that.playAnimation) {
							 | 
						|
								                        canvas.width += 1;
							 | 
						|
								                        canvas.width -= 1;
							 | 
						|
								                        for (var p in that.store) {
							 | 
						|
								                            var shapes = that.store[p];
							 | 
						|
								                            for (var i = 0, len = shapes.length; i < len; i++) {
							 | 
						|
								                                shapes[i].draw(that.context);
							 | 
						|
								                            }
							 | 
						|
								                        }
							 | 
						|
								                    }
							 | 
						|
								                })();
							 | 
						|
								                this.started = true;
							 | 
						|
								            }
							 | 
						|
								        };
							 | 
						|
								        M.prototype.play = function () {
							 | 
						|
								            this.playAnimation = true;
							 | 
						|
								        };
							 | 
						|
								        M.prototype.pause = function () {
							 | 
						|
								            this.playAnimation = false;
							 | 
						|
								        };
							 | 
						|
								        return M;
							 | 
						|
								    })();
							 | 
						|
								
							 | 
						|
								    L.MigrationLayer = L.Class.extend({
							 | 
						|
								        options: {
							 | 
						|
								            map: {},
							 | 
						|
								            data: {},
							 | 
						|
								            pulseRadius: 25,
							 | 
						|
								            pulseBorderWidth: 3,
							 | 
						|
								            arcWidth: 1,
							 | 
						|
								            arcLabel: true,
							 | 
						|
								            arcLabelFont: '15px sans-serif',
							 | 
						|
								            Marker: {},
							 | 
						|
								            Spark: {}
							 | 
						|
								
							 | 
						|
								        },
							 | 
						|
								        _setOptions: function (obj, options) {
							 | 
						|
								            if (!obj.hasOwnProperty('options')) {
							 | 
						|
								                obj.options = obj.options ? L.Util.create(obj.options) : {};
							 | 
						|
								            }
							 | 
						|
								            for (var i in options) {
							 | 
						|
								                obj.options[i] = options[i];
							 | 
						|
								            }
							 | 
						|
								            return obj.options;
							 | 
						|
								        },
							 | 
						|
								        initialize: function (options) {
							 | 
						|
								            this._setOptions(this, options);
							 | 
						|
								            this._map = this.options.map || {};
							 | 
						|
								            this._data = this.options.data || {};
							 | 
						|
								            this._style = {
							 | 
						|
								                pulse: {
							 | 
						|
								                    radius: this.options.pulseRadius,
							 | 
						|
								                    borderWidth: this.options.pulseBorderWidth
							 | 
						|
								                },
							 | 
						|
								                arc: {
							 | 
						|
								                    width: this.options.arcWidth,
							 | 
						|
								                    label: this.options.arcLabel,
							 | 
						|
								                    font: this.options.arcLabelFont
							 | 
						|
								                }
							 | 
						|
								            } || {};
							 | 
						|
								            this._show = true;
							 | 
						|
								            this._init();
							 | 
						|
								        },
							 | 
						|
								        _init: function () {
							 | 
						|
								            var container = L.DomUtil.create('div', 'leaflet-ODLayer-container');
							 | 
						|
								            container.style.position = 'absolute';
							 | 
						|
								            container.style.width = this._map.getSize().x + "px";
							 | 
						|
								            container.style.height = this._map.getSize().y + "px";
							 | 
						|
								
							 | 
						|
								            this.container = container;
							 | 
						|
								
							 | 
						|
								            this.canvas = document.createElement('canvas');
							 | 
						|
								            this.context = this.canvas.getContext('2d');
							 | 
						|
								            container.appendChild(this.canvas);
							 | 
						|
								            this._map.getPanes().overlayPane.appendChild(container);
							 | 
						|
								            //this._resize();
							 | 
						|
								            if (!this.migration) {
							 | 
						|
								                var data = this._convertData();
							 | 
						|
								                this.migration = new Migration({
							 | 
						|
								                    data: data,
							 | 
						|
								                    context: this.context,
							 | 
						|
								                    style: this._style
							 | 
						|
								                });
							 | 
						|
								                //this._draw();
							 | 
						|
								                //this._bindMapEvents();
							 | 
						|
								            }
							 | 
						|
								        },
							 | 
						|
								        _resize: function () {
							 | 
						|
								            var bounds = this._map.getBounds();
							 | 
						|
								            var topleft = bounds.getNorthWest();
							 | 
						|
								            var topLeftscreen = this._map.latLngToContainerPoint(topleft);
							 | 
						|
								            //当地图缩放或者平移到整个地图的范围小于外层容器的范围的时候,要对this.container进行上下平移操作,反之则回归原位
							 | 
						|
								            if (topLeftscreen.y > 0) {
							 | 
						|
								                this.container.style.top = -topLeftscreen.y + 'px';
							 | 
						|
								            } else {
							 | 
						|
								                this.container.style.top = '0px';
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            var containerStyle = window.getComputedStyle(this._map.getContainer());
							 | 
						|
								            this.canvas.setAttribute('width', parseInt(containerStyle.width, 10));
							 | 
						|
								            this.canvas.setAttribute('height', parseInt(containerStyle.height, 10));
							 | 
						|
								        },
							 | 
						|
								        _convertData: function () {
							 | 
						|
								            var bounds = this._map.getBounds();
							 | 
						|
								            let maxValue;
							 | 
						|
								            let minValue
							 | 
						|
								            if (this._data && bounds) {
							 | 
						|
								                arrayUtils.forEach(this._data, function (d) {
							 | 
						|
								                    if(d.value){
							 | 
						|
								                        if(!maxValue){
							 | 
						|
								                            maxValue = d.value;
							 | 
						|
								                            minValue = d.value;
							 | 
						|
								                        }
							 | 
						|
								                        if(maxValue<d.value){
							 | 
						|
								                            maxValue = d.value;
							 | 
						|
								                        }
							 | 
						|
								                        if(minValue>d.value){
							 | 
						|
								                            minValue = d.value;
							 | 
						|
								                        }
							 | 
						|
								                    }
							 | 
						|
								                });
							 | 
						|
								                var maxWidth = this.options.maxWidth || 10;
							 | 
						|
								                var data = arrayUtils.map(this._data, function (d) {
							 | 
						|
								                    if(d.value){
							 | 
						|
								                        if(!maxValue){
							 | 
						|
								                            maxValue = d.value;
							 | 
						|
								                            minValue = d.value;
							 | 
						|
								                        }
							 | 
						|
								                        if(maxValue<d.value){
							 | 
						|
								                            maxValue = d.value;
							 | 
						|
								                        }
							 | 
						|
								                        if(minValue>d.value){
							 | 
						|
								                            minValue = d.value;
							 | 
						|
								                        }
							 | 
						|
								                    }
							 | 
						|
								
							 | 
						|
								                    var fromPixel = this._map.latLngToContainerPoint(new L.LatLng(d.from[1], d.from[0]));
							 | 
						|
								                    var toPixel = this._map.latLngToContainerPoint(new L.LatLng(d.to[1], d.to[0]));
							 | 
						|
								                    return {
							 | 
						|
								                        from: [fromPixel.x, fromPixel.y],
							 | 
						|
								                        to: [toPixel.x, toPixel.y],
							 | 
						|
								                        labels: d.labels,
							 | 
						|
								                        value: d.value,
							 | 
						|
								                        color: d.color,
							 | 
						|
								                        arcWidth: d.value? parseInt((d.value - minValue) * (maxWidth-1)/(maxValue - minValue)) + 1:this.options.arcWidth
							 | 
						|
								                    }
							 | 
						|
								                }, this);
							 | 
						|
								
							 | 
						|
								                
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								                return data;
							 | 
						|
								            }
							 | 
						|
								        },
							 | 
						|
								        _bindMapEvents: function () {
							 | 
						|
								            var that = this;
							 | 
						|
								            // window.onresize = function () {
							 | 
						|
								            //     that._resize();
							 | 
						|
								            // };
							 | 
						|
								            // this._map.on('movestart ', function () {
							 | 
						|
								            //     that.migration.pause();
							 | 
						|
								            // });
							 | 
						|
								            this._map.on('moveend', function () {
							 | 
						|
								                that.migration.play();
							 | 
						|
								                that._draw();
							 | 
						|
								            });
							 | 
						|
								            this._map.on('zoomstart ', function () { that.container.style.display = 'none' });
							 | 
						|
								            this._map.on('zoomend', function () {
							 | 
						|
								                if (that._show) {
							 | 
						|
								                    that.container.style.display = ''
							 | 
						|
								                    that._draw();
							 | 
						|
								                }
							 | 
						|
								            });
							 | 
						|
								        },
							 | 
						|
								        _draw: function () {
							 | 
						|
								            var bounds = this._map.getBounds();
							 | 
						|
								            if (bounds && this.migration.playAnimation) {
							 | 
						|
								                this._resize();
							 | 
						|
								                this._transform();
							 | 
						|
								                var data = this._convertData();
							 | 
						|
								                this.migration.updateData(data);
							 | 
						|
								                this.migration.start(this.canvas);
							 | 
						|
								            }
							 | 
						|
								        },
							 | 
						|
								        _transform: function () {
							 | 
						|
								            var bounds = this._map.getBounds();
							 | 
						|
								            var topLeft = this._map.latLngToLayerPoint(bounds.getNorthWest());
							 | 
						|
								            L.DomUtil.setPosition(this.container, topLeft);
							 | 
						|
								        },
							 | 
						|
								        addTo: function () {
							 | 
						|
								            this._bindMapEvents();
							 | 
						|
								            var bounds = this._map.getBounds();
							 | 
						|
								            if (bounds && this.migration.playAnimation) {
							 | 
						|
								                this._resize();
							 | 
						|
								                this._transform();
							 | 
						|
								
							 | 
						|
								                var data = this._convertData();
							 | 
						|
								                this.migration.updateData(data);
							 | 
						|
								                this.migration.start(this.canvas);
							 | 
						|
								            }
							 | 
						|
								        },
							 | 
						|
								        setData: function (data) {
							 | 
						|
								            this._data = data;
							 | 
						|
								            this._draw();
							 | 
						|
								        },
							 | 
						|
								        hide: function () {
							 | 
						|
								            this.container.style.display = 'none';
							 | 
						|
								            this._show = false;
							 | 
						|
								        },
							 | 
						|
								        show: function () {
							 | 
						|
								            this.container.style.display = '';
							 | 
						|
								            this._show = true;
							 | 
						|
								        },
							 | 
						|
								        play: function () {
							 | 
						|
								            this.migration.play();
							 | 
						|
								        },
							 | 
						|
								        pause: function () {
							 | 
						|
								            this.migration.pause();
							 | 
						|
								        },
							 | 
						|
								        destroy: function () {
							 | 
						|
								            this.migration.clear();
							 | 
						|
								            //移除dom
							 | 
						|
								            this.container.parentNode.removeChild(this.container);
							 | 
						|
								            //移除事件监听
							 | 
						|
								            this._map.clearAllEventListeners();
							 | 
						|
								            this.mapHandles = [];
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								    });
							 | 
						|
								    L.migrationLayer = function (options) {
							 | 
						|
								        return new L.MigrationLayer(options)
							 | 
						|
								    }
							 | 
						|
								})(window)
							 | 
						|
								
							 |