(CesiumJS Version 1.37(
我将批处理的 3D 图块集图层加载到 CesiumJS 中;我知道我可以使用 tile.content 访问该磁贴集中每个磁贴的内容;就我而言,该磁贴内容中的每个要素都对应于一个建筑物。读取要素(=建筑物(的所有属性非常简单:
var content = tile.content;
for (let i = 0; i < content.featuresLength; i++) {
const feature = content.getFeature(i);
const propertyNames = feature.getPropertyNames()
const numProperties = propertyNames.length
for(let j = 0; j < numProperties; j++){
const propertyName = propertyNames[j]
const propertyValue = feature.getProperty(propertyName)
console.log(' ' + propertyName + ': ' + propertyValue)
}
}
但现在我寻求一种同样简单俗气的方式来获取特征的几何形状(=在我的情况下为构建(。我的印象是此信息有些隐藏,因为批处理 3D 图块集图层引用的 gltf(或者更确切地说是 glb(文件会立即进入显卡,并且我无法访问(?
我似乎发现了一个效果很好的黑客。我的问题与我想访问特征(即 gltf(的几何体的时间有关,即在加载内容之后。不过,我发现我可以在加载时访问几何图形。因此,整个问题变成了:"我如何拦截加载过程,以便我可以在加载时对几何体进行自己的分析"。
背景:几何存储在 content._model.gltf 中。如果 content._model.releaseGltfJson 为 true,Cesium 会在加载后删除 content._model.gltf(或此 getter 引用的缓存条目(。
我的截取是:
// HACK!
const oldB3dmFactory = Cesium.Cesium3DTileContentFactory.b3dm
Cesium.Cesium3DTileContentFactory.b3dm = function(tileset, tile, url, arrayBuffer,
byteOffset) {
const content = oldB3dmFactory(tileset, tile, url, arrayBuffer, byteOffset)
console.log("Cesium3DTileContentFactory.b3dm intercepted, so we can access the content with the GLTF")
const gltf = content._model.gltf
content.readyPromise.then(()=>{
// _model.gltf is undefined because
// releaseGltfJson === true
content.log(content._model.gltf)
})
return content
}
警告:这仅适用于批处理 3D 图块集 (b3dm(。您需要将Cesium.Cesium3DTileContentFactory.b3dm
替换为pnts
、i3dm
、cmpt
或json
,以便此代码段与其他类型的几何体一起使用。