-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path获取3dtiles的节点树.js
158 lines (139 loc) · 5.08 KB
/
获取3dtiles的节点树.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
Cesium.Ion.defaultAccessToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI1Yzg3ZDEzOS0zN2Q1LTQ2N2YtOWJhMy1mNWU4MWY5N2ExYzkiLCJpZCI6MjAxMzIsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1NzY4MTIzNzR9.SfNeHedDyXWLIPiNbc4qSsHBACm7uvaqRsQprL2J4Cw";
const viewer = (window.viewer = new Cesium.Viewer("cesiumContainer", {
terrain: Cesium.Terrain.fromWorldTerrain(),
}));
viewer.scene.globe.depthTestAgainstTerrain = true;
viewer.extend(Cesium.viewerCesium3DTilesInspectorMixin);
const inspectorViewModel = viewer.cesium3DTilesInspector.viewModel;
const position = Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, 200);
const hpr = new Cesium.HeadingPitchRoll(0, 0, 0);
const fixedFrameTransform = Cesium.Transforms.localFrameToFixedFrameGenerator(
"north",
"west"
);
const tileset = (window.tileset = await Cesium.Cesium3DTileset.fromUrl(
"http://localhost:3001/tileset.json",
{
enableDebugWireframe: true,
modelMatrix: Cesium.Transforms.headingPitchRollToFixedFrame(
position,
hpr,
Cesium.Ellipsoid.WGS84,
fixedFrameTransform
),
}
));
viewer.scene.primitives.add(tileset);
viewer.zoomTo(
tileset,
new Cesium.HeadingPitchRange(0.0, -0.5, tileset.boundingSphere.radius / 4.0)
);
/*---------------------------------------------------------------------------------------*/
const processTileFeature = (content, callback) => {
const innerContents = content.innerContents;
if (innerContents !== undefined) {
innerContents.forEach((item) => processTileFeature(item, callback));
} else {
// processContentFeature
const length = content.featuresLength;
for (let i = 0; i < length; i++) {
const feature = content.getFeature(i);
callback(feature);
}
}
};
// tileset.tileLoad.addEventListener((tile) => {
// processTileFeature(tile.content, (feature) => {
// feature
// .getPropertyIds()
// .forEach((id) => console.log(`${id}:${feature.getProperty(id)}\n`));
// });
// });
/*---------------------------------------------------------------------------------------*/
// 定义一个节点类,用于表示要素节点
class ElementNode {
constructor(label, children, feature, parentContentUrl) {
this.label = label; // 节点名称
this.children = children; // 子节点数组
this.feature = feature; // 关联的要素对象
this.parentContentUrl = parentContentUrl; // 关联的要素对象
}
}
// 构建3D Tiles要素节点树
const buildElementTree = (tileset) => {
const rootNode = new ElementNode("Root", [], null, ""); // 根节点
const nodeMap = new Map(); // 节点映射,用于记录每个tile中的内容对应的节点
// 将要素节点树转化为elementui的tree控件的数据格式
const convertToElementUITreeData = (node) => {
if (node.children.length === 0) {
return {
label: node.label,
feature: node.feature,
};
} else {
return {
label: node.label,
children: node.children.map((child) =>
convertToElementUITreeData(child)
),
};
}
};
// 打印elementui的tree控件的数据
const printElementUITreeData = (data) => {
console.log(JSON.stringify(data, null, 2));
};
// 遍历tileset
tileset.tileLoad.addEventListener((tile) => {
console.log("tile", tile); //tile===tileset.root.children[0]
const tileNode = new ElementNode(
`Tile ${tile._contentResource.url}`,
[],
null,
""
); // tile节点
rootNode.children.push(tileNode);
//tilset -> tile -> Composite3DTileContent -> contents[Model3DTileContent1,Model3DTileContent2] -> feature
// 遍历tile的内容
processTileFeature(tile.content, (feature) => {
const featId = `id:${feature.getProperty(
"id"
)};name:${feature.getProperty("name")}`;
const featureContentUrl = feature.content.url;
const featureNode = new ElementNode(
featId,
[],
featId,
featureContentUrl
); // 要素节点
const contentNode = new ElementNode(
featureContentUrl,
[],
featureContentUrl,
featureContentUrl
);
// 记录节点映射
const key = `featurecontenturl:${featureContentUrl};featureId:${feature.featureId}`;
nodeMap.set(key, featureNode);
nodeMap.set(featureContentUrl, contentNode);
});
console.log("nodeMap", nodeMap);
// 构建节点树
nodeMap.forEach((node, key) => {
const parentContentUrl =
nodeMap.get(key) /* Cesium3DTileFeature */.parentContentUrl; // 查找父节点
if (parentContentUrl) {
const contentNode = nodeMap.get(parentContentUrl); // 查找父节点
if (node.label !== contentNode.label) contentNode.children.push(node); // 添加到父节点的子节点数组中
if (!tileNode.children.some((i) => i === contentNode))
tileNode.children.push(contentNode);
}
});
console.log("rootNode", rootNode);
const elementUITreeData = convertToElementUITreeData(rootNode);
printElementUITreeData(elementUITreeData);
});
};
// 使用示例,在控制台打印出3dtiles节点树
buildElementTree(tileset);