Google Photorealistic 3D Tiles with Building Insert
Runnable Cesium example: Google Photorealistic 3D Tiles with Building Insert. Open the live demo, read the complete source, and copy the file into your project. No build step or API key.
single HTML file · CDN dependencies onlyinterface may contain Chinese labels
Source
<!--
示例:实景城市中插入建筑
说明:实景城市里插入一栋高亮的新楼,与周边体块区分开
核心逻辑:程序化城市体块 + 插入体块 → 描边与高亮材质 → 对比
依赖:CesiumJS 1.121 · jsDelivr CDN
-->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta name="robots" content="noindex,follow">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>实景城市中插入建筑</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/cesium@1.121.0/Build/Cesium/Widgets/widgets.css">
<style>
html,body{height:100%;margin:0}
body{background:#0e1116;color:#e6e8ec;overflow:hidden;
font:13px/1.6 -apple-system,"Segoe UI","PingFang SC",sans-serif}
#c{height:100%}
.tip{position:absolute;left:12px;top:12px;z-index:5;
background:rgba(23,28,35,.9);border:1px solid #2a313b;border-radius:6px;
padding:8px 12px;font-size:12px;color:#a2a9b6;max-width:320px;line-height:1.6}
.cesium-viewer-bottom .cesium-widget-credits,.cesium-viewer-animationContainer,
.cesium-viewer-timelineContainer{display:none!important}
</style>
</head>
<body>
<div id="c"></div>
<div class="tip">中间浅色描边的楼是插入的,周围是既有城市体块。</div>
<script src="https://cdn.jsdelivr.net/npm/cesium@1.121.0/Build/Cesium/Cesium.js"></script>
<script>
(function () {
'use strict';
var viewer = new Cesium.Viewer('c', {
baseLayer: false,
baseLayerPicker: false, geocoder: false, homeButton: false,
sceneModePicker: false, navigationHelpButton: false,
animation: false, timeline: false, fullscreenButton: false,
infoBox: false, selectionIndicator: false
});
var scene = viewer.scene;
scene.globe.baseColor = Cesium.Color.fromCssColorString('#1c2733');
scene.backgroundColor = Cesium.Color.fromCssColorString('#0e1116');
scene.skyBox.show = false;
scene.sun.show = false;
scene.moon.show = false;
if (scene.skyAtmosphere) scene.skyAtmosphere.show = false;
function facade(tint) {
var c = document.createElement('canvas');
c.width = 128; c.height = 128;
var ctx = c.getContext('2d');
ctx.fillStyle = tint; ctx.fillRect(0, 0, 128, 128);
ctx.fillStyle = 'rgba(30,36,44,0.7)';
for (var y = 10; y < 128; y += 22) {
for (var x = 8; x < 128; x += 26) { ctx.fillRect(x, y, 16, 12); }
}
return c.toDataURL('image/png');
}
var existing = new Cesium.ImageMaterialProperty({
image: facade('#8c9198'), repeat: new Cesium.Cartesian2(2, 2)
});
for (var i = 0; i < 12; i++) {
for (var j = 0; j < 9; j++) {
if (i >= 5 && i <= 7 && j >= 3 && j <= 4) continue; /* 留出插入位置 */
var h = 26 + ((i * 9 + j * 5) % 7) * 11;
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(
116.3852 + i * 0.00078, 39.9016 + j * 0.00074, h / 2
),
box: {
dimensions: new Cesium.Cartesian3(24, 22, h),
material: existing
}
});
}
}
/* 插入的新楼:更高、更亮、带描边 */
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(116.3897, 39.9044, 58),
box: {
dimensions: new Cesium.Cartesian3(40, 34, 116),
material: Cesium.Color.fromCssColorString('#cfe2f5').withAlpha(0.92),
outline: true,
outlineColor: Cesium.Color.fromCssColorString('#ffb13d')
}
});
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(116.3942, 39.8990, 380),
orientation: { heading: Cesium.Math.toRadians(26), pitch: Cesium.Math.toRadians(-22), roll: 0 },
duration: 0
});
})();
</script>
</body>
</html>
Language: the code and this page are in English; the full tutorial and API notes for this example are in Chinese. The demo itself is the authoritative version — it runs exactly as shown.