mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 09:14:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			357 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			357 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
(function () {
 | 
						|
    function A(option) {
 | 
						|
        var t = this;
 | 
						|
        t.div = null;
 | 
						|
        t.map = null;
 | 
						|
        t.data = [];
 | 
						|
        t.d3Layer = null;
 | 
						|
 | 
						|
        t._svg = null;
 | 
						|
        t._tempData=null;
 | 
						|
        t._stepPointCount = 4;//每一步所走过的点
 | 
						|
        t._stepPointCountOffset = 5;//每一步所走过的点范围
 | 
						|
        t._minStepLength = 5;//每一段的长度
 | 
						|
        t._maxStepLength = 15;
 | 
						|
        t._stepStatus = {};
 | 
						|
        t._stepPointMargin =3;
 | 
						|
        t._stepNum =3;//有多少个小段
 | 
						|
        t._stepOffset = 30; //点的偏移量
 | 
						|
        t._maxSpeed = 500;
 | 
						|
        t._minSpeed = 200;
 | 
						|
 | 
						|
        t._startOpacity = 0.1;
 | 
						|
        t._endOpacity = 0.9;
 | 
						|
        t._pointCountMultiple = 2;
 | 
						|
        t._mindelay = 30;
 | 
						|
        t._maxdelay = 300;
 | 
						|
        t._startColor=187;
 | 
						|
        t._endColor=94;
 | 
						|
        t._isStop = false;
 | 
						|
        t._isMove = false;
 | 
						|
        t._isAddData = false;
 | 
						|
        t.__isStop = null;
 | 
						|
        for (var key in option) {
 | 
						|
            t[key] = option[key];
 | 
						|
        }
 | 
						|
 | 
						|
        t.createSVG();
 | 
						|
 | 
						|
        t.d3Layer.events.on({moveend: function (evt) {
 | 
						|
            //console.log("moveend");
 | 
						|
            if(t._isMove){
 | 
						|
                t._isMove = false;
 | 
						|
                //t._isStop = t.__isStop;
 | 
						|
                //t.__isStop = null;
 | 
						|
            }
 | 
						|
            t._refresh(evt);
 | 
						|
        }});
 | 
						|
//        t.d3Layer.events.on({movestart: function (evt) {
 | 
						|
//            console.log("movestart");
 | 
						|
//            t._isStop = true;
 | 
						|
//        }});
 | 
						|
        t.d3Layer.events.on({move: function (evt) {
 | 
						|
            //console.log("move");
 | 
						|
            if(!t._isMove){
 | 
						|
                //t.__isStop = t._isStop;
 | 
						|
                //t._isStop = true;
 | 
						|
                t._isMove = true;
 | 
						|
                //t._svg.selectAll("path").style("display","none");
 | 
						|
            }
 | 
						|
            t._svg.selectAll("path").style("display","none");
 | 
						|
        }});
 | 
						|
    }
 | 
						|
    var P = A.prototype;
 | 
						|
    P.createSVG = function () {
 | 
						|
        var t = this;
 | 
						|
        var size = t.map.getSize();
 | 
						|
        t._svg = d3.select(t.div)
 | 
						|
            .append("svg")
 | 
						|
            .attr("width", size.w)
 | 
						|
            .attr("height", size.h);
 | 
						|
 | 
						|
        //d3.select(t.div).html("<span id='fefe'></span>");
 | 
						|
    }
 | 
						|
    P.addData = function(data){
 | 
						|
        var t = this;
 | 
						|
        if(t._isAddData){
 | 
						|
           return;
 | 
						|
        }
 | 
						|
        else{
 | 
						|
            t._isAddData = true;
 | 
						|
        }
 | 
						|
        t._isStop = false;
 | 
						|
        t.data = data;
 | 
						|
        var defs = d3.select("svg")
 | 
						|
            .append("defs");
 | 
						|
        var linearGradient = defs.append("linearGradient").attr({
 | 
						|
            id:"orange_red",
 | 
						|
            x1:"0%",
 | 
						|
            y1:"0%",
 | 
						|
            x2:"100%",
 | 
						|
            y2:"0%"
 | 
						|
        });
 | 
						|
        linearGradient.append("stop").attr({
 | 
						|
            offset:"0%"
 | 
						|
        })
 | 
						|
        .style({
 | 
						|
            "stop-color":"rgb("+t._startColor+","+t._startColor+","+t._startColor+")",
 | 
						|
            "stop-opacity":1
 | 
						|
        });
 | 
						|
 | 
						|
        linearGradient.append("stop").attr({
 | 
						|
            offset:"100%"
 | 
						|
        })
 | 
						|
            .style({
 | 
						|
                "stop-color":"rgb("+t._endColor+","+t._endColor+","+t._endColor+")",
 | 
						|
                "stop-opacity":1
 | 
						|
            });
 | 
						|
        var tempData = t._tempData = t.getPosition(data);
 | 
						|
        var bindData = [];
 | 
						|
        for(var i=0;i<data.length;i+=2){    //data.length
 | 
						|
            bindData.push(i);
 | 
						|
        }
 | 
						|
        t._svg.selectAll('path')
 | 
						|
            .data(bindData)
 | 
						|
            .enter()
 | 
						|
            .append("path")
 | 
						|
            .style("stroke", "url(#orange_red)")
 | 
						|
            .style("stroke-width", 1)
 | 
						|
            .style("fill", "none")
 | 
						|
            .style("opacity",0.9)
 | 
						|
            .call(function(selection){
 | 
						|
                t.lineAnimate(selection);
 | 
						|
            });
 | 
						|
 | 
						|
 | 
						|
    }
 | 
						|
    P.getPath = function(index){
 | 
						|
        var t = this;
 | 
						|
        var line = t._tempData[index];
 | 
						|
        var length = line.length;
 | 
						|
        var status = t._stepStatus[index];
 | 
						|
        var pointStrArray = [];
 | 
						|
        for(var i=0;i<status.length;i++){ //status.length
 | 
						|
            var statusi = status[i];
 | 
						|
            var start = statusi.start;
 | 
						|
            var pointCount =statusi.pointCount;
 | 
						|
            start = start+pointCount;
 | 
						|
            var end = statusi.end;
 | 
						|
            var stepLength = statusi.stepLength;
 | 
						|
            if(start>=length){
 | 
						|
                start = length;
 | 
						|
            }
 | 
						|
            if(start-end<=stepLength){
 | 
						|
 | 
						|
            }
 | 
						|
            else{
 | 
						|
                end = end+pointCount;
 | 
						|
            }
 | 
						|
 | 
						|
            var newStart = start;
 | 
						|
 | 
						|
            var offsetX =statusi.offsetX;
 | 
						|
            var offsetY = statusi.offsetY;
 | 
						|
 | 
						|
            pointStrArray.push("M"+offset(line[end],offsetX,offsetY).join(" "));
 | 
						|
            if(stepLength>=4){
 | 
						|
                for(var j=end+1;j<end+stepLength;j++){
 | 
						|
                    if(j<start){
 | 
						|
                        pointStrArray.push((j==0?"C":"")+offset(line[j],offsetX,offsetY).join(" "));
 | 
						|
                    }
 | 
						|
                    else{
 | 
						|
                        pointStrArray.push((j==0?"C":"")+offset(line[start-1],offsetX,offsetY).join(" "));
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else{
 | 
						|
                for(var j=end+1;j<end+stepLength;j++){
 | 
						|
                    if(j<start){
 | 
						|
                        pointStrArray.push("L"+offset(line[j],offsetX,offsetY).join(" "));
 | 
						|
                    }
 | 
						|
                    else{
 | 
						|
                        pointStrArray.push("L"+offset(line[start-1],offsetX,offsetY).join(" "));
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            statusi.start = newStart;
 | 
						|
            statusi.end = end;
 | 
						|
        }
 | 
						|
 | 
						|
        function offset(point,offsetX,offsetY){
 | 
						|
            return [point[0]+offsetX,point[1]+offsetY];
 | 
						|
        }
 | 
						|
        return pointStrArray.join(" ");// + " Z"
 | 
						|
    }
 | 
						|
    P.lineAnimate = function(selection) {
 | 
						|
        var t = this;
 | 
						|
        selection.style("opacity", t._startOpacity);
 | 
						|
//        window.setTimeout(function(selection){
 | 
						|
//            return function(){
 | 
						|
//
 | 
						|
//            }
 | 
						|
//        }(selection),Math.round(t._mindelay+Math.random()*(t._maxdelay- t._mindelay)));
 | 
						|
 | 
						|
        selection
 | 
						|
            .transition()
 | 
						|
            .duration(function(){
 | 
						|
                return Math.round(t._mindelay+Math.random()*(t._maxdelay- t._mindelay))
 | 
						|
            })
 | 
						|
            .attr("d",function(d){
 | 
						|
                var line = t._tempData[d];
 | 
						|
                var length = line.length;
 | 
						|
                var stepDistance = t._stepPointCount+ t._stepPointMargin;
 | 
						|
                var count = t._stepNum;
 | 
						|
                t._stepStatus[d] = [];
 | 
						|
                for(var i=0;i<count;i++){
 | 
						|
                    var start = stepDistance*i;
 | 
						|
                    if(start>=length){
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                    var stepLength = t._minStepLength+Math.round(Math.random()*(t._maxStepLength- t._minStepLength));
 | 
						|
                    if(start+stepLength>=length){
 | 
						|
                        stepLength = length-start;
 | 
						|
                    }
 | 
						|
                    for(var j=0;j<t._pointCountMultiple;j++){
 | 
						|
                        t._stepStatus[d].push({
 | 
						|
                            start:start,
 | 
						|
                            end:start,
 | 
						|
                            offsetX:Math.round(Math.random()*t._stepOffset-t._stepOffset/2),
 | 
						|
                            offsetY:Math.round(Math.random()*t._stepOffset-t._stepOffset/2),
 | 
						|
                            pointCount: t._stepPointCount+Math.round(Math.random()*(t._stepPointCountOffset-t._stepPointCount)),
 | 
						|
                            stepLength:stepLength
 | 
						|
                        });
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                t._stepStatus[d].speed = t._minSpeed + Math.round(Math.random()*(t._maxSpeed-t._minSpeed));
 | 
						|
                var path = t.getPath(d);
 | 
						|
                return path;
 | 
						|
            })
 | 
						|
            .call(function(selection){
 | 
						|
                t.step(selection);
 | 
						|
            });
 | 
						|
    }
 | 
						|
    P.step = function(selection){
 | 
						|
        //console.log("step");
 | 
						|
        var t = this;
 | 
						|
        selection.transition()
 | 
						|
            .ease('linear')
 | 
						|
            .duration(function(d){
 | 
						|
                return t._stepStatus[d].speed;
 | 
						|
            })
 | 
						|
            .attr("d",function(d){
 | 
						|
                var path = t.getPath(d);
 | 
						|
                return path;
 | 
						|
            })
 | 
						|
            .style("opacity",function(d){
 | 
						|
                var status = t._stepStatus[d];
 | 
						|
                var lastStart = status[status.length-1].start;
 | 
						|
                var line = t._tempData[d];
 | 
						|
                var length = line.length;
 | 
						|
 | 
						|
                var opacity = t._startOpacity + (lastStart/length)*(t._endOpacity- t._startOpacity);
 | 
						|
                return opacity;
 | 
						|
            })
 | 
						|
            .each('end', function() {
 | 
						|
                if(t._isStop)return;
 | 
						|
                var obj = d3.select(this);
 | 
						|
                var d = obj.data()[0];
 | 
						|
                var status = t._stepStatus[d];
 | 
						|
                var lastStart = status[status.length-1].start;
 | 
						|
                var line = t._tempData[d];
 | 
						|
                var length = line.length;
 | 
						|
                if(lastStart>=length){
 | 
						|
                    obj
 | 
						|
                        .transition()
 | 
						|
                        .duration(500)
 | 
						|
                        .style('opacity', t._startOpacity)
 | 
						|
                        .each('end',function(){
 | 
						|
                            d3.select(this).call(function(selection){
 | 
						|
                                t.lineAnimate(selection);
 | 
						|
                            });
 | 
						|
                        });
 | 
						|
                }
 | 
						|
                else{
 | 
						|
                    obj.call(function(selection){
 | 
						|
                        t.step(selection);
 | 
						|
                    });
 | 
						|
                }
 | 
						|
            });
 | 
						|
    }
 | 
						|
    P.getPosition = function(datas){
 | 
						|
        var tempDatas = [],t = this;
 | 
						|
        if(datas){
 | 
						|
            for(var i=0;i<datas.length;i++){
 | 
						|
                var line = datas[i];
 | 
						|
                var tempLine = [];
 | 
						|
                for(var j=0;j<line.length;j++){
 | 
						|
                    var point = line[j];
 | 
						|
                    var tempPoint = this.d3Layer.getLayerPxFromLonLat(new SuperMap.LonLat(point[0],point[1]));
 | 
						|
                    tempLine.push([tempPoint.x,tempPoint.y]);
 | 
						|
                }
 | 
						|
                tempDatas.push(tempLine);
 | 
						|
            }
 | 
						|
 | 
						|
        }
 | 
						|
        return tempDatas;
 | 
						|
    }
 | 
						|
    P._refresh = function(evt){
 | 
						|
        var t = this;
 | 
						|
        var tempData = t._tempData = t.getPosition(t.data);
 | 
						|
        if(tempData){
 | 
						|
            if(t._isStop){
 | 
						|
                t._svg.selectAll("path").attr("d",function(d){
 | 
						|
                    var path = t.getPath(d);
 | 
						|
                    return path;
 | 
						|
                });
 | 
						|
                t._svg.selectAll("path").style("display","block");
 | 
						|
            }
 | 
						|
            else{
 | 
						|
                //if(evt.zoomChanged){
 | 
						|
                    t._svg.selectAll("path").style("display","none");
 | 
						|
                //}
 | 
						|
                t._svg.selectAll("path").attr("d",function(d){
 | 
						|
                    var path = t.getPath(d);
 | 
						|
                    return path;
 | 
						|
                });
 | 
						|
                t._isStop = true;
 | 
						|
                setTimeout(function(){
 | 
						|
                    t._isStop = false;
 | 
						|
                    t._svg.selectAll("path")
 | 
						|
                    .attr("d",function(d){
 | 
						|
                        var path = t.getPath(d);
 | 
						|
                        return path;
 | 
						|
                    })
 | 
						|
                    .style("display","block")
 | 
						|
                    .call(function(selection){
 | 
						|
                        t.step(selection);
 | 
						|
                    });
 | 
						|
                    //if(evt.zoomChanged){
 | 
						|
                        t._svg.selectAll("path").style("display","block");
 | 
						|
                    //}
 | 
						|
                },300);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    P.clear = function(){
 | 
						|
        var t = this;
 | 
						|
        t._isStop = true;
 | 
						|
        t._svg.selectAll("path").remove();
 | 
						|
        t._svg.selectAll("defs").remove();
 | 
						|
        t._isAddData = false;
 | 
						|
    }
 | 
						|
    P.stop = function(){
 | 
						|
        this._isStop = true;
 | 
						|
    }
 | 
						|
    P.run = function(){
 | 
						|
        var t = this;
 | 
						|
        if(t._isStop){
 | 
						|
            t._isStop = false;
 | 
						|
            t._svg.selectAll("path").call(function(selection){
 | 
						|
                t.step(selection);
 | 
						|
            });
 | 
						|
        }
 | 
						|
    }
 | 
						|
    window.D3WindMap = A;
 | 
						|
})() |