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之双屏联动实现的更多相关文章

  1. ArcGIS API For Javascript :双屏(多屏)地图联动的方法

    在遇到地图对比的应用场景下,我们需要双屏地图或者多屏地图来满足我们的业务需求. 解决思路:首先生成两份(多份)地图,然后通过监听地图缩放拖拽,用地图四至将不同的地图对象做绑定,实现多地图联动. 前端部 ...

  2. cesium核心类Viewer简介

    1.简单描述Viewer Viewer类是cesium的核心类,是地图可视化展示的主窗口,cesium程序应用的切入口,扮演必不可少的核心角色. 官网的英文解析如下: A base widget fo ...

  3. Cesium几个案例介绍

    前言 本文为大家介绍几个Cesium的Demo,通过这几个Demo能够对如何使用Cesium有进一步的了解,并能充分理解Cesium的强大之处和新功能.其他的无需多言,如果还不太了解什么是Cesium ...

  4. cesium 之核心类 Viewer 简介篇

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 简 ...

  5. cesium 入门开发系列矢量瓦片加载展示(附源码下载)

    前言 cesium 入门开发系列环境知识点了解:cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 源代 ...

  6. cesium相关学习网址

    cesium相关学习网址: cesium资料大全网址:https://www.cnblogs.com/cesium1/p/10062942.html       http://192.168.101. ...

  7. Cesium中文网——如何开发一款地图下载工具[一]

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium中文网的朋友们的其中一个主题是:自己独立开发一款地图 ...

  8. java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis

    A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技术:313596790freemaker模版技术 ,0个代码不用写 ...

  9. cesium自定义气泡窗口infoWindow

    一.自定义气泡窗口与cesium默认窗口效果对比: 1.cesium点击弹出气泡窗口显示的位置固定在地图的右上角,默认效果: 2.对于习惯arcgis或者openlayer气泡窗口样式的giser来说 ...

  10. Cesium简介以及离线部署运行

    Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...

随机推荐

  1. angularjs国际化多语言,angular-translate教程详解,$translate.instant()为什么不生效

    壹 ❀ 引 最近项目要求支持国际化多语言,由于项目用的还是angularjs,那么首当其冲的选择了angularjs封装的I18N插件angular-translate,本文主要会从三个方向展开讨论, ...

  2. NC51180 Accumulation Degree

    题目链接 题目 题目描述 Trees are an important component of the natural landscape because of their prevention o ...

  3. OCR 02: Tesseract-OCR

    Catalog OCR 01: EasyOCR OCR 02: Tesseract-OCR OCR 03: PaddleOCR Project Host And Brief Official Site ...

  4. C++检测句柄的权限

    主要是依靠NtQueryObject函数,其中需要传入ObjectBasicInformation参数 PUBLIC_OBJECT_BASIC_INFORMATION结构包含可用于对象的全部信息的子集 ...

  5. 【Android 逆向】【攻防世界】easyjava

    1. apk 安装到手机,提示输入flag 2. jadx 打开apk看看 private static char a(String str, b bVar, a aVar) { return aVa ...

  6. 学习go语言编程之函数

    函数定义 函数的基本组成:关键字func,函数名,参数列表,返回值,函数体,返回语句. 示例如下: func Add(a int, b int) (ret int, err error) { if a ...

  7. ThreadLocal的应用场景和注意事项有哪些?

    https://cloud.tencent.com/developer/article/1618405

  8. go最新版本1.15安装配置及编辑器2020.2版本goland

    下载 https://golang.google.cn/dl/ 配置 go env #查看是否安装成功 # 终端输入修改镜像地址 $ go env -w GO111MODULE=on $ go env ...

  9. 面试官:说一下红锁RedLock的实现原理?

    RedLock 是一种分布式锁的实现算法,由 Redis 的作者 Salvatore Sanfilippo(也称为 Antirez)提出,主要用于解决在分布式系统中实现可靠锁的问题.在 Redis 单 ...

  10. 【开发工具】Linux 服务器 Shell 脚本简单应用(MySql备份等脚本)

    上一章介绍完基础[开发工具]Linux 服务器 Shell 脚本简单入门,这一章结合实际运用 对于 do while if else等流程控制基础不再说明,和编程语言大同小异,可以在实际的脚本使用中学 ...