Supermap/Cesium 開發心得----動態散點圖(波紋點/漣漪點)


在二維開發中,openlayers4 入門開發系列結合 echarts4 實現散點圖,下圖是GIS之家的效果圖,那么在三維中,則可借助Entity來變相構造下圖的效果。

 思路:

構造實體ellipse,造一個用作實心中心區域的表征位置,再造兩個圓,控制他們的半徑動態變化,然后輪回播放,這其中涉及的是

Cesium.CallbackProperty      

Cesium.ImageMaterialProperty

具體實現步驟:

1、數據准備

我構造一個北京各區的中心作為測試數據

[
{"name":"北京A", "value":100,"coordinates":[116.47202, 40.291]},
{"name":"北京B", "value":500,"coordinates":[116.606235, 40.698838]},
{"name":"北京C", "value":30,"coordinates":[115.895015, 40.143259]},
{"name":"北京D", "value":40,"coordinates":[116.259491, 39.593590]},
{"name":"北京E", "value":10,"coordinates":[117.264262, 40.184631]}
]

2、讀取Json文件,建議不要用eval或者AJAX

//解析JSON文件
//_url的路徑例如:"assets/data/configSites.json"
function analyseJSON(_url,_callback) {
    let url=_url;
    let request = new XMLHttpRequest();
    request.open("get",url);
    request.send(null);
    request.onload = function () {
        if (request.status == 200) {/*返回狀態為200,即為數據獲取成功*/
            var json = JSON.parse(request.responseText);
            _callback(json);
        }
    }
}

3。遍歷Json文件中每個特征點的屬性,構造外部漣漪的效果

 //構造動的擴散漣漪  實際上就是把圖片圓形按時間改變半徑
addCircleRipple({
    json:_JsonData[i],
    deviationR:50,//差值 差值也大 速度越快
    eachInterval:2000,//兩個圈的時間間隔
    imageUrl:"assets/home/redCircle2.png",
    maxR:(_JsonData[i].value)*20
});
/**
 *兩個圓擴散紋理
 * */
function addCircleRipple(data){
    var r1=0,r2=0; var r3=0,r4=0;
    function changeR1() { //這是callback,參數不能內傳
        r1=r1+data.deviationR;
        if(r1>=data.maxR){
            r1=0;
        }
        return r1;
    }
    function changeR2() {
        r2=r2+data.deviationR;
        if(r2>=data.maxR){
            r2=0;
        }
        return r2;
    }
    //第一個圓先跑
    viewer.entities.add({
        description:"LIGHT_POINTS",
        position:Cesium.Cartesian3.fromDegrees(data.json.coordinates[0],data.json.coordinates[1],0),
        show:true,
        ellipse:{
            semiMinorAxis :new Cesium.CallbackProperty(changeR1,false),
            semiMajorAxis :new Cesium.CallbackProperty(changeR2,false),
            height:10,
            material:new Cesium.ImageMaterialProperty({
                image:data.imageUrl,
                repeat:Cesium.Cartesian2(1.0, 1.0),  //指定圖像在每個方向上重復的次數,默認為Cesium.Cartesian2(1.0, 1.0),{Cartesian2}類型
                transparent:true,// 默認為false,當圖像具有透明性時設置為true(例如,當png具有透明部分時)
                color:new Cesium.CallbackProperty(function () {
                    var alp=1-r1/data.maxR;
                    return  Cesium.Color.WHITE.withAlpha(alp)
                    //entity的顏色透明 並不影響材質,並且 entity也會透明
                },false)
            })
        }
    });
    //第二個圓開始跑
    setTimeout(function () {
        function changeR11() { //這是callback,參數不能內傳
            r3=r3+data.deviationR;
            if(r3>=data.maxR){
                r3=0;
            }
            return r3;
        }
        function changeR12() {
            r4=r4+data.deviationR;
            if(r4>=data.maxR){
                r4=0;
            }
            return r4;
        }
        viewer.entities.add({
            description:"LIGHT_POINTS",
            position:Cesium.Cartesian3.fromDegrees(data.json.coordinates[0],data.json.coordinates[1],0),
            show:true,
            ellipse:{
                semiMinorAxis :new Cesium.CallbackProperty(changeR11,false),
                semiMajorAxis :new Cesium.CallbackProperty(changeR12,false),
                height:10,
                material:new Cesium.ImageMaterialProperty({
                    image:data.imageUrl,
                    repeat:Cesium.Cartesian2(1.0, 1.0),
                    transparent:true,
                    color:new Cesium.CallbackProperty(function () {
                        var alp=1-r1/data.maxR;
                        return  Cesium.Color.WHITE.withAlpha(alp)
                        //entity的顏色透明 並不影響材質,並且 entity也會透明
                    },false)
                })
            }
        });
    },data.eachInterval)
}

使用的波紋圓是類似於這種的:

4、構造中心圓實體:

  viewer.entities.add({
            description:"LIGHT_POINTS",
            position:Cesium.Cartesian3.fromDegrees(data.json.coordinates[0],data.json.coordinates[1],0),
            show:true,
            ellipse:{
                semiMinorAxis :(_JsonData[i].value)*5,
                semiMajorAxis :(_JsonData[i].value)*5,
                height:10,
                material:new Cesium.Color(1,0,0,1)
            }
        });

最后的實現效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM