Cesium之双屏联动实现
1. 概述
双屏联动是常见的一种地图开发需求,主要用于同时查看两个地图,进行对比查看,还有一种类似的需求叫“卷帘门”(map split)
双屏联动效果如下:

卷帘门的效果如下:

其中,卷帘门在Cesium官网中有实现示例:[Imagery Layers Split - Cesium Sandcastle](https://sandcastle.cesium.com/?src=Imagery Layers Split.html&label=All)
这篇文章主要记录的是双屏联动
2. 双屏联动实现
2.1 方式一:同步相机参数
这个思路是:将变化的一侧地图的camera参数实时同步到不变化的一侧,使之跟随变化,实现双屏联动
以下是一个实现的基础代码
const syncView = () => {
// 获取另一个viewer的相机视角数据
const {
positionWC,
heading,
pitch,
roll,
up,
_direction
} = viewer2.scene.camera;
// 设置视角
viewer1.camera.setView({
destination: positionWC,
orientation: {
heading: heading,
pitch: pitch,
roll: roll,
up: up,
direction: _direction
}
});
};
//camera监听函数
viewer2.scene.postRender.addEventListener(syncView);
上面的基础代码并不完善,但是思路清晰,就是将变化的一侧地图的camera参数实时同步到不变化的一侧。注意,这里是每一帧之前同步相机参数,这样是比较平滑的,虽然性能消耗可能会大一些,有部分文章博客写的是相机变化时才同步参数,代码类似viewer2.camera.changed.addEventListener(syncView),这种方式并不推荐,画面渲染时卡顿的,并不平滑
下面是完整的实现代码,供参考:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<!-- Include the CesiumJS JavaScript and CSS files -->
<script src="https://cesium.com/downloads/cesiumjs/releases/1.114/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.114/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
<style>
#cesiumContainer {
width: 50vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
}
#rightContainer {
width: 50vw;
height: 100vh;
position: absolute;
top: 0;
right: 0;
}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<div id="rightContainer"></div>
<script type="module">
// Your access token can be found at: https://ion.cesium.com/tokens.
// Replace `your_access_token` with your Cesium ion access token.
// Cesium.Ion.defaultAccessToken = 'your_access_token';
// Initialize the Cesium Viewer in the HTML element with the `cesiumContainer` ID.
const viewer = new Cesium.Viewer('cesiumContainer');
const rightViewer = new Cesium.Viewer('rightContainer');
// viewer.scene.camera = rightViewer.scene.camera;
const syncView = (viewer1, viewer2) => {
return function() {
// 获取另一个viewer的相机视角数据
const {
positionWC,
heading,
pitch,
roll,
up,
_direction
} = viewer1.scene.camera;
// 设置视角
viewer2.camera.setView({
destination: positionWC,
orientation: {
heading: heading,
pitch: pitch,
roll: roll,
up: up,
direction: _direction
}
});
}
};
//camera监听函数
viewer.scene.postRender.addEventListener(syncView(viewer, rightViewer));
rightViewer.scene.postRender.addEventListener(syncView(rightViewer, viewer));
</script>
</div>
</body>
</html>
这看起来复杂了点,实现下过如下图,下面这个实现方式就更简单

2.2 方式二:共享Camera
这个思路就是:两个地图使用同一个相机,所以不管是哪一个地图变化,相机都会自然而然地变化
基础代码就是:
viewer1.scene.camera = viewer2.scene.camera;
下面是完整的实现代码,供参考:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<!-- Include the CesiumJS JavaScript and CSS files -->
<script src="https://cesium.com/downloads/cesiumjs/releases/1.114/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.114/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
<style>
#cesiumContainer {
width: 50vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
}
#rightContainer {
width: 50vw;
height: 100vh;
position: absolute;
top: 0;
right: 0;
}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<div id="rightContainer"></div>
<script type="module">
// Your access token can be found at: https://ion.cesium.com/tokens.
// Replace `your_access_token` with your Cesium ion access token.
// Cesium.Ion.defaultAccessToken = 'your_access_token';
// Initialize the Cesium Viewer in the HTML element with the `cesiumContainer` ID.
const viewer = new Cesium.Viewer('cesiumContainer');
const rightViewer = new Cesium.Viewer('rightContainer');
viewer.scene.camera = rightViewer.scene.camera;
</script>
</div>
</body>
</html>

3. 参考资料
[1] Scene - Cesium Documentation
[2] Imagery Layers Split - Cesium Sandcastle
Cesium之双屏联动实现的更多相关文章
- ArcGIS API For Javascript :双屏(多屏)地图联动的方法
在遇到地图对比的应用场景下,我们需要双屏地图或者多屏地图来满足我们的业务需求. 解决思路:首先生成两份(多份)地图,然后通过监听地图缩放拖拽,用地图四至将不同的地图对象做绑定,实现多地图联动. 前端部 ...
- cesium核心类Viewer简介
1.简单描述Viewer Viewer类是cesium的核心类,是地图可视化展示的主窗口,cesium程序应用的切入口,扮演必不可少的核心角色. 官网的英文解析如下: A base widget fo ...
- Cesium几个案例介绍
前言 本文为大家介绍几个Cesium的Demo,通过这几个Demo能够对如何使用Cesium有进一步的了解,并能充分理解Cesium的强大之处和新功能.其他的无需多言,如果还不太了解什么是Cesium ...
- cesium 之核心类 Viewer 简介篇
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 简 ...
- cesium 入门开发系列矢量瓦片加载展示(附源码下载)
前言 cesium 入门开发系列环境知识点了解:cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 源代 ...
- cesium相关学习网址
cesium相关学习网址: cesium资料大全网址:https://www.cnblogs.com/cesium1/p/10062942.html http://192.168.101. ...
- Cesium中文网——如何开发一款地图下载工具[一]
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium中文网的朋友们的其中一个主题是:自己独立开发一款地图 ...
- java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单; 技术:313596790freemaker模版技术 ,0个代码不用写 ...
- cesium自定义气泡窗口infoWindow
一.自定义气泡窗口与cesium默认窗口效果对比: 1.cesium点击弹出气泡窗口显示的位置固定在地图的右上角,默认效果: 2.对于习惯arcgis或者openlayer气泡窗口样式的giser来说 ...
- Cesium简介以及离线部署运行
Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...
随机推荐
- angularjs国际化多语言,angular-translate教程详解,$translate.instant()为什么不生效
壹 ❀ 引 最近项目要求支持国际化多语言,由于项目用的还是angularjs,那么首当其冲的选择了angularjs封装的I18N插件angular-translate,本文主要会从三个方向展开讨论, ...
- NC51180 Accumulation Degree
题目链接 题目 题目描述 Trees are an important component of the natural landscape because of their prevention o ...
- OCR 02: Tesseract-OCR
Catalog OCR 01: EasyOCR OCR 02: Tesseract-OCR OCR 03: PaddleOCR Project Host And Brief Official Site ...
- C++检测句柄的权限
主要是依靠NtQueryObject函数,其中需要传入ObjectBasicInformation参数 PUBLIC_OBJECT_BASIC_INFORMATION结构包含可用于对象的全部信息的子集 ...
- 【Android 逆向】【攻防世界】easyjava
1. apk 安装到手机,提示输入flag 2. jadx 打开apk看看 private static char a(String str, b bVar, a aVar) { return aVa ...
- 学习go语言编程之函数
函数定义 函数的基本组成:关键字func,函数名,参数列表,返回值,函数体,返回语句. 示例如下: func Add(a int, b int) (ret int, err error) { if a ...
- ThreadLocal的应用场景和注意事项有哪些?
https://cloud.tencent.com/developer/article/1618405
- go最新版本1.15安装配置及编辑器2020.2版本goland
下载 https://golang.google.cn/dl/ 配置 go env #查看是否安装成功 # 终端输入修改镜像地址 $ go env -w GO111MODULE=on $ go env ...
- 面试官:说一下红锁RedLock的实现原理?
RedLock 是一种分布式锁的实现算法,由 Redis 的作者 Salvatore Sanfilippo(也称为 Antirez)提出,主要用于解决在分布式系统中实现可靠锁的问题.在 Redis 单 ...
- 【开发工具】Linux 服务器 Shell 脚本简单应用(MySql备份等脚本)
上一章介绍完基础[开发工具]Linux 服务器 Shell 脚本简单入门,这一章结合实际运用 对于 do while if else等流程控制基础不再说明,和编程语言大同小异,可以在实际的脚本使用中学 ...