如何利用Cesium.js批量生成3D建筑模型

33 阅读2分钟

Cesium.js是一个功能强大的开源JavaScript库,它允许开发者在Web应用中创建和展示3D地球和地图。利用Cesium.js,我们可以加载和渲染3D建筑模型,为用户提供沉浸式的地理空间体验。本文将详细介绍如何使用Cesium.js生成3D建筑。

1. 创建Cesium应用

首先,你需要创建一个Cesium应用。如果你使用的是Vue 3,可以通过以下步骤来集成Cesium:

javascript
import * as Cesium from 'cesium';
import "cesium/Build/Cesium/Widgets/widgets.css";

Cesium.Ion.defaultAccessToken = '你的Cesium Ion访问令牌';
const viewer = new Cesium.Viewer("cesiumContainer", {
    terrain: Cesium.Terrain.fromWorldTerrain()
});

2. 添加Cesium OSM Buildings和Cesium World Terrain

Cesium OSM Buildings是一个全球基础层,包含超过3.5亿座建筑物,源自OpenStreetMap数据。你可以将其作为3D Tiles添加到你的应用中:

javascript
const buildingsTileset = await Cesium.createOsmBuildingsAsync();
viewer.scene.primitives.add(buildingsTileset);

Cesium World Terrain是一个全球高分辨率3D地形层,适合需要精确建筑高度的应用。

3. 显示新建筑地面范围

在添加新建筑物之前,你可以添加一个GeoJSON文件来标记它的覆盖区(footprint):

javascript
async function addBuildingGeoJSON() {
  const new_building_denver = '/new_building_denver.json';
  const buildingGeoJSON = await Cesium.GeoJsonDataSource.load(new_building_denver, { clampToGround: true });
  const dataSource = await viewer.dataSources.add(buildingGeoJSON);
  for (const entity of dataSource.entities.values) {
    entity.polygon.classificationType = Cesium.ClassificationType.TERRAIN;
  }
}

4. 隐藏场地上现有的3D建筑物

使用3D Tiles样式语言来隐藏特定区域的现有建筑物:

javascript
buildingsTileset.style = new Cesium.Cesium3DTileStyle({
  show: {
    conditions: [
      ['${elementId} === 332469316', false],
      ['${elementId} === 332469317', false],
      // 更多条件...
      [true, true]
    ]
  }
});

5. 将新建筑添加到场景中

最后,你可以将新建筑的3D模型(例如GLB格式)添加到场景中:

javascript
async function showNewBuilding() {
  const newBuildingTilesetUrl = '/PSFS.glb';
  const position = Cesium.Cartesian3.fromDegrees(-104.9909, 39.73579, 1577);
  const headingPositionRoll = new Cesium.HeadingPitchRoll(-8, 0, 0);
  const newBuildingTileset = await Cesium.Model.fromGltfAsync({
    url: newBuildingTilesetUrl,
    modelMatrix: Cesium.Transforms.headingPitchRollToFixedFrame(position, headingPositionRoll, Cesium.Ellipsoid.WGS84)
  });
  viewer.scene.primitives.add(newBuildingTileset);
}

通过这些步骤,你可以在Cesium.js中生成和显示3D建筑。这不仅可以用于可视化拟建建筑的影响,还可以用于各种空间分析和数据可视化应用。