美文网首页
Cesium指南-自定义vue组件

Cesium指南-自定义vue组件

作者: 写前端的大叔 | 来源:发表于2021-04-20 22:55 被阅读0次

前面介绍了使用原生的Widget,其实现思想也是基于MVVM,只是用的knockout.js库,大伙都不怎么用这个js库,用起来也比较麻烦,这里使用大家主流的vue来实现一个放大缩小的组件。

创建vue文件

这里跟其它创建组件的方式是一样的,但有一点需要注意的是,引入第三方组件时,如果是在main.js中引入的,这里还需要重新引入一次,是因为这里使用的是createApp来挂载组件的。

<template>
    <div class="zoominout-view">
        <el-button type="text" icon="el-icon-plus" @click="zoomInHandler"></el-button>
        <el-button type="text" icon="el-icon-minus" @click="zoomOutHandler"></el-button>
    </div>
</template>

<script>
    import {
        ElButton
    } from 'element-plus'
    import { toRefs } from 'vue'

    export default {
        name: 'ZoomInOut',
        props:['scene'],
        components: {
            ElButton
        },
        setup(props){
            const { scene } = toRefs(props);
            let viewer = scene.value;
            const zoomInHandler = ()=>{
                // 获取当前镜头位置的笛卡尔坐标
                let cameraPos = viewer.camera.position;
                // 获取当前坐标系标准
                let ellipsoid = viewer.globe.ellipsoid;
                // 根据坐标系标准,将笛卡尔坐标转换为地理坐标
                let cartographic = ellipsoid.cartesianToCartographic(cameraPos);
                // 获取镜头的高度
                let height = cartographic.height;
                viewer.camera.zoomIn(height/3);
            };
            const zoomOutHandler = ()=>{
                // 获取当前镜头位置的笛卡尔坐标
                let cameraPos = viewer.camera.position;
                // 获取当前坐标系标准
                let ellipsoid = viewer.globe.ellipsoid;
                // 根据坐标系标准,将笛卡尔坐标转换为地理坐标
                let cartographic = ellipsoid.cartesianToCartographic(cameraPos);
                // 获取镜头的高度
                let height = cartographic.height;
                viewer.camera.zoomOut(height * 1.2);
            };
            return{
                zoomInHandler,
                zoomOutHandler
            }
        }
    }
</script>
<style scoped>
    .zoominout-view{
        width: 100%;
        height: 100%;
        display: flex;
        flex-direction: column;
        align-items:center;
        justify-content:center;
    }
    .el-button{
        background: #303336;
        color: #fff;
        min-height: auto;
        height: 30px;
        width: 30px;
        padding: 0;
        font-size: 20px;
    }
    .el-button:hover {
        color: #fff;
        fill: #fff;
        background: #48b;
        border-color: #aef;
        box-shadow: 0 0 8px #fff;
    }
    .el-button+.el-button{
        margin-left: 0;
        margin-top: 10px;
    }
</style>

挂载组件

首先引入组件

import ZoomInOutVue from "../ZoomInOutVue/ZoomInOut.vue";

cesium中都是采用appendChild的方法来添加元素,所以在使用vue组件时,可以使用createApp来创建组件,并挂载到对应的元素上。如下所示:

var zoomInOutContainer = document.createElement("div");
zoomInOutContainer.className = "cesium-viewer-zoomInOutContainer";
let zoomInOut = createApp(ZoomInOutVue,{
      scene:scene
  });
zoomInOut.mount(zoomInOutContainer);

相关文章

网友评论

      本文标题:Cesium指南-自定义vue组件

      本文链接:https://www.haomeiwen.com/subject/rbyolltx.html