• 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)
                }
            });

    最后的实现效果:

  • 相关阅读:
    Vue组件之间传值
    Vue 调试工具
    组件注册
    组件化思想
    图书列表案例
    数组相关API
    Vue常用特性
    选项卡案例
    Vue模板语法
    案例选项卡
  • 原文地址:https://www.cnblogs.com/yangzhengier/p/11848529.html
Copyright © 2020-2023  润新知