Cesium加载3D Tiles数据

使用原生Cesium加载3D Tiles数据,并实现对图层的选中、样式的修改、图元的隐藏。

实现代码
<!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>3D Tiles</title>
    <link href="../cesium-1.86/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
    <script src="./libs/jquery-2.1.1.min.js"></script>
    <script type="text/javascript" src="../cesium-1.86/Build/Cesium/Cesium.js"></script>
</head>

<body>
    <div id="cesiumContainer"></div>
    <script>

        let Viewer, tileset;
        let selectPickedEntity = null;

        // 切换自己的token
        Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJlYTQ2ZjdjNS1jM2E0LTQ1M2EtOWM0My1mODMzNzY3YjYzY2YiLCJpZCI6MjkzMjcsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1OTE5NDIzNjB9.RzKlVTVDTQ9r7cqCo-PDydgUh8Frgw0Erul_BVxiS9c';

        function onload(Cesium) {

            var obj = [6378137.0, 6378137.0, 6356752.3142451793];
            Cesium.Ellipsoid.WGS84 = Object.freeze(new Cesium.Ellipsoid(obj[0], obj[1], obj[2]));
            Viewer = new Cesium.Viewer('cesiumContainer', {
                infoBox: false,
                animation: false,       //动画
                homeButton: true,       //home键
                geocoder: true,         //地址编码
                baseLayerPicker: false, //图层选择控件
                timeline: false,        //时间轴
                fullscreenButton: true, //全屏显示
                infoBox: true,         //点击要素之后浮窗
                sceneModePicker: true,  //投影方式  三维/二维
                navigationInstructionsInitiallyVisible: false, //导航指令
                navigationHelpButton: false,     //帮助信息
                selectionIndicator: false, // 选择
            });
            //关闭logo
            Viewer._cesiumWidget._creditContainer.style.display = 'none';

            //addImageLayer();
            add3DTiles();

            function addImageLayer() {
                var imageryLayers = Viewer.imageryLayers;
                var subdomains = ['0', '1', '2', '3', '4', '5', '6', '7'];
                var tiandituTk = '天地图官网申请的Token';
                var labelImagery = new Cesium.WebMapTileServiceImageryProvider({
                    //影像底图
                    url: "http://t{s}.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=" + tiandituTk,
                    subdomains: subdomains,
                    layer: "tdtImgLayer",
                    style: "default",
                    format: "image/jpeg",
                    tileMatrixSetID: "GoogleMapsCompatible",//使用谷歌的瓦片切片方式
                    show: true
                })

                imageryLayers.addImageryProvider(labelImagery);
            }

            function add3DTiles() {
                tileset = Viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
                    url: '../3data/tileset.json',
                    shadows: Cesium.ShadowMode.DISABLED,
                    luminanceAtZenith: 1 //Cesium 1.53版本后增加的luminanceAtZenith,用来调节程序纹理的亮度
                }));

                tileset.readyPromise.then(function (layer) {
                    console.log('----->', layer, layer.content);
                    tileset.style = new Cesium.Cesium3DTileStyle({
                        color: {
                            conditions: [
                                // ["true", "color('white')"]
                                ["true", "rgba(255,255,255,1)"]
                            ]
                        },
                    });
                    Viewer.flyTo(tileset);
                    handle();
                }).otherwise(function (error) {
                    throw (error);
                });

                // 设置瓦片加载完成监听事件,获取所有的所有feature数据信息
                tileset.tileLoad.addEventListener(function (tile) {
                    let content = tile.content;
                    console.log(content);
                    let featuresLength = content.featuresLength;
                    console.log("要素数量为:" + featuresLength);
                    console.log("第一个要素为:");
                    let feature = content.getFeature(0);
                    console.log(feature);
                })
            }

            function handle() {
                var handler = new Cesium.ScreenSpaceEventHandler(Viewer.canvas);

                handler.setInputAction(function (movement) {

                    //还原前选择要素的本颜色
                    if (selectPickedEntity) {
                        selectPickedEntity.color = Cesium.Color.WHITE;
                        selectPickedEntity = null;
                    }

                    var pickingEntity = Viewer.scene.pick(movement.position);
                    //判断选择是否为Cesium3DTileFeature
                    if (pickingEntity instanceof Cesium.Cesium3DTileFeature) {
                        selectPickedEntity = pickingEntity;

                        var propertyNames = pickingEntity.getPropertyNames();
                        var length = propertyNames.length;
                        for (var i = 0; i < length; ++i) {
                            var propertyName = propertyNames[i];
                            console.log(propertyName + ': ' + pickingEntity.getProperty(propertyName));
                        }
                        //隐藏选中的要素
                        //pickingEntity.show = false;

                        //将模型变为黄色高亮
                        pickingEntity.color = Cesium.Color.RED;
                    }
                }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
            }
        }

        if (typeof Cesium !== 'undefined') {
            window.startupCalled = true;
            onload(Cesium);
        }
    </script>
</body>

</html>
实现效果

在这里插入图片描述

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cesium加载本地的3D Tiles,你可以使用以下方法: 1. 首先,创建一个Cesium的Viewer对象,并将其绑定到HTML中的一个div容器上,用于显示地图。例如: ```javascript const viewer = new Cesium.Viewer("cesiumContainer"); ``` 2. 然后,创建一个Cesium3DTileset对象,并将其添加到场景的图元组中。你可以使用相对路径或绝对路径指定数据的来源。例如: ```javascript const tileset = viewer.scene.primitives.add( new Cesium.Cesium3DTileset({ url: 'modeldata/3Dtilesdata' // 使用相对路径指定数据来源 // 或者使用绝对路径指定数据来源 // url: 'http://example.com/modeldata/3Dtilesdata' }) ); ``` 3. 最后,你可以根据需要对加载3D Tiles进行进一步的操作,比如缩放视图、设置样式等。例如: ```javascript (async () => { try { await tileset.readyPromise; await viewer.zoomTo(tileset); // 设置默认样式 tileset.style = new Cesium.Cesium3DTileStyle({ // 样式的具体设置 }); } catch (error) { console.log(error); } })(); ``` 请注意,以上代码只是一个示例,你需要根据你的实际情况进行相应的修改和调整。同时,确保你的本地3D Tiles数据的路径和文件名是正确的。 希望对你有所帮助! #### 引用[.reference_title] - *1* *2* *3* [【CesiumCesium加载3DTiles与问题总结(JS)](https://blog.csdn.net/m0_47420894/article/details/123718739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值