在cesium中添加按钮,并显示表单实现功能

先放入效果图

一、添加按钮

1.操作DOM元素添加一个按钮,并添加设置位置

const setTrace = document.createElement('button');
setTrace.style.left = '380px';
this.createButton('规划航迹', setTrace)
setTrace.onclick = () => {
    this.traceVisible = !this.traceVisible
    if (this.traceVisible) {
        this.$message.success("再点击一次隐藏!!!")
    } else {
        this.$message.warning("再点击一次显示!!!")
    }
};

这里我使用  this.traceVisible = !this.traceVisible来实现点击按钮出现表单,再点击隐藏,如此反复。

2. 调用的方法

createButton(content, button) {
    button.style.position = 'absolute';
    button.textContent = content;
    button.style.top = '120px';
    button.style.padding = '10px';
    button.style.backgroundColor = 'rgb(13,99,27)';
    button.style.color = 'white';
    button.style.border = 'none';
    button.style.cursor = 'pointer';
    this.viewer.container.appendChild(button);
}

主要是为按钮添加样式 。button.style.cursor = 'pointer';的作用是当鼠标移动到按钮处时,鼠标形状变为手掌指向。

二、添加表单,并为表单添加按钮 

1.主要实现代码

<el-form v-show="traceVisible" label-position="top" label-width="100px" class="demo-trace">
    <img :src="close" class="close_css" @click="traceVisible = false">
    <el-form-item class="label_item">
        <span>{{ content }}</span>
    </el-form-item>
    <el-form-item class="label_item">
        <span>经度:</span>
        <el-input-number class="custom-width" v-model="position.longitude" :precision=12
                         :step="0.00001"></el-input-number>
    </el-form-item>
    <el-form-item class="label_item">
        <span>纬度:</span>
        <el-input-number class="custom-width" v-model="position.latitude" :precision=12
                         :step="0.00001"></el-input-number>
    </el-form-item>
    <el-form-item class="label_item">
        <span>高度:</span>
        <el-input-number class="custom-width" v-model="position.height" :precision=2
                         :step="1"></el-input-number>
    </el-form-item>
    <el-form-item class="label_btn">
        <el-button type="warning" @click="cancelPoint()">撤销该点</el-button>
        <el-button type="primary" @click="showTrace()">创建航线</el-button>
    </el-form-item>
    <el-form-item class="label_btn">
        <el-button type="warning" @click="cancelLine()">撤销该航迹</el-button>
        <el-button type="danger" @click="removeAll()">清除所有</el-button>
    </el-form-item>
</el-form>

 表单主要是结合Element来实现。content的作用是在表单最上方显示提示。:src="close"是引入的一个本地图标,就是表单右上角的×,用来关闭表单,可自己在网上找一个图片放上去。本来自己添加按钮来实现数据的增加和减少(这种方法要自己写方法来实现增加和减少,非常冗余),但发现Element里 <el-input-number中有自带的加减按钮,而且还能调整精度,很方便。

2.实现方法

画点 

drawPoint(position, Cesium) {
    this.content = '规划航点中......'
    const pointEntity = this.viewer.entities.add({
        name: "点几何对象",
        position: position,
        point: {
            color: Cesium.Color.SKYBLUE,
            pixelSize: 3,
            outlineColor: Cesium.Color.YELLOW,
            outlineWidth: 2
        }
    });
    return pointEntity;
}

画线 

drawLine(points) {
    const polylineEntity = this.viewer.entities.add({
        polyline: {
            positions: points, // 线的坐标数组
            width: 2 // 线的宽度
        }
    });
    this.lineEntities.push(polylineEntity);
    return polylineEntity;
}

撤销点 

cancelPoint() {
    if (this.points.length === 0) {
        this.$message.warning("请先创建航点!!!")
    } else {
        this.initPoint();
        this.viewer.entities.remove(this.currentPointEntity);
        this.points.pop();
        this.pointEntities.pop();
    }
}

撤销线 

cancelLine() {
    if (this.points.length === 0) {
        this.initPoint();
        this.viewer.entities.remove(this.currentLineEntity);
        const Len = this.pointEntities.length
        const entitiesToRemove = this.pointEntities.slice(Len - this.currentLen, Len);
        entitiesToRemove.forEach(entity => {
            this.viewer.entities.remove(entity);
        });
    } else {
        this.$message.warning("请先创建航线!!!")
    }
}

撤销所有 

removeAll() {
    this.initPoint();
    // 遍历并移除所有点实体
    this.pointEntities.forEach(entity => {
        this.viewer.entities.remove(entity);
    });
    // 遍历并移除所有线实体
    this.lineEntities.forEach(entity => {
        this.viewer.entities.remove(entity);
    });
    // 清空实体数组
    this.pointEntities = [];
    this.lineEntities = [];
    this.points = [];
}

 创建航线

showTrace() {
    if (this.points.length >= 2) {
        this.currentLineEntity = this.drawLine(this.points);
        this.currentLen = this.points.length // 获取该航线的长度
        this.points = [],
            this.currentPointEntity = null
    } else {
        this.$message.warning("至少创建两个点才能创建航线!!!")
    }
}

将输入框中的数字初始化

initPoint() {
    this.position.longitude = null;
    this.position.latitude = null;
    this.position.height = 500;
}

 3.所需样式(可根据自己喜好)

.demo-trace {
    width: 240px;
    position: absolute;
    background: #05821a;
    opacity: 0.75;
    color: white;
    left: 230px;
    top: 180px;
    border-radius: 5px;
}

.label_item {
    color: white;
    padding-left: 10px;
    padding-right: 10px;
}

.label_btn {
    display: flex;
    justify-content: center;
    color: white;
    padding-left: 10px;
    padding-right: 10px;
}

.close_css {
    position: absolute;
    left: 220px;
    top: 8px;
    z-index: 100;
    width: 13px;
    height: 13px;
}

.custom-width {
    width: 220px;
}

三、注意事项 

        在代码中很多数据需要在data中初始化,这些就不过多赘述了。在使用代码时有些逻辑需要自己完善, 可能会遇到清除的线不对,点没清除干净等等问题。需要修改上述代码来实现自己的效果。

        另,若有更好的方法,或者有不足的都可以评论。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 Cesium 的 `BillboardCollection` 类来实现在 Vue 框架点击创建 billboard 的功能。 首先,在 Vue 组件的 data 定义一个变量来存储 billboard 集合: ``` data() { return { billboardCollection: new Cesium.BillboardCollection() } } ``` 然后,在组件的 mounted 钩子函数,将 billboard 集合添加到场景: ``` mounted() { this.viewer.scene.primitives.add(this.billboardCollection); } ``` 接着,在组件的 template 绑定点击事件,在事件处理函数添加新的 billboard: ``` <template> <div @click="addBillboard">Click to add a billboard</div> </template> <script> export default { methods: { addBillboard() { // 获取鼠标点击的位置 let pickedObject = this.viewer.scene.pick(this.viewer.camera.getPickRay(this.viewer.canvas.clientWidth / 2, this.viewer.canvas.clientHeight / 2)); if (Cesium.defined(pickedObject)) { let position = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(pickedObject.position); // 创建新的 billboard let billboard = this.billboardCollection.add({ position: Cesium.Cartesian3.fromRadians(position.longitude, position.latitude, position.height + 100), image: 'path/to/image.png' }); } } } } </script> ``` 在这个例子,我们使用了 Cesium 的 `pick` 方法来获取鼠标点击的位置,然后使用 `Cartesian3.fromRadians` 将经纬度坐标转换为笛卡尔坐标,最后使用 `BillboardCollection.add` 方法添加新的 billboard。 希望这些信息能帮助您实现在 Vue 框架使用 Cesium 创建 billboard 的功能。 ### 回答2: 在Vue框架实现点击创建billboard功能,可以按照以下步骤进行: 1. 首先,在Vue项目引入Cesium库,可以通过npm安装或直接引入Cesium.js文件。 2. 在Vue组件,可以在`mounted`钩子函数创建Cesium的Viewer对象,并将其初始化为指定DOM元素的父元素,如: ``` mounted() { this.viewer = new Cesium.Viewer(this.$refs.mapContainer); } ``` 其`$refs.mapContainer`是在模板定义的一个ref,用于获取地图容器的DOM元素。 3. 在模板定义一个按钮,并绑定一个点击事件,如: ```vue <template> <div> <button @click="createBillboard">创建Billboard</button> <div class="map-container" ref="mapContainer"></div> </div> </template> ``` 4. 在Vue组件的methods选项定义`createBillboard`方法,用于创建billboard。在该方法,可以使用Cesium的`Cesium.Cartesian3`类创建一个位置,然后通过`Cesium.BillboardCollection`类创建一个billboard,并设置其属性,最后将billboard添加到scene。代码示例如下: ```vue methods: { createBillboard() { // 创建位置 var position = Cesium.Cartesian3.fromDegrees(103, 30); // 创建BillboardCollection并设置属性 var billboard = this.viewer.scene.primitives.add( new Cesium.BillboardCollection() ); billboard.add({ position: position, image: "path/to/billboard-image.png", scale: 1.0, }); }, } ``` 其,`Cesium.Cartesian3.fromDegrees`根据经纬度创建一个位置,`Cesium.BillboardCollection`用于存储和渲染多个billboard,`image`属性指定billboard的图片路径,`scale`属性用于设置billboard的大小。 5. 最后,通过点击按钮,调用`createBillboard`方法即可在地图上创建一个billboard。 这样,就在Vue框架实现了点击创建billboard功能。 ### 回答3: 在Vue框架实现点击创建Billboard功能,可以按照以下步骤实现: 1. 首先,将Cesium集成到Vue项目。可以通过npm安装Cesium,然后在Vue组件引入Cesium相关的库文件。 2. 在Vue组件的data选项添加一个数组billboards,用于存储所有的Billboard对象信息。在初始状态下,该数组为空。 3. 在Vue组件的template添加一个Cesium的Canvas元素,用于渲染Cesium场景。可以将该Canvas元素的id设为"cesiumContainer"。 4. 在Vue组件的methods选项添加一个方法handleClick,用于处理点击事件。在该方法内,获取点击事件的坐标,在3D场景添加一个Billboard对象,并将其位置设为点击坐标。然后,将该Billboard对象的信息添加到billboards数组保存。 5. 在Vue组件的mounted钩子函数,通过Cesium的Viewer对象初始化3D场景,并将Canvas元素绑定到该Viewer对象上。同时,监听Canvas元素的点击事件,当点击事件发生时,调用handleClick方法。 6. 在Vue组件的template,使用v-for指令循环遍历billboards数组,并根据每个Billboard对象的信息,在Canvas显示对应的Billboard元素。 通过以上步骤,就可以在Vue框架实现点击创建Billboard功能。当用户在Canvas点击时,会在点击位置创建一个Billboard,并在屏幕上显示出来。同时,Billboard对象的信息也会保存在billboards数组,以便后续的操作和管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值