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.
226 lines
8.0 KiB
HTML
226 lines
8.0 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="Use 3D Tiles Styling to assign colors based on material or find all office buildings."
|
|
/>
|
|
<meta name="cesium-sandcastle-labels" content="Beginner, 3D Tiles" />
|
|
<title>Cesium Demo</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);
|
|
</style>
|
|
<div id="cesiumContainer" class="fullSize"></div>
|
|
<div id="loadingOverlay">
|
|
<h1>Loading...</h1>
|
|
</div>
|
|
<div id="toolbar">
|
|
<select class="cesium-button" id="dropdown">
|
|
<option value="0">Color By Building Material</option>
|
|
<option value="1">Color By Distance To Selected Location</option>
|
|
<option value="2">Highlight Residential Buildings</option>
|
|
<option value="3">Show Office Buildings Only</option>
|
|
<option value="4">Show Apartment Buildings Only</option>
|
|
</select>
|
|
<table class="infoPanel">
|
|
<tbody>
|
|
<tr>
|
|
<td>Click on a building to select as the central location</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<script id="cesium_sandcastle_script">
|
|
function startup(Cesium) {
|
|
"use strict";
|
|
//Sandcastle_Begin
|
|
|
|
// How to use the 3D Tiles Styling language to style individual features, like buildings.
|
|
// Styling language specification: https://github.com/CesiumGS/3d-tiles/tree/master/specification/Styling
|
|
var viewer = new Cesium.Viewer("cesiumContainer", {
|
|
terrainProvider: Cesium.createWorldTerrain(),
|
|
});
|
|
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
|
|
|
|
// Add Cesium OSM buildings to the scene as our example 3D Tileset.
|
|
var osmBuildingsTileset = Cesium.createOsmBuildings();
|
|
viewer.scene.primitives.add(osmBuildingsTileset);
|
|
|
|
// Set the initial camera to look at Seattle
|
|
viewer.scene.camera.setView({
|
|
destination: Cesium.Cartesian3.fromDegrees(-122.3472, 47.598, 370),
|
|
orientation: {
|
|
heading: Cesium.Math.toRadians(10),
|
|
pitch: Cesium.Math.toRadians(-10),
|
|
},
|
|
});
|
|
|
|
// Styling functions
|
|
|
|
// Color by material checks for null values since not all
|
|
// buildings have the material property.
|
|
function colorByMaterial() {
|
|
osmBuildingsTileset.style = new Cesium.Cesium3DTileStyle({
|
|
defines: {
|
|
material: "${feature['building:material']}",
|
|
},
|
|
color: {
|
|
conditions: [
|
|
["${material} === null", "color('white')"],
|
|
["${material} === 'glass'", "color('skyblue', 0.5)"],
|
|
["${material} === 'concrete'", "color('grey')"],
|
|
["${material} === 'brick'", "color('indianred')"],
|
|
["${material} === 'stone'", "color('lightslategrey')"],
|
|
["${material} === 'metal'", "color('lightgrey')"],
|
|
["${material} === 'steel'", "color('lightsteelblue')"],
|
|
["true", "color('white')"], // This is the else case
|
|
],
|
|
},
|
|
});
|
|
}
|
|
|
|
function highlightAllResidentialBuildings() {
|
|
osmBuildingsTileset.style = new Cesium.Cesium3DTileStyle({
|
|
color: {
|
|
conditions: [
|
|
[
|
|
"${feature['building']} === 'apartments' || ${feature['building']} === 'residential'",
|
|
"color('cyan', 0.9)",
|
|
],
|
|
[true, "color('white')"],
|
|
],
|
|
},
|
|
});
|
|
}
|
|
|
|
function showByBuildingType(buildingType) {
|
|
switch (buildingType) {
|
|
case "office":
|
|
osmBuildingsTileset.style = new Cesium.Cesium3DTileStyle({
|
|
show: "${feature['building']} === 'office'",
|
|
});
|
|
break;
|
|
case "apartments":
|
|
osmBuildingsTileset.style = new Cesium.Cesium3DTileStyle({
|
|
show: "${feature['building']} === 'apartments'",
|
|
});
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Color the buildings based on their distance from a selected central location
|
|
function colorByDistanceToCoordinate(pickedLatitude, pickedLongitude) {
|
|
osmBuildingsTileset.style = new Cesium.Cesium3DTileStyle({
|
|
defines: {
|
|
distance:
|
|
"distance(vec2(${feature['cesium#longitude']}, ${feature['cesium#latitude']}), vec2(" +
|
|
pickedLongitude +
|
|
"," +
|
|
pickedLatitude +
|
|
"))",
|
|
},
|
|
color: {
|
|
conditions: [
|
|
["${distance} > 0.014", "color('blue')"],
|
|
["${distance} > 0.010", "color('green')"],
|
|
["${distance} > 0.006", "color('yellow')"],
|
|
["${distance} > 0.0001", "color('red')"],
|
|
["true", "color('white')"],
|
|
],
|
|
},
|
|
});
|
|
}
|
|
|
|
// When dropdown option is not "Color By Distance To Selected Location",
|
|
// remove the left click input event for selecting a central location
|
|
function removeCoordinatePickingOnLeftClick() {
|
|
document.querySelector(".infoPanel").style.visibility = "hidden";
|
|
handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
|
}
|
|
|
|
// Add event listeners to dropdown menu options
|
|
document.querySelector(".infoPanel").style.visibility = "hidden";
|
|
var menu = document.getElementById("dropdown");
|
|
|
|
menu.options[0].onselect = function () {
|
|
removeCoordinatePickingOnLeftClick();
|
|
colorByMaterial();
|
|
};
|
|
|
|
menu.options[1].onselect = function () {
|
|
// Default to Space Needle as the central location
|
|
colorByDistanceToCoordinate(47.62051, -122.34931);
|
|
document.querySelector(".infoPanel").style.visibility = "visible";
|
|
// Add left click input to select a building to and extract its coordinates
|
|
handler.setInputAction(function (movement) {
|
|
viewer.selectedEntity = undefined;
|
|
var pickedBuilding = viewer.scene.pick(movement.position);
|
|
if (pickedBuilding) {
|
|
var pickedLatitude = pickedBuilding.getProperty(
|
|
"cesium#latitude"
|
|
);
|
|
var pickedLongitude = pickedBuilding.getProperty(
|
|
"cesium#longitude"
|
|
);
|
|
colorByDistanceToCoordinate(pickedLatitude, pickedLongitude);
|
|
}
|
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
|
};
|
|
|
|
menu.options[2].onselect = function () {
|
|
removeCoordinatePickingOnLeftClick();
|
|
highlightAllResidentialBuildings();
|
|
};
|
|
|
|
menu.options[3].onselect = function () {
|
|
removeCoordinatePickingOnLeftClick();
|
|
showByBuildingType("office");
|
|
};
|
|
|
|
menu.options[4].onselect = function () {
|
|
removeCoordinatePickingOnLeftClick();
|
|
showByBuildingType("apartments");
|
|
};
|
|
|
|
menu.onchange = function () {
|
|
Sandcastle.reset();
|
|
var item = menu.options[menu.selectedIndex];
|
|
if (item && typeof item.onselect === "function") {
|
|
item.onselect();
|
|
}
|
|
};
|
|
|
|
colorByMaterial();
|
|
|
|
//Sandcastle_End
|
|
Sandcastle.finishedLoading();
|
|
}
|
|
if (typeof Cesium !== "undefined") {
|
|
window.startupCalled = true;
|
|
startup(Cesium);
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|