376 lines
12 KiB
HTML
376 lines
12 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>全景漫游</title>
|
||
<link
|
||
href="https://cdn.jsdelivr.net/npm/cesium@1.85.0/Build/Cesium/Widgets/widgets.css"
|
||
rel="stylesheet"
|
||
/>
|
||
<!-- <script src="https://cdn.jsdelivr.net/npm/cesium@1.85.0/Build/Cesium/Cesium.js"></script> -->
|
||
<script src="./Build168/Cesium/Cesium.js"></script>
|
||
<!-- 添加天地图的cesium的扩展插件,目前支持cesuim1.52、1.58、1.63.1。 -->
|
||
<script src="http://api.tianditu.gov.cn/cdn/plugins/cesium/cesiumTdt.js"></script>
|
||
<style>
|
||
html,
|
||
body,
|
||
#cesiumContainer {
|
||
width: 100%;
|
||
height: 100%;
|
||
margin: 0;
|
||
padding: 0;
|
||
overflow: hidden;
|
||
}
|
||
#infobox {
|
||
position: absolute;
|
||
top: 20px;
|
||
left: 30px;
|
||
font-size: 14px;
|
||
z-index: 99;
|
||
padding: 10px 20px;
|
||
background-color: white;
|
||
border: 1px solid #cccccc;
|
||
}
|
||
.toolbox {
|
||
position: absolute;
|
||
top: 49%;
|
||
left: 30px;
|
||
z-index: 99;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: space-around;
|
||
}
|
||
.tool-item {
|
||
background-color: #303336;
|
||
cursor: pointer;
|
||
}
|
||
.playbox {
|
||
position: absolute;
|
||
top: 30px;
|
||
left: 49%;
|
||
z-index: 99;
|
||
display: flex;
|
||
justify-content: space-around;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="toolbox">
|
||
<button id="zoomIn" class="tool-item">
|
||
<img class="tool-image" src="../SampleData/zoomIn.png" alt="" />
|
||
</button>
|
||
<button id="zoomOut" class="tool-item">
|
||
<img class="tool-image" src="../SampleData/zoomOut.png" alt="" />
|
||
</button>
|
||
</div>
|
||
<div id="infobox"></div>
|
||
<div class="playbox">
|
||
<button id="start">播放</button>
|
||
<button id="quit">停止</button>
|
||
</div>
|
||
<div id="cesiumContainer"></div>
|
||
</body>
|
||
<script>
|
||
Cesium.Ion.defaultAccessToken =
|
||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
|
||
|
||
var token = "bf156eb3c72350d62b008dc8a4ae1016";
|
||
// 服务域名
|
||
var tdtUrl = "https://t{s}.tianditu.gov.cn/";
|
||
// 服务负载子域,天地图地图服务二级域名包括t0-t7,可以随机选择使用,如http://t2.tianditu.gov.cn/vec_c/wmts?tk=您的密钥
|
||
var subdomains = ["0", "1", "2", "3", "4", "5", "6", "7"];
|
||
|
||
var viewer = new Cesium.Viewer("cesiumContainer", {
|
||
shouldAnimate: true,
|
||
timeline: true,
|
||
animation: false,
|
||
});
|
||
|
||
// 叠加影像服务
|
||
var imgMap = new Cesium.UrlTemplateImageryProvider({
|
||
url: tdtUrl + "DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + token,
|
||
subdomains: subdomains,
|
||
tilingScheme: new Cesium.WebMercatorTilingScheme(),
|
||
maximumLevel: 18,
|
||
});
|
||
viewer.imageryLayers.addImageryProvider(imgMap);
|
||
|
||
viewer._cesiumWidget._creditContainer.style.display = "none"; // 隐藏版权
|
||
viewer.scene.globe.show = true;
|
||
viewer.scene.debugShowFramesPerSecond = true;
|
||
|
||
// var tilesets = new Cesium.Cesium3DTileset({
|
||
// url: './SampleData/Cesium3DTiles/Tilesets/Tileset/tileset.json',
|
||
// skipLevelOfDetail: true,
|
||
// maximumMemoryUsage: 1500,
|
||
// maximumScreenSpaceError: 16,
|
||
// // cullRequestsWhileMovingMultiplier: 100,
|
||
// dynamicScreenSpaceError: false,
|
||
// preferLeaves: true,
|
||
// debugShowContentBoundingVolume: false,
|
||
// debugShowViewerRequestVolume: false,
|
||
// debugShowBoundingVolume: false,
|
||
// });
|
||
// tilesets.readyPromise
|
||
// .then(function (tileset) {
|
||
// viewer.scene.primitives.add(tileset);
|
||
// viewer.flyTo(tileset);
|
||
// })
|
||
// .otherwise(function (error) {
|
||
// console.log(error);
|
||
// });
|
||
var myPositions = [
|
||
[109.05832893717263, 37.441496598851096],
|
||
[109.05855416786699, 37.44130123438769],
|
||
[109.05870506545179, 37.44117238850958],
|
||
[109.05846290755761, 37.441001906200626],
|
||
[109.05874862898264, 37.440730473795476],
|
||
[109.0591362027828, 37.4403901883947],
|
||
[109.05955264270231, 37.4400282830198],
|
||
[109.05976466627452, 37.43986533373868],
|
||
[109.06019447304337, 37.43953151809137],
|
||
[109.06050060518912, 37.439282109667204],
|
||
[109.06073920090172, 37.43909640541291],
|
||
[109.06102095626935, 37.43887990938909],
|
||
[109.06126114614219, 37.43905268010351],
|
||
[109.0615923854886, 37.43932891714282],
|
||
[109.06114978051788, 37.43970657237644],
|
||
[109.06078572833964, 37.44000168113979],
|
||
[109.06027780474928, 37.44042583498669],
|
||
[109.0598968978716, 37.440729305287476],
|
||
[109.05936770987917, 37.441168572826626],
|
||
[109.05904603542216, 37.44142781800953],
|
||
[109.0587449465546, 37.44119249116668],
|
||
[109.05845600554856, 37.441396645980845],
|
||
];
|
||
// var point = viewer.entities.add({
|
||
// position: Cesium.Cartesian3.fromDegrees(
|
||
// 109.05845600554856,
|
||
// 37.441396645980845,
|
||
// 100
|
||
// ),
|
||
// point: {
|
||
// show: false,
|
||
// },
|
||
// });
|
||
|
||
viewer.camera.flyTo({
|
||
destination: Cesium.Cartesian3.fromDegrees(
|
||
109.05845600554856,
|
||
37.441396645980845,
|
||
400.0
|
||
),
|
||
});
|
||
console.log(viewer.animation);
|
||
function trackView() {
|
||
//Set bounds of our simulation time
|
||
var start = Cesium.JulianDate.fromDate(new Date(2015, 2, 25, 16));
|
||
var stop = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
myPositions.length - 1,
|
||
new Cesium.JulianDate()
|
||
);
|
||
|
||
//Make sure viewer is at the desired time.
|
||
viewer.clock.startTime = start.clone();
|
||
viewer.clock.stopTime = stop.clone();
|
||
viewer.clock.currentTime = start.clone();
|
||
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; //Loop at the end
|
||
viewer.clock.multiplier = 0.3;
|
||
|
||
//Set timeline to simulation bounds
|
||
viewer.timeline.zoomTo(start, stop);
|
||
|
||
//Generate a random circular pattern with varying heights.
|
||
function computeCirclularFlight() {
|
||
var property = new Cesium.SampledPositionProperty();
|
||
//设置插入选项
|
||
property.setInterpolationOptions({
|
||
// interpolationDegree: 1,
|
||
// interpolationAlgorithm: Cesium.LinearApproximation,
|
||
|
||
// interpolationDegree: 5,
|
||
// interpolationAlgorithm:
|
||
// Cesium.LagrangePolynomialApproximation,
|
||
|
||
interpolationDegree: 2,
|
||
interpolationAlgorithm: Cesium.HermitePolynomialApproximation,
|
||
});
|
||
for (var i = 0; i < myPositions.length; i++) {
|
||
var time = Cesium.JulianDate.addSeconds(
|
||
start,
|
||
i,
|
||
new Cesium.JulianDate()
|
||
);
|
||
var position = Cesium.Cartesian3.fromDegrees(
|
||
myPositions[i][0],
|
||
myPositions[i][1],
|
||
5
|
||
);
|
||
property.addSample(time, position);
|
||
}
|
||
return property;
|
||
}
|
||
|
||
var position = computeCirclularFlight();
|
||
|
||
//Actually create the entity
|
||
var entity = viewer.entities.add({
|
||
//Set the entity availability to the same interval as the simulation time.
|
||
availability: new Cesium.TimeIntervalCollection([
|
||
new Cesium.TimeInterval({
|
||
start: start,
|
||
stop: stop,
|
||
}),
|
||
]),
|
||
//Use our computed positions
|
||
position: position,
|
||
//Automatically compute orientation based on position movement.
|
||
orientation: new Cesium.VelocityOrientationProperty(position),
|
||
|
||
model: {
|
||
uri: "../SampleData/models/CesiumAir/Cesium_Air.glb",
|
||
minimumPixelSize: 64,
|
||
},
|
||
//Show the path as a pink line sampled in 1 second increments.
|
||
path: {
|
||
resolution: 1,
|
||
material: new Cesium.PolylineGlowMaterialProperty({
|
||
glowPower: 0.1,
|
||
color: Cesium.Color.GREEN,
|
||
}),
|
||
width: 16,
|
||
},
|
||
});
|
||
viewer.trackedEntity = entity;
|
||
}
|
||
|
||
//视角变换
|
||
var matrix3Scratch = new Cesium.Matrix3();
|
||
function getModelMatrix(entity, time, result) {
|
||
var position = Cesium.Property.getValueOrUndefined(
|
||
entity.position,
|
||
time,
|
||
new Cesium.Cartesian3()
|
||
);
|
||
if (!Cesium.defined(position)) {
|
||
return undefined;
|
||
}
|
||
var orientation = Cesium.Property.getValueOrUndefined(
|
||
entity.orientation,
|
||
time,
|
||
new Cesium.Quaternion()
|
||
);
|
||
if (!Cesium.defined(orientation)) {
|
||
result = Cesium.Transforms.eastNorthUpToFixedFrame(
|
||
position,
|
||
undefined,
|
||
result
|
||
);
|
||
} else {
|
||
result = Cesium.Matrix4.fromRotationTranslation(
|
||
Cesium.Matrix3.fromQuaternion(orientation, matrix3Scratch),
|
||
position,
|
||
result
|
||
);
|
||
}
|
||
return result;
|
||
}
|
||
var scratch = new Cesium.Matrix4();
|
||
var renderListener = function (e) {
|
||
//viewer.camera.positionCartographic.height = 2000 + $this.limitCamera(f_property);
|
||
if (viewer.trackedEntity) {
|
||
getModelMatrix(viewer.trackedEntity, viewer.clock.currentTime, scratch);
|
||
|
||
var transformX = 90; //距离运动点的距离(后方)
|
||
var transformZ = 55; //距离运动点的高度(上方)
|
||
var transformY = 0; //距离运动点的高度(侧方)
|
||
viewer.scene.camera.lookAtTransform(
|
||
scratch,
|
||
new Cesium.Cartesian3(-transformX, transformY, transformZ)
|
||
);
|
||
}
|
||
};
|
||
viewer.scene.preRender.addEventListener(renderListener);
|
||
|
||
document.getElementById("start").onclick = function () {
|
||
viewer.clock.shouldAnimate = true;
|
||
trackView();
|
||
};
|
||
|
||
document.getElementById("quit").onclick = function () {
|
||
viewer.trackedEntity = undefined;
|
||
viewer.clock.shouldAnimate = false;
|
||
};
|
||
|
||
// 放大缩小
|
||
document.getElementById("zoomIn").onclick = function () {
|
||
// 获取当前镜头位置的笛卡尔坐标
|
||
let cameraPos = viewer.camera.position;
|
||
// 获取当前坐标系标准
|
||
let ellipsoid = viewer.scene.globe.ellipsoid;
|
||
|
||
// 根据坐标系标准,将笛卡尔坐标转换为地理坐标
|
||
let cartographic = ellipsoid.cartesianToCartographic(cameraPos);
|
||
// 获取镜头的高度
|
||
let height = cartographic.height;
|
||
// if (height < 40) {
|
||
// return
|
||
// }
|
||
// 镜头拉近
|
||
viewer.camera.zoomIn(height / 3);
|
||
};
|
||
|
||
document.getElementById("zoomOut").onclick = function () {
|
||
// 获取当前镜头位置的笛卡尔坐标
|
||
let cameraPos = viewer.camera.position;
|
||
// 获取当前坐标系标准
|
||
let ellipsoid = viewer.scene.globe.ellipsoid;
|
||
|
||
// 根据坐标系标准,将笛卡尔坐标转换为地理坐标
|
||
let cartographic = ellipsoid.cartesianToCartographic(cameraPos);
|
||
// 获取镜头的高度
|
||
let height = cartographic.height;
|
||
// if (height < 40) {
|
||
// return
|
||
// }
|
||
// 镜头拉近
|
||
viewer.camera.zoomOut(height * 1.2);
|
||
};
|
||
//经纬度显示
|
||
viewer.screenSpaceEventHandler.setInputAction(function (event) {
|
||
var earthPosition = viewer.camera.pickEllipsoid(
|
||
event.position,
|
||
viewer.scene.globe.ellipsoid
|
||
);
|
||
var cartographic = Cesium.Cartographic.fromCartesian(
|
||
earthPosition,
|
||
viewer.scene.globe.ellipsoid,
|
||
new Cesium.Cartographic()
|
||
);
|
||
var lat = Cesium.Math.toDegrees(cartographic.latitude);
|
||
var lng = Cesium.Math.toDegrees(cartographic.longitude);
|
||
var height = viewer.camera.positionCartographic.height;
|
||
document.getElementById("infobox").innerHTML =
|
||
"<span>经度:" +
|
||
lng.toFixed(3) +
|
||
"</span>" +
|
||
"<span> 纬度:" +
|
||
lat.toFixed(3) +
|
||
"</span>" +
|
||
"<span> 相机高度:" +
|
||
height +
|
||
"</span>";
|
||
console.log(lat, lng, height);
|
||
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
||
</script>
|
||
</html>
|