You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

435 lines
13 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
/>
<meta
name="description"
content="Point cloud of the city of Montreal, Canada captured in 2015 with a resolution of 20 cm. Tiled and hosted by Cesium ion."
/>
<meta name="cesium-sandcastle-labels" content="ion Assets" />
<title>Montreal Point Cloud</title>
<script type="text/javascript" src="../Sandcastle-header.js"></script>
<script
type="text/javascript"
src="../../../Build/CesiumUnminified/Cesium.js"
nomodule
></script>
<script type="module" src="../load-cesium-es6.js"></script>
</head>
<body
class="sandcastle-loading"
data-sandcastle-bucket="bucket-requirejs.html"
>
<style>
@import url(../templates/bucket.css);
#toolbar {
background: rgba(42, 42, 42, 0.8);
padding: 4px;
border-radius: 4px;
}
#toolbar input {
vertical-align: middle;
padding-top: 2px;
padding-bottom: 2px;
}
#toolbar .header {
font-weight: bold;
}
</style>
<div id="cesiumContainer" class="fullSize"></div>
<div id="loadingOverlay"><h1>Loading...</h1></div>
<div id="toolbar">
<table>
<tbody>
<tr>
<td class="header">Classification Types</td>
</tr>
<tr>
<td>Ground</td>
<td><input type="checkbox" data-bind="checked: ground" /></td>
</tr>
<tr>
<td>Low Vegetation</td>
<td>
<input type="checkbox" data-bind="checked: low_vegetation" />
</td>
</tr>
<tr>
<td>Medium Vegetation</td>
<td>
<input type="checkbox" data-bind="checked: medium_vegetation" />
</td>
</tr>
<tr>
<td>High Vegetation</td>
<td>
<input type="checkbox" data-bind="checked: high_vegetation" />
</td>
</tr>
<tr>
<td>Buildings</td>
<td><input type="checkbox" data-bind="checked: buildings" /></td>
</tr>
<tr>
<td>Other/Unclassified</td>
<td><input type="checkbox" data-bind="checked: other" /></td>
</tr>
</tbody>
</table>
</div>
<script id="cesium_sandcastle_script">
function startup(Cesium) {
"use strict";
//Sandcastle_Begin
var viewer = new Cesium.Viewer("cesiumContainer", {
terrainProvider: Cesium.createWorldTerrain(),
});
// A ~10 billion point 3D Tileset of the city of Montreal, Canada captured in 2015 with a resolution of 20 cm. Tiled and hosted by Cesium ion.
var tileset = viewer.scene.primitives.add(
new Cesium.Cesium3DTileset({
url: Cesium.IonResource.fromAssetId(28945),
pointCloudShading: {
attenuation: true,
maximumAttenuation: 2,
},
})
);
// Fly to a nice overview of the city.
viewer.camera.flyTo({
destination: new Cesium.Cartesian3(
1223285.2286828577,
-4319476.080312792,
4562579.020145769
),
orientation: {
direction: new Cesium.Cartesian3(
0.63053223097472,
0.47519958296727743,
-0.6136892226931869
),
up: new Cesium.Cartesian3(
0.7699959023135587,
-0.4824455703743441,
0.41755548379407276
),
},
easingFunction: Cesium.EasingFunction.QUADRATIC_IN_OUT,
});
// Add stored views around Montreal. You can add to this list by capturing camera.position, camera.direction and camera.up.
Sandcastle.addToolbarMenu([
{
text: "Overview",
onselect: function () {
viewer.camera.flyTo({
destination: new Cesium.Cartesian3(
1268112.9336926902,
-4347432.089579957,
4539129.813606778
),
orientation: {
direction: new Cesium.Cartesian3(
-0.23288147105081208,
0.9376599248561527,
-0.25799241415197466
),
up: new Cesium.Cartesian3(
-0.015748156073159988,
0.2616156268422992,
0.9650436567182887
),
},
easingFunction: Cesium.EasingFunction.QUADRATIC_IN_OUT,
});
},
},
{
text: "Highway",
onselect: function () {
viewer.camera.flyTo({
destination: new Cesium.Cartesian3(
1266560.143870489,
-4278126.842199712,
4542690.264566619
),
orientation: {
direction: new Cesium.Cartesian3(
-0.3402460635871598,
-0.46669052711538217,
-0.8163532128400116
),
up: new Cesium.Cartesian3(
0.08964012922691329,
-0.8802940231336787,
0.46588311846138497
),
},
easingFunction: Cesium.EasingFunction.QUADRATIC_IN_OUT,
});
},
},
{
text: "Olympic Stadium",
onselect: function () {
viewer.camera.flyTo({
destination: new Cesium.Cartesian3(
1267081.619536883,
-4290744.917138439,
4530941.041519919
),
orientation: {
direction: new Cesium.Cartesian3(
-0.735813047510908,
0.6294547560338262,
0.24973159435503312
),
up: new Cesium.Cartesian3(
-0.09796934684423217,
-0.4638476756625683,
0.88048131204549
),
},
easingFunction: Cesium.EasingFunction.QUADRATIC_IN_OUT,
});
},
},
{
text: "Biosphere Museum",
onselect: function () {
viewer.camera.flyTo({
destination: new Cesium.Cartesian3(
1269319.8408991008,
-4293301.826913256,
4527724.561372451
),
orientation: {
direction: new Cesium.Cartesian3(
-0.742505030107832,
-0.3413204607149223,
-0.5763563336703441
),
up: new Cesium.Cartesian3(
-0.04655102331027917,
-0.8320643756800384,
0.5527222421370013
),
},
easingFunction: Cesium.EasingFunction.QUADRATIC_IN_OUT,
});
},
},
{
text: "St. Joseph's Oratory of Mount Royal",
onselect: function () {
viewer.camera.flyTo({
destination: new Cesium.Cartesian3(
1263148.6745904868,
-4297262.506644816,
4525958.844284831
),
orientation: {
direction: new Cesium.Cartesian3(
0.6550952540993403,
0.7551122393690295,
0.025606913355780074
),
up: new Cesium.Cartesian3(
0.46670450470847263,
-0.4310758971098583,
0.7722437932516845
),
},
easingFunction: Cesium.EasingFunction.QUADRATIC_IN_OUT,
});
},
},
]);
// Set up checkboxes for toggling the various classification settings.
var viewModel = {
ground: true,
other: true,
buildings: true,
low_vegetation: true,
medium_vegetation: true,
high_vegetation: true,
};
// Assign colors to each classification type.
var pointStyles = {
unclassified: {
color: "color('#808080')",
show: true,
},
not_awarded: {
color: "color('#FFDEAD')",
show: true,
},
ground: {
color: "color('#FFDEAD')",
show: true,
},
low_vegetation: {
color: "color('#63FF7E')",
show: true,
},
medium_vegetation: {
color: "color('#63FF7E')",
show: true,
},
high_vegetation: {
color: "color('#22B33A')",
show: true,
},
buildings: {
color: "color('#efefef')",
show: true,
},
low_point: {
color: "color('#808080')",
show: true,
},
reserved_city_diffusion: {
color: "color('#808080')",
show: true,
},
};
var classificationDictionary = {
not_awarded: 1,
ground: 2,
low_vegetation: 3,
medium_vegetation: 4,
high_vegetation: 5,
buildings: 6,
low_point: 7,
reserved_city_diffusion: 8,
unclassified: -1,
};
// This is a helper function to re-apply the styles each time the UI/checkboxes are updated.
function applyStyle(tileset, styles) {
var styleObject = {};
var styleKeys = Object.keys(styles);
styleObject.color = {
conditions: [],
};
styleObject.show = {
conditions: [],
};
var finalCondition;
for (var i = 0; i < styleKeys.length; ++i) {
var key = styleKeys[i];
var id = classificationDictionary[key];
var colorCondition = [
"${Classification} === " + id,
styles[key].color,
];
var showCondition = [
"${Classification} === " + id,
styles[key].show,
];
if (id === -1) {
colorCondition[0] = true;
showCondition[0] = true;
finalCondition = {
colorCondition: colorCondition,
showCondition: showCondition,
};
} else {
styleObject.color.conditions.push(colorCondition);
styleObject.show.conditions.push(showCondition);
}
}
if (Cesium.defined(finalCondition)) {
styleObject.color.conditions.push(finalCondition.colorCondition);
styleObject.show.conditions.push(finalCondition.showCondition);
}
tileset.style = new Cesium.Cesium3DTileStyle(styleObject);
}
// Apply an initial style.
applyStyle(tileset, pointStyles);
Cesium.knockout.track(viewModel);
var toolbar = document.getElementById("toolbar");
Cesium.knockout.applyBindings(viewModel, toolbar);
// Set up the checkboxes.
Cesium.knockout
.getObservable(viewModel, "ground")
.subscribe(function (show) {
pointStyles.ground.show = show;
pointStyles.not_awarded.show = show;
applyStyle(tileset, pointStyles);
});
Cesium.knockout
.getObservable(viewModel, "low_vegetation")
.subscribe(function (show) {
pointStyles.low_vegetation.show = show;
applyStyle(tileset, pointStyles);
});
Cesium.knockout
.getObservable(viewModel, "medium_vegetation")
.subscribe(function (show) {
pointStyles.medium_vegetation.show = show;
applyStyle(tileset, pointStyles);
});
Cesium.knockout
.getObservable(viewModel, "high_vegetation")
.subscribe(function (show) {
pointStyles.high_vegetation.show = show;
applyStyle(tileset, pointStyles);
});
Cesium.knockout
.getObservable(viewModel, "buildings")
.subscribe(function (show) {
pointStyles.buildings.show = show;
applyStyle(tileset, pointStyles);
});
Cesium.knockout
.getObservable(viewModel, "other")
.subscribe(function (show) {
pointStyles.low_point.show = show;
pointStyles.reserved_city_diffusion.show = show;
pointStyles.unclassified.show = show;
applyStyle(tileset, pointStyles);
});
//Sandcastle_End
Sandcastle.finishedLoading();
}
if (typeof Cesium !== "undefined") {
window.startupCalled = true;
startup(Cesium);
}
</script>
</body>
</html>