前言
在 WebGis 开发中,摄像机的行为控制是至关重要的一部分。通过调整摄像机的旋转、缩放、倾斜等操作,用户可以获得更自然和灵活的交互体验。在本篇文章中,我们将展示如何通过 DT-SDK 与 dat.GUI
相结合,控制地图的摄像机操作,赋予用户更大的操控自由度。
组件库地址:www.shuqin.cc/component/s…
演示地址:www.shuqin.cc/preview/sta…
核心功能概述
本文将实现以下功能:
- 添加高德地图作为基础图层
- 使用
dat.GUI
控制摄像机的各种操作行为,如旋转、平移、倾斜、缩放 - 启用/禁用摄像机输入、碰撞检测,并设定最小/最大缩放距离
- 切换鼠标模式(左键+中键 或 左键+右键)
核心代码实现
1. 初始化 Viewer 和高德地图图层
首先,我们通过 DT-SDK 初始化 Viewer,并添加高德地图作为基础图层:
let viewer = undefined;
function initViewer() {
viewer = new DT.Viewer('viewer-container');
// 创建高德地图图层
let baseLayer = DT.ImageryLayerFactory.createImageryLayer(DT.ImageryType.AMAP, {
style: 'img',
crs: 'WGS84'
});
// 将图层添加到 Viewer 中
viewer.addBaseLayer(baseLayer);
addGuiController(); // 添加 GUI 控制面板
}
DT.ready(initViewer);
2. 添加 GUI 控制面板
我们通过 dat.GUI
提供的控制面板,让用户可以动态调整摄像机的行为。以下是实现控制的代码:
function addGuiController() {
let controls = {
mouseMode: DT.MouseMode.LEFT_MIDDLE,
enableInputs: true,
enableRotate: true,
enableTilt: true,
enableTranslate: true,
enableZoom: true,
enableCollisionDetection: true,
minimumZoomDistance: 1.0,
maximumZoomDistance: 40489014.0,
};
let gui = new dat.GUI();
// 切换鼠标操作模式
gui.add(controls, 'mouseMode', { 'left+middle': DT.MouseMode.LEFT_MIDDLE, 'left+right': DT.MouseMode.LEFT_RIGHT }).onChange(value => {
viewer.changeMouseMode(Number(value));
});
// 启用/禁用摄像机输入
gui.add(controls, 'enableInputs').onChange(value => {
viewer.setOptions({
cameraController: {
enableInputs: value
}
});
});
// 控制摄像机旋转
gui.add(controls, 'enableRotate').onChange(value => {
viewer.setOptions({
cameraController: {
enableRotate: value
}
});
});
// 控制摄像机倾斜
gui.add(controls, 'enableTilt').onChange(value => {
viewer.setOptions({
cameraController: {
enableTilt: value
}
});
});
// 控制摄像机平移
gui.add(controls, 'enableTranslate').onChange(value => {
viewer.setOptions({
cameraController: {
enableTranslate: value
}
});
});
// 控制摄像机缩放
gui.add(controls, 'enableZoom').onChange(value => {
viewer.setOptions({
cameraController: {
enableZoom: value
}
});
});
// 启用/禁用碰撞检测
gui.add(controls, 'enableCollisionDetection').onChange(value => {
viewer.setOptions({
cameraController: {
enableCollisionDetection: value
}
});
});
// 设置最小缩放距离
gui.add(controls, 'minimumZoomDistance', 1.0, 40489014.0, 1000).onChange(value => {
viewer.setOptions({
cameraController: {
minimumZoomDistance: value
}
});
});
// 设置最大缩放距离
gui.add(controls, 'maximumZoomDistance', 1.0, 40489014.0, 1000).onChange(value => {
viewer.setOptions({
cameraController: {
maximumZoomDistance: value
}
});
});
}
HTML 结构
为了确保地图与控制面板的正常显示,需要有一个容器来渲染 Viewer:
<div id="viewer-container" style="width: 100%; height: 100vh;"></div>
效果展示
- 页面加载后,用户可以通过
dat.GUI
控制面板自由调整摄像机行为。 - 可以启用或禁用缩放、旋转、倾斜和平移功能,或者通过设置最小/最大缩放距离来控制视图的限制范围。
- 通过切换鼠标模式,可以选择左键+中键或左键+右键组合来控制地图交互。
总结
本篇文章展示了如何使用 DT-SDK 初始化地图场景,并通过 dat.GUI
动态调整摄像机行为。摄像机操作的灵活性为用户提供了更强的交互体验,同时也让开发者能够更好地管理地图的可视范围与交互方式。下一篇文章将进一步介绍如何结合数据展示进行互动,敬请期待。