路径漫游控制组件
功能介绍
通过路径漫游控制组件,能够更方便地生成路径漫游参数。
注:该功能使用了 elementUI 库,使用前需安装该库,具体方法见 elementUI 安装 。
不妨通过代码示例在 Vue 中尝试一下:
在线演示
点击 在线链接 以查看在线演示。
组件代码示例
默认路径为 components/CreateTourSet/index.vue
vue
<template>
<div>
<!-- 路径漫游控制组件 -->
<el-card class="box-card">
<div
id="move-layer"
class="title"
@mousedown="mousedown"
@mouseup="mouseup"
>
路径漫游控制组件
</div>
<hr />
<div class="button mainButton" @click="startTour()">开始漫游</div>
<div class="button subButton" @click="stopTour()">停止漫游</div>
<div class="button subButton" @click="createTour()">生成路径</div>
<div class="button" @click="outputTour()">导出路径</div>
<el-table
v-loading="loading"
:data="tableData"
:empty-text="emptyText"
style="width: 100%; min-width: 270px"
max-height="300px"
highlight-current-row
@row-dblclick="onClickRow"
>
<el-table-column
label="路径名称"
width="120"
header-align="center"
align="center"
>
<template slot-scope="scope">
<div slot="reference" class="name-wrapper">
<el-tag size="medium">{{ scope.row.name }}</el-tag>
</div>
</template>
</el-table-column>
<el-table-column label="操作" header-align="center" align="center">
<template slot-scope="scope">
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.$index, scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script type="text/javascript">
import * as Cesium from 'cesium';
export default {
data () {
return {
loading: false,
emptyText: "暂无数据",
tableData: [],
}
},
methods: {
/**
* 开始漫游
*/
startTour () {
uniCore.tour.startTweensTour(this.tableData);
},
/**
* 停止漫游
*/
stopTour () {
uniCore.tour.stopTweensTour();
},
/**
* 生成路径
*/
createTour () {
let currentCameraSet = uniCore.position.getCurrentCameraSet();
if (!!currentCameraSet) {
// 创建输入框
let ret = prompt("请输入路径内容");
if (ret !== null && ret !== "") {
let viewData = {};
if (this.tableData.length === 0) {
viewData.duration = 0;
} else {
let ret2 = prompt("请输入动画时间");
ret2 = parseFloat(ret2)
if (!isNaN(ret2) && ret2 !== null && ret2 !== "") {
viewData.duration = ret2;
}
}
viewData.id = this.tableData.length;
viewData.name = ret;
viewData.lon = currentCameraSet.lon;
viewData.lat = currentCameraSet.lat;
viewData.het = currentCameraSet.het;
viewData.heading = currentCameraSet.heading;
viewData.pitch = currentCameraSet.pitch;
this.tableData.push(viewData);
}
}
},
/**
* 删除路径
* @param {*} index
* @param {*} row
*/
handleDelete (index, row) {
this.loading = true;
this.tableData.splice(index, 1)
this.loading = false;
},
/**
* 双击表格栏
* @param {*} val
*/
onClickRow (val) {
window.viewer.scene.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(val.lon, val.lat, val.het),
orientation: {
heading: val.heading, // 方向
pitch: val.pitch, // 倾斜角度
roll: 0
},
duration: 0
});
},
/**
* 导出路径
*/
outputTour () {
this.$message(
{ message: "所需路径已在控制台打印,使用F12查看" }
)
let outputData = [];
this.tableData.forEach(e => { outputData.push(e) })
console.log(outputData);
return outputData;
},
/**
* 鼠标与窗口拖动相关
*/
mousedown (event, id) {
if (document.elementFromPoint(event.clientX, event.clientY).id === 'move-layer') {
this.selectElement = document.elementFromPoint(event.clientX, event.clientY).parentNode.parentNode;
document.querySelectorAll('.box-card').forEach((e) => {
e.style.zIndex = 1000;
})
this.selectElement.style.zIndex = 1001;
var div1 = this.selectElement
this.selectElement.style.cursor = 'move'
this.isDowm = true
var distanceX = event.clientX - this.selectElement.offsetLeft
var distanceY = event.clientY - this.selectElement.offsetTop
document.onmousemove = function (ev) {
var oevent = ev || event
div1.style.left = oevent.clientX - distanceX + 'px'
div1.style.top = oevent.clientY - distanceY + 'px'
}
document.onmouseup = function () {
document.onmousemove = null
document.onmouseup = null
div1.style.cursor = 'default'
}
}
},
//鼠标抬起
mouseup () {
this.isMove = false;
this.selectElement = "null"
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-card__body {
padding: 20px 0px 0 0px;
}
::v-deep .box-card {
position: absolute;
top: 3%;
left: 3%;
width: 300px;
z-index: 1;
background: rgb(26 26 26 / 83%);
border: 1px solid rgba(255, 255, 255, 0.3);
box-shadow: 0px 24px 54px 0px rgba(35, 41, 50, 0.5);
border-radius: 15px;
padding: 0 24px 12px 24px;
margin-bottom: 12px;
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
transition: none;
user-select: none;
.title {
font-size: 18px;
font-weight: bold;
color: #fefeff;
display: block;
margin-left: 24px;
margin-bottom: 10px;
user-select: none;
overflow: hidden;
cursor: move;
}
hr {
margin-left: 24px;
margin-bottom: 10px;
border: none;
border-bottom: 1px solid #ffffff1a;
}
.el-table {
border-radius: 15px;
}
.button {
display: inline-flex;
margin: 5px 10px;
color: white;
background: #4d4d4dd1;
border-radius: 10px;
padding: 7px 20px;
cursor: pointer;
transition: 0.3s;
}
.mainButton {
background: #105bc5;
font-weight: 700;
padding: 7px 40px;
}
.subButton {
background: #979797cc;
}
.mainButton:hover {
background: #009fff;
box-shadow: 0px 0px 54px 0px #009fffa8;
}
.subButton:hover {
background: #d7d7d7cc;
box-shadow: 0px 0px 54px 0px #d7d7d7a8;
}
}
</style>调用代码示例
vue
<template>
<div id="unicoreContainer">
<!-- 路径漫游控制组件窗口卡片开始 -->
<ctSet ref="ctSetId"></ctSet>
<!-- 路径漫游控制组件窗口卡片结束 -->
</div>
</template>
<script>
import { UniCore } from 'unicore-sdk'
import { config } from 'unicore-sdk/unicore.config'
import 'unicore-sdk/Widgets/widgets.css'
import ctSet from '@/components/CreateTourSet/index'; // 路径漫游控制组件
export default {
components: {
ctSet
},
// 生命周期 - 挂载完成(可以访问DOM元素)
mounted () {
this.init();
},
// 方法集合
methods: {
/**
* 通用图形引擎初始化
*/
init () {
// 初始化UniCore
// 目前采用Cesium的地形&底图数据,这里配置Cesium的token
let accessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIxNjEwMzI4My01MjBmLTQzYzktOGZiMS0wMDRhZjE0N2IyMGIiLCJpZCI6MTc1NzkyLCJpYXQiOjE3MTM3NzQ3OTh9.zU-R4MNvHr8rvn1v28PQfDImyutnpPF2lmEgGeSPckQ";
// 初始化unicore
let uniCore = new UniCore(config, accessToken);
uniCore.init("unicoreContainer");
window.uniCore = uniCore;
let viewer = uniCore.viewer;
// 视角初始化
uniCore.position.buildingPosition(viewer, [113.12380548015745, 28.250758831850005, 700], -20, -45, 1);
/**
* 小别墅1号示例
*/
let options = {
id: '小别墅1号示例',
url: '../../assets/3Dtiles/sample3_方法2_小别墅属性(1)/tileset.json',
propertysURL: '../../assets/3Dtiles/sample3_方法2_小别墅属性(1)/01 小别墅.json'
}
//加载3dtiles
uniCore.model.createTileset(options.url, options).then(cityLeft => {
uniCore.model.changeModelPos(cityLeft, [113.12098820449636, 28.256150218457687, 130], [0, 0, 0], [23.8, 23.8, 23.8])
})
}
}
}
</script>
<style scoped>
#unicoreContainer {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
background: black;
}
</style>示例运行结果

调用代码示例中的关键代码
暂无,只需直接引入组件即可。
拓展
你可以双击表格某一栏,即可快速将视角跳转至对应视角,方便调试。
