zoukankan      html  css  js  c++  java
  • 【GIS】Supermap-Cesium-BIM模型-改造示例-支持多图层

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
            <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
            <title>BIM模型</title>
            <link href="../libs/supermap10/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
            <link href="../libs/supermap10/css/pretty.css" rel="stylesheet">
            <script src="../libs/supermap10/examples/js/jquery.min.js"></script>
            <script src="../libs/supermap10/examples/js/config.js"></script>
            <script src="../libs/supermap10/examples/js/bootstrap.min.js"></script>
            <script src="../libs/supermap10/examples/js/bootstrap-select.min.js"></script>
            <script src="../libs/supermap10/examples/js/bootstrap-treeview.js"></script>
            <script src="../libs/supermap10/examples/js/spectrum.js"></script>
            <script type="text/javascript" src="../libs/supermap10/examples/js/require.min.js" data-main="../libs/supermap10/examples/js/main"></script>
        </head>
        <body>
            <div id="cesiumContainer"></div>
            <div id='loadingbar' class="spinnerloading">
                <div class="spinner-container container1">
                    <div class="circle1"></div>
                    <div class="circle2"></wdiv>
                    <div class="circle3"></div>
                    <div class="circle4"></div>
                </div>
                <div class="spinner-container container2">
                    <div class="circle1"></div>
                    <div class="circle2"></div>
                    <div class="circle3"></div>
                    <div class="circle4"></div>
                </div>
                <div class="spinner-container container3">
                    <div class="circle1"></div>
                    <div class="circle2"></div>
                    <div class="circle3"></div>
                    <div class="circle4"></div>
                </div>
            </div>
            <div id='tool-menu' class='tool-menu'>
                <a data-toggle='dropdown' id='layerMangerBtn' title='图层管理' class='tool-menu-btn tool-menu-btn-inverse'>
                    <span class='smicon-layerlist tool-menu-btn-icon'></span>
                    <div class="dropDown-container treeview-dropDown-container" id="treeContainer">
                        <div id='layerTree'></div>
                    </div>
                </a>
                <a class='tool-menu-btn tool-menu-btn-inverse' style='padding:10px 0px;'><span style='border-left : 1px solid #dddddd;'></span></a>
                <div id='tool-menu-btn-group' class='tool-menu-btn-group'>
                    <a data-toggle='dropdown' id='colorBtn' title='选中颜色' class='tool-menu-btn tool-menu-btn-inverse'>
                        <span class='fui-list-small-thumbnails tool-menu-btn-icon'></span>
                        <div class="dropDown-container">
                            <div style='min-width : 100px;border-radius : 4px;text-align : left;padding : 10px;'>
                                <label style="font-size:8px">选中颜色: </label><input class="colorPicker" size="8" data-bind="value: material,valueUpdate: 'input'"
                                 id="colorPicker">
                            </div>
                            <div style="text-align : left;padding : 10px;">
                                <label>过滤透明度:</label><input type="number" min="0" max="1" step="0.1" value="0" id="select-filter-alpha" />
                            </div>
                        </div>
                    </a>
                </div>
            </div>
            <div id="bubble" class="bubble" style="bottom:0;left:82%;display:none;">
                <div id="tools" style="text-align : right">
                    <span style="color: rgb(95, 74, 121);padding: 5px;position: absolute;left: 10px;top: 4px;">对象属性</span>
                    <span class="fui-export" id="bubblePosition" style="color: darkgrey; padding:5px" title="停靠"></span>
                    <span class="fui-cross" title="关闭" id="close" style="color: darkgrey;padding:5px"></span>
                </div>
                <div style="overflow-y:scroll;height:150px" id="tableContainer">
                    <table id="tab"></table>
                </div>
            </div>
            <script type="text/javascript">
                function onload(Cesium) {
                    // 初始化viewer部件
                    var viewer = new Cesium.Viewer('cesiumContainer');
                    viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({
                        url: 'https://dev.virtualearth.net',
                        mapStyle: Cesium.BingMapsStyle.AERIAL,
                        key: URL_CONFIG.BING_MAP_KEY
                    }));
                    var scene = viewer.scene;
                    var imageryLayers = viewer.imageryLayers;
                    var baseLayer = imageryLayers.get(0);
                    scene.camera.frustum.near = 0.01;
                    var widget = viewer.cesiumWidget;
                    var infoboxContainer = document.getElementById("bubble");
                    viewer.customInfobox = infoboxContainer;
                    var list = [];
                    $("#toolbar").show();
                    $('#loadingbar').remove();
                    var viewModel = {
                        material: '#ffffff',
                    };
                    $("#colorPicker").spectrum({
                        color: "rgba(23,92,239,0.5)",
                        showPalette: true,
                        showAlpha: true,
                        localStorageKey: "spectrum.demo",
                        palette: palette
                    });
                    Cesium.knockout.track(viewModel);
                    var toolbar = document.getElementById('colorBtn');
                    Cesium.knockout.applyBindings(viewModel, toolbar);
                    try {
                        //场景添加S3M图层服务
                        var promise = scene.open("http://XXXX/iserver/services/3D-XXXX/rest/realspace");
                        // var promise = scene.open(URL_CONFIG.SCENE_BIMBUILDING);
                        Cesium.when(promise, function(layers) {
    
                            //设置相机位置、方向,定位至模型
                            // scene.camera.setView({
                            //     destination: new Cesium.Cartesian3(-2180753.065987198, 4379023.266141494, 4092583.575045952),
                            //     orientation: {
                            //         heading: 4.0392222751147955,
                            //         pitch: 0.010279641987852584,
                            //         roll: 1.240962888005015e-11
                            //     }
                            // });
    
    
                            //初始化树形菜单
                            var $tree = $('#layerTree').treeview({
                                data: [{
                                    text: "图层列表",
                                    selectable: false
                                }],
                                showIcon: false,
                                showCheckbox: true,
                                backColor: 'transparent',
                                color: '#fff',
                                //通过NodeChecked状态设置子图层的显示与隐藏的切换
                                onNodeChecked: function(evt, node) {
                                    var nodeName = node.text;
                                    let layer = layers[nodeName];
                                    console.log(nodeName)
                                    var ids = [];
                                    for (var i = 0; i < list.length; i++) {
                                        if (list[i].datasetName == node.text) {
                                            ids = range(list[i].startID, list[i].endID);
                                            break;
                                        }
                                    }
                                    if (ids.length > 0) {
                                        layer.setOnlyObjsVisible(ids, true);
                                    } else if (node.text == "影像图层" || node.text == "BingMap") {
                                        baseLayer.show = true;
                                    } else {
                                        layer.visible = true;
                                    }
                                },
                                onNodeUnchecked: function(evt, node) {
                                    var nodeName = node.text;
                                    console.log(nodeName)
                                    let layer = layers[nodeName];
                                    var ids = [];
                                    for (var i = 0; i < list.length; i++) {
                                        if (list[i].datasetName == node.text) {
                                            ids = range(list[i].startID, list[i].endID);
                                            break;
                                        }
                                    }
                                    if (ids.length > 0) {
                                        // layer.removeAllObjsColor();
                                        layer.setOnlyObjsVisible(ids, false);
                                    } else if (node.text == "影像图层" || node.text == "BingMap") {
                                        baseLayer.show = false;
                                    } else {
                                        layer.visible = false;
                                    }
                                },
                                //节点被选中时,设该子图层颜色为半透明
                                onNodeSelected: function(evt, node) {
                                    var nodeName = node.text;
                                    console.log(nodeName)
                                    let layer = layers[nodeName];
                                    var ids = [];
                                    for (var i = 0; i < list.length; i++) {
                                        if (list[i].datasetName == node.text) {
                                            ids = range(list[i].startID, list[i].endID);
                                        }
                                    }
                                    if (ids.length > 0) {
                                        layer.releaseSelection();
                                        layer.setSelection(ids);
                                    } else {
                                        layer.removeAllObjsColor();
                                    }
                                }
                            });
                            var rootNode = $tree.treeview('getNode', 0);
                            //加载图层
                            var S3MNode = $tree.treeview('addNode', [rootNode, {
                                text: "S3M图层",
                                showDel: true,
                                fontSize: '10pt',
                                state: {
                                    checked: true
                                }
                            }]);
    
                            // var layer = scene.layers.find("XXXX"); 
                            var layers = {};
                            var layersName = [];
                            for (let i = 0; i < scene.layers._layers.length; i++) {
                                let layer = scene.layers._layers._array[i];
                                //读取子图层信息,通过数组的方式返回子图层的名称以及子图层所包含的对象的IDs
                                layer.setQueryParameter({
                                    url: "http://XXX/iserver/services/data-XXXX/rest/data",
                                    dataSourceName: "XXXX",
                                    dataSetName: layer._name,
                                    isMerge: true,
                                    keyWord: 'SmID'
                                });
                                // layer.setQueryParameter({
                                //     url: "http://www.supermapol.com/realspace/services/data-BIMbuilding/rest/data",
                                //     dataSourceName: "BIMBuilding",
                                //     isMerge: true
                                // });
                                // datainfo(layer);
                                var childNode = $tree.treeview('addNode', [S3MNode, {
                                    text: layer._name,
                                    showDel: true,
                                    fontSize: '10pt',
                                    state: {
                                        checked: true
                                    }
                                }]);
                                datainfo(layer, childNode);
    
                                // 初始化选中颜色
                                var color = new Cesium.Color.fromCssColorString("rgba(23,92,239,0.5)");
                                layer.selectedColor = color;
    
                                // 用户自定义选中颜色
                                Cesium.knockout.getObservable(viewModel, 'material').subscribe(
                                    function(newValue) {
                                        var color = Cesium.Color.fromCssColorString(newValue);
                                        // layer.selectedColor = color;
                                        layersName.forEach(function(item, index, array) {
                                            // layers[item].selectionFiltrateByTransparency = Number($("#select-filter-alpha").val());
                                            layers[item].selectedColor = color;
                                        });
                                    }
                                );
    
                                // 过滤指定透明度一下的要素,选择其后的要素
                                layer.selectionFiltrateByTransparency = 0;
    
                                layers[layer._name] = layer;
                                layersName.push(layer._name);
                            }
    
    
                            //加载子图层
                            function datainfo(layerChild, childNode) {
                                layerChild.datasetInfo().then(function(result) {
                                    list = list.concat(result);
                                    if (result.length > 0) {
                                        for (var i = 0; i < result.length; i++) {
                                            $tree.treeview('addNode', [childNode, {
                                                text: result[i].datasetName,
                                                showDel: true,
                                                fontSize: '10pt',
                                                state: {
                                                    checked: true
                                                }
                                            }]);
                                        }
                                    }
                                });
                            }
    
                            $("#select-filter-alpha").on('input propertychange', function() {
                                layersName.forEach(function(item, index, array) {
                                    layers[item].selectionFiltrateByTransparency = Number($("#select-filter-alpha").val());
                                })
                            });
                        }, function(e) {
                            if (widget._showRenderLoopErrors) {
                                var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';
                                widget.showErrorPanel(title, undefined, e);
                            }
                        });
                    } catch (e) {
                        if (widget._showRenderLoopErrors) {
                            var title = '渲染时发生错误,已停止渲染。';
                            widget.showErrorPanel(title, undefined, e);
                        }
                    }
                    //点击对象查询对象属性
                    var table = document.getElementById("tab");
                    viewer.pickEvent.addEventListener(function(feature) {
                        $("#bubble").show();
                        console.log(feature);
                        for (i = table.rows.length - 1; i > -1; i--) {
                            table.deleteRow(i);
                        }
                        for (var key in feature) {
                            var newRow = table.insertRow();
                            var cell1 = newRow.insertCell();
                            var cell2 = newRow.insertCell();
                            cell1.innerHTML = key;
                            cell2.innerHTML = feature[key];
                        }
                    });
                    $("#bubblePosition").click(function() {
                        if ($("#bubblePosition").hasClass("fui-export")) {
                            viewer.customInfobox = undefined;
                            $("#bubble").removeClass("bubble").addClass("float");
                            $("#bubblePosition").removeClass("fui-export").addClass("fui-bubble");
                            $("#bubblePosition")[0].title = "悬浮";
                            $("#bubble").css({
                                'left': '82%',
                                'bottom': '45%'
                            });
                            $("#tableContainer").css({
                                'height': '350px'
                            });
                        } else if ($("#bubblePosition").hasClass("fui-bubble")) {
                            $("#bubble").removeClass("float").addClass("bubble");
                            $("#bubblePosition").removeClass("fui-bubble").addClass("fui-export");
                            $("#bubblePosition")[0].title = "停靠";
                            $("#tableContainer").css({
                                'height': '150px'
                            });
                            viewer.customInfobox = infoboxContainer;
                        }
                    });
                    $("#close").click(function() {
                        $("#bubble").hide();
                    });
    
                    function range(startID, endID) {
                        var array = [];
                        for (var i = startID; i < endID + 1; i++) {
                            array.push(i);
                        }
                        return array;
                    }
                    //图层列表的隐藏显示
                    $(document).on('click.dropDown-container touchstart.dropDown-container', '[data-toggle=dropdown]', function(evt) {
                        evt.stopPropagation();
                        var target = evt.target;
                        if (!target.contains(evt.currentTarget) && target.tagName != 'SPAN') {
                            return;
                        }
                        var $this = $(this),
                            $parent, isActive;
                        var $target = $this.children('div.dropDown-container');
                        if ($target.length == 0) {
                            $('.dropDown-container').removeClass('dropDown-visible');
                            return;
                        }
                        isActive = $target.hasClass('dropDown-visible');
                        $('.dropDown-container').removeClass('dropDown-visible');
                        if (!isActive) {
                            $target.addClass('dropDown-visible');
                        }
                        return false;
                    });
                    var height = $('body').height() * 0.85 + 'px';
                    $('#treeContainer').css({
                        'height': height,
                        'min-width': '260px',
                        'text-align': 'left'
                    });
                }
            </script>
        </body>
    </html>
  • 相关阅读:
    [转] SQL Server中的行列转换问题
    【原】Sql中时间处理函数 DateAdd & DateDiff
    [转] 为GridView删除添加确认对话框
    【转】jQuery入门指南教程
    [原] Excel(VBA)中数据的非科学记数法显示
    【原】IP地址存储问题
    【转】 asp.net数据导出EXCEL
    【原】有线通设定
    【原】 VS2005/VWD2005调试错误“无法附加,绑定句柄无效”的解决
    [原] Excel中计算2个日期间的时间间隔
  • 原文地址:https://www.cnblogs.com/defineconst/p/13072789.html
Copyright © 2011-2022 走看看