mirror of
https://github.com/jiawanlong/Cesium-Examples.git
synced 2025-11-02 07:44: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> |