341 lines
13 KiB
HTML
341 lines
13 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
|
||
<head>
|
||
<!-- Use correct character set. -->
|
||
<meta charset="utf-8">
|
||
<!-- Tell IE to use the latest, best version. -->
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||
<!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
|
||
<title>Learning Cesium!</title>
|
||
<script src="./Build/Cesium/Cesium.js"></script>
|
||
|
||
<!-- 引入样式 -->
|
||
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
|
||
<!-- 引入组件库 -->
|
||
<script src="https://unpkg.com/vue/dist/vue.js"></script>
|
||
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
|
||
<style>
|
||
@import url(./Build/Cesium/Widgets/widgets.css);
|
||
|
||
html,
|
||
body,
|
||
#cesiumContainer {
|
||
width: 100%;
|
||
height: 100%;
|
||
margin: 0;
|
||
padding: 0;
|
||
overflow: hidden;
|
||
}
|
||
|
||
#credit {
|
||
display: none;
|
||
}
|
||
|
||
#btnContainer {
|
||
position: absolute;
|
||
top: 50px;
|
||
left: 150px;
|
||
z-index: 99999999;
|
||
}
|
||
</style>
|
||
</head>
|
||
|
||
<body>
|
||
<div id="cesiumContainer"></div>
|
||
<div id="credit"></div>
|
||
<div id="btnContainer">
|
||
<el-row>
|
||
<el-button @click="setView">setView</el-button>
|
||
<el-button @click="flyTo">flyTo</el-button>
|
||
<el-button @click="flyToPosition">flyToPosition</el-button>
|
||
<el-button @click="flyToRectangle">flyToRectangle</el-button>
|
||
<el-button @click="flyToEasing">flyToEasing</el-button>
|
||
<el-button @click="lookAt">lookAt</el-button>
|
||
<el-button @click="lookAtTransform">lookAtTransform</el-button>
|
||
</el-row>
|
||
</div>
|
||
<script>
|
||
/**
|
||
三维的GIS中移动视域范围不仅要确定视点的位置,还要确定视线的方向
|
||
Cesium通过相机控制场景中的视域(旋转、缩放、平移)
|
||
主要用两个参数设置相机的状态:
|
||
1.position位置:使用一个三维的笛卡尔空间坐标点(x,y,z)
|
||
2.orientation方向:(heading水平方向、pitch俯仰角、roll翻滚角)欧拉角
|
||
|
||
操作相机的常用方法有:
|
||
1.setView:通过定义相机的位置和实现方向来控制,没有过渡动画,适合快速切换视角。
|
||
2.viewBoundingSphere:也没有过渡动画,区别在于该方法必须设定模型的外接圆,适合室内浏览,因为室内空间较小,相机移动的幅度不易控制
|
||
视点位于外接球的球心,可以设置偏移。
|
||
3.flyTo:具有空中飞行的过渡动画效果,可以设置飞行时间。如果场景secne中添加了矢量数据(模型或几何对象),可以使用该方法进行聚焦,如Entity, EntityCollection, DataSource, Cesium3DTilset, and much more.
|
||
4.lookAt:将视角固定在所设置的目的点上,用户可以通过鼠标任意旋转视角方向,但不会改变其位置,同时缩放会失效,中轮滚动事件也会失效。
|
||
5.lookAtTransform:将相机锁定在某个点上
|
||
*/
|
||
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8';
|
||
new Vue({
|
||
el: '#btnContainer',
|
||
data: function () {
|
||
return {
|
||
viewer: null,
|
||
directions:{
|
||
forward:false,
|
||
backward:false,
|
||
up:false,
|
||
down:false,
|
||
left:false,
|
||
right:false,
|
||
twistLeft:false,
|
||
twistRight:false
|
||
}
|
||
}
|
||
},
|
||
mounted:function(){
|
||
this.initCesium();
|
||
this.initEvent();
|
||
},
|
||
methods:{
|
||
initCesium:function(){
|
||
/**
|
||
* Viewer对象
|
||
* 用于构建应用程序的基本小部件。它将所有标准的Cesium部件组合到一个可重用的包中。
|
||
* 小部件可以通过使用mixin来扩展,来添加对各种应用程序有用的功能
|
||
*/
|
||
//Initialize the viewer widget with several custom options and mixins.
|
||
this.viewer = new Cesium.Viewer('cesiumContainer', {
|
||
/**
|
||
* 场景模式,默认SceneMode.SCENE3D
|
||
* SceneMode:指定场景是3D/2D/2.5D,可选值:
|
||
* MORPHING:在模式之间变形,如3D转2D
|
||
* COLUMBUS_VIEW:2.5D视角,地图会被平铺,高度为非零的对象被绘制在上面。
|
||
* SCENE2D:2D模式,地图会被自顶向下正射投影
|
||
* SCENE3D:3D模式,一个传统的三维视角的全球。
|
||
*/
|
||
// sceneMode : Cesium.SceneMode.COLUMBUS_VIEW,
|
||
sceneMode: Cesium.SceneMode.SCENE3D,
|
||
//指定椭球面提供地形或其他几何图形数据,
|
||
terrainProvider: Cesium.createWorldTerrain(),
|
||
//指定影像数据的数据源,该选项只有在baseLayerPicker设置为false时生效
|
||
imageryProvider : new Cesium.OpenStreetMapImageryProvider({
|
||
url : 'https://a.tile.openstreetmap.org/'
|
||
}),
|
||
// imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
|
||
// url: 'http://t0.tianditu.gov.cn/img_w/wmts?tk=ebf64362215c081f8317203220f133eb',
|
||
// layer: 'img',
|
||
// style: 'default',
|
||
// tileMatrixSetID: 'w',
|
||
// format: 'tiles',
|
||
// maximumLevel: 18
|
||
// }),
|
||
//设置背景,如果为false则星星/月亮/太阳都不会渲染
|
||
// skyBox : new Cesium.SkyBox({
|
||
// sources : {
|
||
// positiveX : 'stars/100_BK.jpg',
|
||
// negativeX : 'stars/100_BK.jpg',
|
||
// positiveY : 'stars/100_BK.jpg',
|
||
// negativeY : 'stars/100_BK.jpg',
|
||
// positiveZ : 'stars/100_BK.jpg',
|
||
// negativeZ : 'stars/100_BK.jpg'
|
||
// }
|
||
// }),
|
||
// Show Columbus View map with Web Mercator projection
|
||
mapProjection: new Cesium.WebMercatorProjection(),
|
||
|
||
geocoder: false,//位置查找
|
||
homeButton: false,//视图返回初始位置
|
||
sceneModePicker: false,//视角选择器
|
||
baseLayerPicker: false,//底图选择器
|
||
navigationHelpButton: false,//导航帮助按钮
|
||
animation: false,//动画控制器
|
||
creditContainer: "credit",//版权显示,指定dom对象的id,再通过id样式可以隐藏CESIUM 版本图标
|
||
timeline: false,//时间线
|
||
fullscreenButton: false,//全屏控件
|
||
vrButton: false,
|
||
infoBox:false,
|
||
shouldAnimate:true,
|
||
|
||
scene3DOnly: true,//默认false,若为true,所有几何体实例将仅会在3D模式中渲染(在GPU内存中)
|
||
|
||
});
|
||
|
||
//Add basic drag and drop functionality
|
||
this.viewer.extend(Cesium.viewerDragDropMixin);
|
||
|
||
//Show a pop-up alert if we encounter an error when processing a dropped file
|
||
this.viewer.dropError.addEventListener(function (dropHandler, name, error) {
|
||
console.log(error);
|
||
window.alert(error);
|
||
});
|
||
},
|
||
setView:function(){
|
||
var position = Cesium.Cartesian3.fromDegrees(113.331875,23.110038,10000000);
|
||
this.viewer.camera.setView({
|
||
destination: position,
|
||
orientation: {
|
||
heading: Cesium.Math.toRadians(0.0),//使用弧度的形式
|
||
pitch: Cesium.Math.toRadians(-70.0),
|
||
roll: 0.0
|
||
}
|
||
})
|
||
},
|
||
flyTo:function(){
|
||
var position = Cesium.Cartesian3.fromDegrees(-113.331875,19.110038,10000000);
|
||
this.viewer.camera.flyTo({
|
||
destination: position,
|
||
orientation: {//使用欧拉角
|
||
heading: Cesium.Math.toRadians(0.0),//使用弧度的形式
|
||
pitch: Cesium.Math.toRadians(-60.0),
|
||
roll: 0.0
|
||
},
|
||
duration:3,//设置飞行时间,单位为秒
|
||
complete:function(){
|
||
console.log("动画完成后的回调!")
|
||
},
|
||
cancel:function(){
|
||
console.log("动画被取消后的回调!")
|
||
},
|
||
maximumHeight:5000,//最大的飞行高度
|
||
})
|
||
},
|
||
flyToPosition :function(){
|
||
this.viewer.camera.flyTo({
|
||
destination : Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0)
|
||
});
|
||
},
|
||
flyToRectangle:function(){
|
||
var west = -90.0;
|
||
var south = 38.0;
|
||
var east = -87.0;
|
||
var north = 40.0;
|
||
var rectangle = this.viewer.entities.add({
|
||
rectangle: {
|
||
coordinates: Cesium.Rectangle.fromDegrees(west, south, east, north),
|
||
},
|
||
});
|
||
this.viewer.flyTo(rectangle);
|
||
// this.viewer.camera.flyTo({
|
||
// destination :Cesium.Rectangle.fromDegrees(west, south, east, north)
|
||
// });
|
||
},
|
||
flyToEasing:function(){
|
||
var that = this;
|
||
that.viewer.camera.flyTo({
|
||
destination : new Cesium.Cartesian3(-3961951.575572026, 3346492.0945766014, 3702340.5336036095),
|
||
orientation : {
|
||
direction : new Cesium.Cartesian3(0.8982074415844437, -0.4393530288745287, 0.013867512433959908),
|
||
up : new Cesium.Cartesian3(0.12793638617798253, 0.29147314437764565, 0.9479850669701113),
|
||
},
|
||
complete: function () {
|
||
// setTimeout(function () {
|
||
// that.viewer.camera.flyTo({
|
||
// destination : new Cesium.Cartesian3(-2304817.2435183465, -3639113.128132953, 4688495.013644141),
|
||
// orientation : {
|
||
// direction : new Cesium.Cartesian3(0.3760550186878076, 0.9007147395506565, 0.21747547189489164),
|
||
// up : new Cesium.Cartesian3(-0.20364591529594356, -0.14862471084230877, 0.9676978022659334),
|
||
// },
|
||
// easingFunction: Cesium.EasingFunction.QUADRATIC_IN_OUT,
|
||
// duration: 5
|
||
// });
|
||
// }, 1000);
|
||
},
|
||
});
|
||
},
|
||
lookAt:function(){
|
||
var center = Cesium.Cartesian3.fromDegrees(113.331875,19.110038,5000000);
|
||
var heading = Cesium.Math.toRadians(0);
|
||
var pitch = Cesium.Math.toRadians(-90.0);
|
||
var range = 50;
|
||
|
||
this.viewer.camera.lookAt(center,new Cesium.HeadingPitchRange(heading,pitch,range));
|
||
},
|
||
lookAtTransform:function(){
|
||
// 1. Using a cartesian offset
|
||
// var center = Cesium.Cartesian3.fromRadians(2.4213211833389243, 0.6171926869414084, 3626.0426275055174);
|
||
|
||
// var transform = Cesium.Transforms.eastNorthUpToFixedFrame(center);
|
||
// this.viewer.camera.lookAtTransform(transform, new Cesium.Cartesian3(0.0, -4790000.0, 3930000.0));
|
||
|
||
// 2. Using a HeadingPitchRange offset
|
||
var center = Cesium.Cartesian3.fromRadians(2.4213211833389243, 0.6171926869414084, 3626.0426275055174);
|
||
var transform = Cesium.Transforms.eastNorthUpToFixedFrame(center);
|
||
this.viewer.scene.camera.lookAtTransform(transform, new Cesium.HeadingPitchRange(0, -Math.PI/4, 2900));
|
||
},
|
||
initEvent:function(){
|
||
var that = this;
|
||
/**
|
||
* 绑定键盘事件,实现使用键盘操作相机的视域移动
|
||
*/
|
||
document.addEventListener("keydown",function(e){
|
||
var direction = that.getDirectionForKeyCode(e.keyCode);
|
||
if(typeof direction !== 'undefined'){
|
||
that.directions[direction] = true;
|
||
}
|
||
})
|
||
document.addEventListener("keyup",function(e){
|
||
var direction = that.getDirectionForKeyCode(e.keyCode);
|
||
if(typeof direction !== 'undefined'){
|
||
that.directions[direction] = false;
|
||
}
|
||
})
|
||
|
||
this.viewer.clock.onTick.addEventListener(function(clock){
|
||
var camera = that.viewer.camera;
|
||
var ellipsoid = that.viewer.scene.globe.ellipsoid;
|
||
var cameraHeight = ellipsoid.cartesianToCartographic(camera.position).height;
|
||
var moveRate = cameraHeight/100.0;
|
||
that.directions.forward&&camera.moveForward(moveRate);
|
||
that.directions.backward&&camera.moveBackward(moveRate);
|
||
that.directions.up&&camera.moveUp(moveRate);
|
||
that.directions.down&&camera.moveDown(moveRate);
|
||
that.directions.left&&camera.moveLeft(moveRate);
|
||
that.directions.right&&camera.moveRight(moveRate);
|
||
that.directions.twistLeft&&camera.twistLeft(moveRate);
|
||
that.directions.twistRight&&camera.twistRight(moveRate);
|
||
|
||
})
|
||
},
|
||
getDirectionForKeyCode:function(keyCode){
|
||
switch(keyCode){
|
||
case "W".charCodeAt(0):
|
||
return "forward";
|
||
case "S".charCodeAt(0):
|
||
return "backward";
|
||
case "A".charCodeAt(0):
|
||
return "left";
|
||
case "D".charCodeAt(0):
|
||
return "right";
|
||
case "Q".charCodeAt(0):
|
||
return "up";
|
||
case "E".charCodeAt(0):
|
||
return "down";
|
||
case "F".charCodeAt(0):
|
||
return "twistLeft";
|
||
case "G".charCodeAt(0):
|
||
return "twistRight";
|
||
}
|
||
}
|
||
}
|
||
})
|
||
|
||
|
||
|
||
|
||
|
||
|
||
//Secne场景中执行调用图层、3D Tiles数据加载、场景交互等功能,以及一些场景数据加载(Primitivew API)
|
||
//Secne中的camera属性与Scene中的camera属性相同。
|
||
// var scene = viewer.scene;
|
||
// //加载3D tiles格式的三维模型
|
||
// var tileset = new Cesium.Cesium3DTileset({
|
||
// url:"./SampleData/Cesium3DTiles/Tilesets/Tileset/tileset.json"
|
||
// });
|
||
// tileset.readyPromise.then(function(tileset){
|
||
// viewer.scene.primitives.add(tileset);
|
||
// viewer.camera.viewBoundingSphere(tileset.boundingSphere,new Cesium.HeadingPitchRange(-1.57,0,2))
|
||
// })
|
||
|
||
|
||
</script>
|
||
</body>
|
||
|
||
</html> |