mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 09:14:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			237 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!--********************************************************************
 | 
						|
* by jiawanlong
 | 
						|
*********************************************************************-->
 | 
						|
<!DOCTYPE html>
 | 
						|
<html>
 | 
						|
 | 
						|
<head>
 | 
						|
    <meta charset="UTF-8" />
 | 
						|
    <link rel="stylesheet" href="./../../libs/cesium/Cesium1.98/Widgets/widgets.css">
 | 
						|
    <script type="text/javascript" src="./../../libs/cesium/Cesium1.98/Cesium.js"></script>
 | 
						|
</head>
 | 
						|
 | 
						|
<body style="margin: 0; overflow: hidden; background: #fff; width: 100%; height: 100%; position: absolute; top: 0">
 | 
						|
    <div id="map" style="margin: 0 auto; width: 100%; height: 100%"></div>
 | 
						|
    <script type="text/javascript">
 | 
						|
 | 
						|
        const viewer = new Cesium.Viewer('map', {
 | 
						|
            imageryProvider: false,
 | 
						|
            baseLayerPicker: false,
 | 
						|
        });
 | 
						|
 | 
						|
        // 加载xyz
 | 
						|
        var xyz = new Cesium.UrlTemplateImageryProvider({
 | 
						|
            "credit": "mapbox",
 | 
						|
            "url": 'https://api.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}.webp?sku=1016Ab1dNMw2X&access_token=pk.eyJ1IjoidHJhbXBqd2wiLCJhIjoiY2xhYXIxbHExMDN3dzN3cGliOHdrMThxMiJ9.6er2aYb1EBjSsK1-t9d2-w'
 | 
						|
        })
 | 
						|
        viewer.imageryLayers.addImageryProvider(xyz)
 | 
						|
 | 
						|
        // 开启帧率
 | 
						|
        viewer.scene.debugShowFramesPerSecond = true;
 | 
						|
 | 
						|
        const tileset = new Cesium.Cesium3DTileset({
 | 
						|
            url: "./L0/tileset.json",
 | 
						|
        });
 | 
						|
 | 
						|
 | 
						|
        tileset.debugShowBoundingVolume = true; // 显示包围盒
 | 
						|
        tileset.readyPromise
 | 
						|
            .then(function (tileset) {
 | 
						|
                let demo = viewer.scene.primitives.add(tileset);
 | 
						|
                var r = 255;
 | 
						|
                var g = 255;
 | 
						|
                var b = 255;
 | 
						|
                var a = 0.2;
 | 
						|
                tileset.style = new Cesium.Cesium3DTileStyle({
 | 
						|
                    color: "color('rgba(" + r + "," + g + "," + b + ", " + a + ")')",
 | 
						|
                    pointOutlineColor: 'color("blue")',
 | 
						|
                    pointOutlineWidth: 10,
 | 
						|
                })
 | 
						|
                viewer.zoomTo(tileset)
 | 
						|
                console.log(tileset)
 | 
						|
                tileset.enableShowOutline = true;
 | 
						|
 | 
						|
                const FILL_COLOR = Cesium.Color.RED.withAlpha(0.5); // 填充色
 | 
						|
                const boxInstances = []; // 填充部分
 | 
						|
                const edgeInstances = []; // 边框部分
 | 
						|
                const EDGE_WIDTH = 1; // 边框宽度
 | 
						|
                const EDGE_COLOR = Cesium.Color.BLACK; // 边框色
 | 
						|
 | 
						|
                demo.tileLoad.addEventListener(function (tile) {
 | 
						|
                    console.log(tile.content.featuresLength)
 | 
						|
 | 
						|
                    for (let index = 0; index < tile.content.featuresLength; index++) {
 | 
						|
 | 
						|
                        let minx_miny_minz = tile.content.getFeature(index).getProperty('bb.minX, bb.minY, bb.minZ')
 | 
						|
                        let maxx_maxy_maxz = tile.content.getFeature(index).getProperty('bb.maxX, bb.maxY, bb.maxZ')
 | 
						|
 | 
						|
                        minx_miny_minz = parseCoordinate(minx_miny_minz)
 | 
						|
                        maxx_maxy_maxz = parseCoordinate(maxx_maxy_maxz)
 | 
						|
 | 
						|
                        // var hello = viewer.entities.add({
 | 
						|
                        //     position: minx_miny_minz,
 | 
						|
                        //     point: {
 | 
						|
                        //         pixelSize: 5,
 | 
						|
                        //         color: Cesium.Color.RED,
 | 
						|
                        //         outlineColor: Cesium.Color.WHITE,
 | 
						|
                        //         outlineWidth: 2,
 | 
						|
 | 
						|
                        //     },
 | 
						|
                        //     label: {
 | 
						|
                        //         text: '左前下',
 | 
						|
                        //         font: '14pt monospace',
 | 
						|
                        //         outlineWidth: 2,
 | 
						|
                        //     }
 | 
						|
                        // });
 | 
						|
                        //   var hello = viewer.entities.add({
 | 
						|
                        //     position: maxx_maxy_maxz,
 | 
						|
                        //     point: {
 | 
						|
                        //         pixelSize: 5,
 | 
						|
                        //         color: Cesium.Color.RED,
 | 
						|
                        //         outlineColor: Cesium.Color.WHITE,
 | 
						|
                        //         outlineWidth: 2,
 | 
						|
 | 
						|
                        //     },
 | 
						|
                        //     label: {
 | 
						|
                        //         text: '右后上',
 | 
						|
                        //         font: '14pt monospace',
 | 
						|
                        //         outlineWidth: 2,
 | 
						|
                        //     }
 | 
						|
                        // });
 | 
						|
 | 
						|
                        let x = tile.content.getFeature(index).getProperty('centerX')
 | 
						|
                        let y = tile.content.getFeature(index).getProperty('centerY')
 | 
						|
                        let z = tile.content.getFeature(index).getProperty('centerZ')
 | 
						|
 | 
						|
                        const CUBE_SIZE = parseFloat(tile.content.getFeature(index).getProperty('zSize'))
 | 
						|
                        // let CUBE_SIZE = 7.663837909698486 ;
 | 
						|
 | 
						|
 | 
						|
                        const center = Cesium.Cartesian3.fromDegrees(
 | 
						|
                            parseFloat(x), parseFloat(y), parseFloat(z)
 | 
						|
                        );
 | 
						|
 | 
						|
                        // 获取ENU转换矩阵
 | 
						|
                        const enuMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center);
 | 
						|
 | 
						|
                        // --- 1. 创建立方体填充 ---
 | 
						|
                        const halfSize = CUBE_SIZE / 2;
 | 
						|
                        boxInstances.push(new Cesium.GeometryInstance({
 | 
						|
                            geometry: new Cesium.BoxGeometry({
 | 
						|
                                vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
 | 
						|
                                minimum: new Cesium.Cartesian3(-halfSize, -halfSize, -halfSize),
 | 
						|
                                maximum: new Cesium.Cartesian3(halfSize, halfSize, halfSize)
 | 
						|
                            }),
 | 
						|
                            modelMatrix: enuMatrix,
 | 
						|
                            attributes: {
 | 
						|
                                color: Cesium.ColorGeometryInstanceAttribute.fromColor(FILL_COLOR)
 | 
						|
                            }
 | 
						|
                        }));
 | 
						|
 | 
						|
                        // --- 2. 创建立方体边框 ---
 | 
						|
                        const localVertices = [
 | 
						|
                            new Cesium.Cartesian3(-halfSize, -halfSize, -halfSize), // 0 左前下
 | 
						|
                            new Cesium.Cartesian3(halfSize, -halfSize, -halfSize),  // 1 右前下
 | 
						|
                            new Cesium.Cartesian3(halfSize, halfSize, -halfSize),   // 2 右后下
 | 
						|
                            new Cesium.Cartesian3(-halfSize, halfSize, -halfSize),  // 3 左后下
 | 
						|
                            new Cesium.Cartesian3(-halfSize, -halfSize, halfSize),  // 4 左前上
 | 
						|
                            new Cesium.Cartesian3(halfSize, -halfSize, halfSize),   // 5 右前上
 | 
						|
                            new Cesium.Cartesian3(halfSize, halfSize, halfSize),    // 6 右后上
 | 
						|
                            new Cesium.Cartesian3(-halfSize, halfSize, halfSize)   // 7 左后上
 | 
						|
                        ];
 | 
						|
                        // 转换为世界坐标
 | 
						|
                        const worldVertices = localVertices.map(local =>
 | 
						|
                            Cesium.Matrix4.multiplyByPoint(enuMatrix, local, new Cesium.Cartesian3())
 | 
						|
                        );
 | 
						|
 | 
						|
                        // 定义12条边
 | 
						|
                        const edges = [
 | 
						|
                            [worldVertices[0], worldVertices[1]], [worldVertices[1], worldVertices[2]],
 | 
						|
                            [worldVertices[2], worldVertices[3]], [worldVertices[3], worldVertices[0]],
 | 
						|
                            [worldVertices[4], worldVertices[5]], [worldVertices[5], worldVertices[6]],
 | 
						|
                            [worldVertices[6], worldVertices[7]], [worldVertices[7], worldVertices[4]],
 | 
						|
                            [worldVertices[0], worldVertices[4]], [worldVertices[1], worldVertices[5]],
 | 
						|
                            [worldVertices[2], worldVertices[6]], [worldVertices[3], worldVertices[7]]
 | 
						|
                        ];
 | 
						|
 | 
						|
                        // 添加边框实例
 | 
						|
                        edges.forEach(edge => {
 | 
						|
                            edgeInstances.push(new Cesium.GeometryInstance({
 | 
						|
                                geometry: new Cesium.PolylineGeometry({
 | 
						|
                                    positions: edge,
 | 
						|
                                    width: EDGE_WIDTH,
 | 
						|
                                    vertexFormat: Cesium.PolylineMaterialAppearance.VERTEX_FORMAT
 | 
						|
                                }),
 | 
						|
                                attributes: {
 | 
						|
                                    color: Cesium.ColorGeometryInstanceAttribute.fromColor(EDGE_COLOR)
 | 
						|
                                }
 | 
						|
                            }));
 | 
						|
                        });
 | 
						|
 | 
						|
                    }
 | 
						|
 | 
						|
 | 
						|
                    viewer.scene.primitives.add(new Cesium.Primitive({
 | 
						|
                        geometryInstances: boxInstances,
 | 
						|
                        appearance: new Cesium.PerInstanceColorAppearance({
 | 
						|
                            translucent: true,
 | 
						|
                            flat: true
 | 
						|
                        }),
 | 
						|
                        asynchronous: false
 | 
						|
                    }));
 | 
						|
 | 
						|
                    viewer.scene.primitives.add(new Cesium.Primitive({
 | 
						|
                        geometryInstances: edgeInstances,
 | 
						|
                        appearance: new Cesium.PolylineMaterialAppearance({
 | 
						|
                            material: new Cesium.Material({
 | 
						|
                                fabric: {
 | 
						|
                                    type: 'Color',
 | 
						|
                                    uniforms: {
 | 
						|
                                        color: EDGE_COLOR // 直接使用定义的EDGE_COLOR
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }),
 | 
						|
                            translucent: true
 | 
						|
                        }),
 | 
						|
                        asynchronous: false
 | 
						|
                    }));
 | 
						|
 | 
						|
                    viewer.scene.primitives.remove(tileset)
 | 
						|
 | 
						|
                })
 | 
						|
 | 
						|
            })
 | 
						|
            .catch(function (error) {
 | 
						|
                console.log(error);
 | 
						|
            });
 | 
						|
 | 
						|
 | 
						|
        let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
 | 
						|
        handler.setInputAction(function (clickEvent) {
 | 
						|
            // 获取被点击的实体
 | 
						|
            var ray1 = viewer.camera.getPickRay(clickEvent.position);
 | 
						|
            var cartesian = viewer.scene.globe.pick(ray1, viewer.scene);
 | 
						|
            var pick = viewer.scene.pickPosition(clickEvent.position);
 | 
						|
            var pickEd = viewer.scene.pick(clickEvent.position);
 | 
						|
            if (pickEd && pick) {
 | 
						|
                console.log(pickEd)
 | 
						|
            }
 | 
						|
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        function parseCoordinate(str) {
 | 
						|
            const regex = /Point3D\{\s*x\s*=\s*(-?\d+(?:\.\d+)?)\s*,\s*y\s*=\s*(-?\d+(?:\.\d+)?)\s*,\s*z\s*=\s*(-?\d+(?:\.\d+)?)\s*\}/;
 | 
						|
            const match = str.match(regex);
 | 
						|
            if (match) {
 | 
						|
                const x = parseFloat(match[1]);
 | 
						|
                const y = parseFloat(match[2]);
 | 
						|
                const z = parseFloat(match[3]);
 | 
						|
                return new Cesium.Cartesian3(x, y, z)
 | 
						|
            }
 | 
						|
 | 
						|
        }
 | 
						|
    </script>
 | 
						|
</body>
 | 
						|
 | 
						|
</html> |