Viewing CityJSON using CityJSONLoader
How to load a CityJSON model directly into a xeokit web viewer.
Click on the preview below to run the example. Scroll down to learn how it's made.
Viewing CityJSON using CityJSONLoader
HTML
Listed below is the HTML for this example.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Viewing CityJSON using CityJSONLoader</title>
<style>
body {
background-color: white;
overflow: hidden;
margin: 0;
user-select: none;
}
#demoCanvas {
width: 100%;
height: 100%;
position: absolute;
background: white;
border: 0;
}
</style>
</head>
<body>
<canvas id="demoCanvas"></canvas>
</body>
<script type="module" src="./index.js"></script>
</html>
JavaScript
Listed below is the JavaScript for this example, which we'll break down into steps.
1. Import the SDK from a bundle built for these examples.
import * as xeokit from "../../js/xeokit-demo-bundle.js";
2. Create a helper that sets up the Scene
@xeokit/sdk / scene / Scene / Class Scene Represents the root container for all scene‑level state, including models, objects,
meshes, geometries, textures and runtime events. @xeokit/sdk / internal / WebGLRenderer / Class WebGLRenderer WebGL renderer backing a Viewer.
import {DemoHelper} from "../../js/DemoHelper.js";
const demoHelper = new DemoHelper({});
demoHelper.init().then(({
scene,
data,
viewer,
view,
renderer
}) => {
3. Create a CityJSONLoader
@xeokit/sdk / cityjson / CityJSONLoader / Class CityJSONLoader Loads a CityJSON file into a SceneModel
@xeokit/sdk / scene / SceneModel / Class SceneModel Contains a model's geometry and materials. @xeokit/sdk / data / DataModel / Class DataModel Contains a model's semantic data, as an entity-relationship graph.
const cityJSONLoader = new xeokit.formats.cityjson.CityJSONLoader();
4. Configure the View
@xeokit/sdk / viewManager / View / null View
view.camera.worldAxis = [
1, 0, 0, // Right +X
0, 0, 1, // Up +Z
0, -1, 0 // Forward -Y
];
5. Arrange the View's Camera
@xeokit/sdk / viewManager / Camera / null Camera
view.camera.eye = [11.50, 16.32, 15.12];
view.camera.look = [9.01, 9.65, 11.22];
view.camera.up = [-0.16, -0.45, 0.87];
view.camera.zoom(-15)
6. Create a SceneModel to hold our model's geometry and materials
const sceneModelResult = scene.createModel({
id: "demoModel",
7. coordinateSystem: { // Model's local CityJSON-standard coordinate system basis: [ 1, 0, 0, // Right +X 0, 0, 1, // Up +Z 0, -1, 0 // Forward -Y ], origin: [0, 0, 0], units: "meters" }
});
if (!sceneModelResult.ok) {
return;
}
const sceneModel = sceneModelResult.value;
8. Create a DataModel to hold semantic data for our model
const dataModelResult = data.createModel({
id: "demoModel"
});
if (!dataModelResult.ok) {
return;
}
const dataModel = dataModelResult.value;
9. Use CityJSONLoader to load an IFC model from a dotbim file into our SceneModel and DataModel
fetch("../../models/LoD3_Railway/cityjson/model.json").then(response => {
response
.json()
.then(fileData => {
cityJSONLoader.load({
fileData,
sceneModel,
dataModel
}).then(() => {
10. The Scene and SceneModel will now contain a SceneObject
@xeokit/sdk / scene / SceneObject / Class SceneObject An object within a SceneModel. @xeokit/sdk / data / Data / Class Data Represents the root container for semantic data, including models, objects,
relationships and property sets. @xeokit/sdk / data / DataObject / Class DataObject An object within a DataModel. @xeokit/sdk / viewManager / ViewObject / null ViewObject
demoHelper.finished();
}).catch(message => {
console.error(`Error loading CityJSON: ${message}`);
});
});
});
});