计算3dtiles面积需要使用Cesium内置的 Tileset
类型提供的方法。以下是一个通过Vue和Cesium加载3dtiles并计算其面积的示例代码:
<template>
<div id="cesiumContainer"></div>
</template>
<script>
import Cesium from 'cesium/Cesium'
import 'cesium/Widgets/widgets.css'
export default {
name: 'TilesetArea',
data() {
return {
viewer: null,
tileset: null,
tilesetArea: 0
}
},
mounted() {
this.init()
},
methods: {
// 初始化
init() {
this.viewer = new Cesium.Viewer('cesiumContainer', {
animation: false,
baseLayerPicker: false,
geocoder: false,
timeline: false
})
this.viewer.imageryLayers.remove(this.viewer.imageryLayers.get(0))
this.addTileset()
this.viewer.zoomTo(this.tileset)
this.computeTilesetArea() // 计算3dtiles面积
},
// 添加tileset
addTileset() {
this.tileset = new Cesium.Cesium3DTileset({
url: 'https://XXX.XXX.XXX.XXX/Tilesets/tileset.json'
})
this.viewer.scene.primitives.add(this.tileset)
},
// 计算tileset面积
computeTilesetArea() {
let boundingSphere = this.tileset.boundingSphere
let cartographic = Cesium.Rectangle.fromCartesian3(boundingSphere.center)
let surfacePromise = Cesium.sampleTerrainMostDetailed(this.viewer.terrainProvider, [cartographic])
Cesium.when(surfacePromise, function (updatedPositions) {
let positions = Cesium.Cartesian3.fromRadiansArray(updatedPositions)
let ph = new Cesium.PolygonHierarchy(positions)
let area = Cesium.PolygonGeometryLibrary.computeArea2D([ph])
this.tilesetArea = area / 1000000.0 // 平方米转平方千米
console.log('tileset面积:' + this.tilesetArea + '平方千米')
}.bind(this))
}
}
}
</script>
<style>
#cesiumContainer {
width: 100%;
height: 100vh;
margin-top: -70px;
position: absolute;
top: 60px;
left: 0px;
}
</style>
在代码中,我们使用了Cesium内置的Tileset
对象加载了一个3dtiles模型,并使用 computeArea2D()
方法计算其面积。需要注意的是由于计算的单位为平方米,所以最终将结果换算成了平方千米。