可视域空间分析管道效果
关键引入文件:
- 第一步:引入框架地图关键文件
- https://mhc.ixiera.com/mhc/main_min.js
- https://mhc.ixiera.com/mhc/Cesium-1.120/Build/Cesium/Cesium.js
- https://mhc.ixiera.com/mhc/Cesium3DTile.js
- 第二步:引入可视域空间分析文件
- https://mhc.ixiera.com/mhc/mchmap/UAVpathTrajectory/js/UAVPathTrajectoryManager.min.js
- https://mhc.ixiera.com/mhc/mchmap/Viewershed/js/Viewershed.min.js
- https://mhc.ixiera.com/mhc/mchmap/Viewershed/js/DroneViewershed.min.js
1.初始化
var uavManager = new UAVPathTrajectoryManager(viewer, {
dronecontroller: {pathPoints: initialPositions },
pipeGenerator: {pathPoints: initialPositions },
}); //加载飞行路径 如果想配置更多,请参考无人机轨道
droneViewershed = new DroneViewershed(viewer,uavManager.droneController,params); //初始化可视域分析控制器
2.参数说明:
viewer:创建的view实例。
droneController:创建无人机飞行实例-参考无人机管道飞行。
params:(Array)参数 (可不传)
| param 参数 | 数据类型 | 是否必填 | 说明 |
| horizontalViewAngle | number | 选填 | 水平视角,默认值:60° |
| verticalViewAngle | number | 选填 | // 垂直视角,默认值:45° |
| shadowMappingSize | number | 选填 | 阴影贴图大小,默认值:1024 (值越大计算越大,对cpu的占用越高) |
| visibleColor | Cesium.Color | 选填 | 可视区域颜色,默认值:Cesium.Color.GREEN.withAlpha(0.5) |
| invisibleColor | Cesium.Color | 选填 | 不可视区域颜色,默认值:Cesium.Color.RED.withAlpha(0.5) |
| viewDistance | number | 选填 | 可视距离,默认值:50 |
| isShowSketch | boolean | 选填 | 是否显示锥体线条草图,默认值:true |
3.显示/隐藏可视域分析 toggleAnalysis
droneViewershed.toggleAnalysis();
4.更新param 参数方法 updateConfig
例:droneViewershed.updateConfig({ isShowSketch: false})
5.完成代码实例
<script src="https://mhc.ixiera.com/mhc/main.js"></script>
<script src="https://mhc.ixiera.com/mhc/Cesium-1.120/Build/Cesium/Cesium.js"></script>
<script src="https://mhc.ixiera.com/mhc/Cesium3DTile.js"></script>
<script src="https://mhc.ixiera.com/mhc/mchmap/UAVpathTrajectory/js/UAVPathTrajectoryManager.min.js"></script>
<script src="https://mhc.ixiera.com/mhc/mchmap/Viewershed/js/Viewershed.js"></script>
<script src="https://mhc.ixiera.com/mhc/mchmap/Viewershed/js/DroneViewershed.js"></script>
<style>
.btnsBox {position: fixed;top: 10px;left: 10px;width: 70%;height: 30px;}
.btnsBox button {background-color: #fff;border-radius: 2px;color: #333;line-height: 30px;margin-right: 15px;font-size: 12px;padding: 0 15px;cursor: pointer;}
#controlPanel {position: absolute;top: 50px;left: 10px;background: rgba(42, 42, 42, 0.8);color: white;padding: 10px;border-radius: 5px;z-index: 1000;}
.config-item {margin: 8px 0;display: flex; align-items: center;gap: 10px;}
.radio-group { display: flex; gap: 15px; margin-left: 10px;}
.radio-group label { display: flex;align-items: center; gap: 5px;}
.config-item input[type="range"] { flex-grow: 1; }
.config-item span { min-width: 30px;text-align: right;}
</style>
<body>
<div id="cesiumContainer"></div>
<div class="btnsBox">
<button onclick="createShed()">创建可视域分析</button>
<button onclick="toggleShed()">开启/关闭可视域分析</button>
<button onclick="toggleShowSketch()">配置:关闭网格</button>
</div>
<div id="controlPanel">
<div class="config-section">
<h4>更直观可视域参数配置</h4>
<div class="config-item">
<label>阴影贴图大小:</label>
<div class="radio-group">
<label>
<input type="radio" name="shadowSize" value="512" > 512x512
</label>
<label>
<input type="radio" name="shadowSize" value="1024" checked> 1024x1024
</label>
</div>
</div>
<div class="config-item">
<label for="viewDistance">可视距离:</label>
<input type="range" id="viewDistance" min="10" max="200" value="100">
<span id="viewDistanceValue">100</span>m
</div>
<div class="config-item">
<label for="horizontalAngle">水平视角:</label>
<input type="range" id="horizontalAngle" min="30" max="120" value="50">
<span id="horizontalAngleValue">50</span>°
</div>
<div class="config-item">
<label for="verticalAngle">垂直视角:</label>
<input type="range" id="verticalAngle" min="20" max="90" value="50">
<span id="verticalAngleValue">50</span>°
</div>
</div>
</div>
<script>
// 一、初始化Cesium
const view3D = MchCesium.init('cesiumContainer', true);
const viewer = MchCesium.viewer;
// 步骤2、加载飞行路径
const initialPositions = [
{longitude: 116.57698639239828, latitude: 40.44350820706789, height: 350},
{longitude: 116.58320680517834, latitude: 40.44479157439789, height: 520},
{longitude: 116.59045717108023, latitude: 40.44650471866103, height: 717},
{longitude: 116.5937053223204, latitude: 40.46687213916627, height: 356},
{longitude: 116.60861780306922, latitude: 40.46324631398799, height: 396},
{longitude: 116.6140555010281, latitude: 40.46220665726538, height: 478},
{longitude: 116.6212575410881, latitude: 40.45092817732121, height: 299},
{longitude: 116.62335032128567, latitude: 40.44037501874135, height: 257},
{longitude: 116.62394086232717, latitude: 40.433133068203865, height: 193},
{longitude: 116.62457226126685, latitude: 40.4238096714677, height: 269},
{longitude: 116.62071108955061, latitude: 40.42420769481539, height: 467},
{longitude: 116.61699406933735, latitude: 40.42004691573184, height: 390},
{longitude: 116.61146238156039, latitude: 40.41812121010256, height: 269},
{longitude: 116.60758142674928, latitude: 40.418143300483024, height: 278},
{longitude: 116.60563107800976, latitude: 40.418244152176726, height: 248},
{longitude: 116.60330911218746, latitude: 40.41873325173327, height: 314},
{longitude: 116.59964349716748, latitude: 40.4199524058387, height: 377},
{longitude: 116.59519680136547, latitude: 40.41855415772477, height: 250},
{longitude: 116.59433475696123, latitude: 40.424735576304926, height: 326},
{longitude: 116.58861938295638, latitude: 40.424052048802636, height: 227},
{longitude: 116.5869596683047, latitude: 40.4316354100928, height: 411},
{longitude: 116.58136534810056, latitude: 40.43044293009731, height: 255}]
var uavManager = new UAVPathTrajectoryManager(viewer, {
dronecontroller: {
pathPoints: initialPositions,
},
pipeGenerator: {
pathPoints: initialPositions
},
isSmoothedPath: false,
});
// 步骤3:初始化可视域分析控制器
let droneViewershed = null;
function createShed(){
const params = {
horizontalViewAngle: 50, // 水平视角
verticalViewAngle: 50, // 垂直视角
shadowMappingSize: 1024, // 阴影贴图大小
visibleColor: Cesium.Color.GREEN.withAlpha(0.5), // 可视区域颜色
invisibleColor: Cesium.Color.RED.withAlpha(0.5), // 不可视区域颜色
viewDistance: 100,
isShowSketch: true, // 是否显示网格草图
}
droneViewershed = new DroneViewershed(viewer,uavManager.droneController,params);
}
function toggleShowSketch(){
droneViewershed.updateConfig({ isShowSketch: false});
}
function toggleShed(){
droneViewershed.toggleAnalysis();
}
// 添加阴影大小变化事件监听
document.querySelectorAll('input[name="shadowSize"]').forEach(radio => {
radio.addEventListener('change', (e) => {
const shadowSize = parseInt(e.target.value);
droneViewershed.updateConfig({ shadowMappingSize: shadowSize });
console.log(`阴影贴图大小已更新为: ${shadowSize}x${shadowSize}`);
});
});
// 添加参数变化事件监听
document.getElementById('viewDistance').addEventListener('input', (e) => {
const value = parseInt(e.target.value);
document.getElementById('viewDistanceValue').textContent = value;
droneViewershed.updateConfig({ viewDistance: value });
});
document.getElementById('horizontalAngle').addEventListener('input', (e) => {
const value = parseInt(e.target.value);
document.getElementById('horizontalAngleValue').textContent = value;
droneViewershed.updateConfig({ horizontalViewAngle: value });
});
document.getElementById('verticalAngle').addEventListener('input', (e) => {
const value = parseInt(e.target.value);
document.getElementById('verticalAngleValue').textContent = value;
droneViewershed.updateConfig({ verticalViewAngle: value });
});
// 步骤8:窗口关闭时清理资源
window.addEventListener('beforeunload', () => {
if (uavManager) {
uavManager.destroy();
}
});
</script>
</body>
6.效果展示

Demo地址:https://mhc.ixiera.com/mhc/mchmap/Viewershed/index.html
扫一扫