- 基础知识
- 入门教程
- 中级教程
- 官方教程
- 博客文章
- Cesium 应用篇-添加雨雪天气
- Cesium 源码剖析-Post Processing 之物体描边 Silhouette
- Cesium 源码剖析-Ambient Occlusion 环境光遮蔽
- Cesium 源码剖析-Clipping Plane
- Cesium 源码剖析-视频投影
- Cesium 之加载地形图 Terrain 篇
- Cesium 之三维漫游飞行效果实现篇
- Cesium 之地图贴地量算工具效果篇
- Cesium 之简介以及离线部署运行篇
- Cesium 之核心类 Viewer 简介篇
- Cesium 之自定义气泡窗口 infoWindow 篇
- Cesium 之自定义气泡窗口 infoWindow 后续优化篇
- Cesium 之图层管理器篇
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Cesium 鹰眼图
鹰眼图在Gis中是个比较基本的功能,在鹰眼图上可以看到整个地图的全貌以及主视图在全貌中的位置,这里我试着实现一下鹰眼图和主视图的同步
首先在地图右下角放一个div,给蓝色的边界,方便区分
<div id="eye"></div>
#eye {
position: absolute;
width: 20%;
height: 20%;
bottom: 0;
right: 0;
z-index: 999;
background: red;
border: solid blue 1px;
}
第一种,贴图片(失败)
我最先想到的是一种讨巧的方法,就是将主窗口截个图,放到鹰眼图的框里
let showEye = function() {
document.getElementById('show').src = viewer.scene.canvas.toDataURL("image/png");
viewer.scene.postRender.removeEventListener(showEye);//避免死循环
};
viewer.camera.changed.addEventListener(function() {
viewer.scene.postRender.addEventListener(showEye);
});
window.onload = function() {
viewer.scene.postRender.addEventListener(showEye);
}
这种方法有些问题
- 在远处拖动的话,还没感觉到不对,但是图放大之后,鹰眼图里就不是全图了
- 拖动的过程中,感觉细微的变动没有触发showEye函数,导致鹰眼图中变化,比较。。。卡顿
第二种,双球联动(失败)
这个其实是比较常规的gis实现手段,
– 在鹰眼图div里面,也创建一个三维球,
– 控制它不能放大缩小,
– 主视图发生视角变化时,鹰眼图跟着变化
主要代码入下:
//1.创建双球
var viewer = new Cesium.Viewer('cesiumContainer', {});
var viewer1 = new Cesium.Viewer('eye', {});
//2.设置鹰眼图中球属性
let control = viewer1.scene.screenSpaceCameraController;
control.enableRotate = false;
control.enableTranslate = false;
control.enableZoom = false;
control.enableTilt = false;
control.enableLook = false;
let syncViewer = function() {
viewer1.camera.flyTo({
destination: viewer.camera.position,
orientation: {
heading: viewer.camera.heading,
pitch: viewer.camera.pitch,
roll: viewer.camera.roll
},
duration: 0.0
});
};
//3.同步
viewer.camera.changed.addEventListener(syncViewer);//卡顿,失败
viewer.scene.preRender.addEventListener(syncViewer);//谢谢木遥告知,如果添加这个事件监听,效果和第三种方式一样,成功
这种方法也有跟第一种方法一样的卡顿问题
第三种,双球联动加强版(成功)
前两步和第二种一样,只是第三步,使用回调来做,这个方法是看到Callback Property 示例想到的,因为文字变化比较平滑,所以尝试一下,没想到效果还可以,如果你有更好的办法,欢迎留言
//1. 同第二种方法
//2. 同第二种方法
//3. 同步
viewer.entities.add({
position : Cesium.Cartesian3.fromDegrees(0, 0),
label : {
text : new Cesium.CallbackProperty(function(){
syncViewer();
return "";
}, true)
}
});
eg.感觉回调和截图配合起来,应该会有一些别的方面的应用吧,只是现在还没想到
就到这里啦,相关代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论