使用vue3+vite+cesium,在地图上显示图标,并且点击实体弹出消息框

3 篇文章 0 订阅
2 篇文章 0 订阅

安装vue3+vite项目

npm create vite@latest my-vue-app --template vue
cd my-vue-app
npm install

安装cesium+vite-plugin-cesium
vite-plugin-cesium 方便配置 cesium ,webpack配置cesium 比较难

npm i cesium --save
npm i -D vite vite-plugin-cesium
或
npm i vite-plugin-cesium -D

运行

npm run dev

在vite.config.js中配置如下

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import cesium from 'vite-plugin-cesium'
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(),cesium()]
})


话不多说,直接上代码

<script>
import * as Cesium from "cesium";
import { onMounted,ref } from "vue";
export default {
  setup(){
    let text = ref('哈哈哈哈')
    onMounted(() => {
      var viewer = new Cesium.Viewer( 'cesiumContainer', {  
        animation : false,//是否创建动画小器件,左下角仪表  
        baseLayerPicker : false,//是否显示图层选择器  
        fullscreenButton : false,//是否显示全屏按钮  
        geocoder : false,//是否显示geocoder小器件,右上角查询按钮  
        homeButton : false,//是否显示Home按钮  
        infoBox : false,//是否显示信息框  
        sceneModePicker : false,//是否显示3D/2D选择器  
        selectionIndicator : false,//是否显示选取指示器组件  
        timeline : false,//是否显示时间轴  
        navigationHelpButton : false,//是否显示右上角的帮助按钮  
        scene3DOnly : true,//如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源  
        clock : new Cesium.Clock(),//用于控制当前时间的时钟对象  
        selectedImageryProviderViewModel : undefined,//当前图像图层的显示模型,仅baseLayerPicker设为true有意义  
        imageryProviderViewModels : Cesium.createDefaultImageryProviderViewModels(),//可供BaseLayerPicker选择的图像图层ProviderViewModel数组  
        selectedTerrainProviderViewModel : undefined,//当前地形图层的显示模型,仅baseLayerPicker设为true有意义  
        terrainProviderViewModels : Cesium.createDefaultTerrainProviderViewModels(),//可供BaseLayerPicker选择的地形图层ProviderViewModel数组  
        // imageryProvider : new Cesium.OpenStreetMapImageryProvider( {  
        //     credit :'',  
        //     url : '//192.168.0.89:5539/planet-satellite/'  
        // } ),//图像图层提供者,仅baseLayerPicker设为false有意义  
        terrainProvider : new Cesium.EllipsoidTerrainProvider(),//地形图层提供者,仅baseLayerPicker设为false有意义  
        // skyBox : new Cesium.SkyBox({  
        //     sources : {  
        //       positiveX : 'Cesium-1.7.1/Skybox/px.jpg',  
        //       negativeX : 'Cesium-1.7.1/Skybox/mx.jpg',  
        //       positiveY : 'Cesium-1.7.1/Skybox/py.jpg',  
        //       negativeY : 'Cesium-1.7.1/Skybox/my.jpg',  
        //       positiveZ : 'Cesium-1.7.1/Skybox/pz.jpg',  
        //       negativeZ : 'Cesium-1.7.1/Skybox/mz.jpg'  
        //     }  
        // }),//用于渲染星空的SkyBox对象  
        fullscreenElement : document.body,//全屏时渲染的HTML元素,  
        useDefaultRenderLoop : true,//如果需要控制渲染循环,则设为true  
        targetFrameRate : undefined,//使用默认render loop时的帧率  
        showRenderLoopErrors : false,//如果设为true,将在一个HTML面板中显示错误信息  
        automaticallyTrackDataSourceClocks : true,//自动追踪最近添加的数据源的时钟设置  
        contextOptions : undefined,//传递给Scene对象的上下文参数(scene.options)  
        sceneMode : Cesium.SceneMode.SCENE3D,//初始场景模式  
        mapProjection : new Cesium.WebMercatorProjection(),//地图投影体系  
        dataSources : new Cesium.DataSourceCollection()  
        //需要进行可视化的数据源的集合  
      }); 
      // 定位到某个点位上
      const boundingSphere = new Cesium.BoundingSphere(
        Cesium.Cartesian3.fromDegrees(120.55538, 31.87532, 100),
        200, // 控制高度
      );
      viewer.camera.flyToBoundingSphere(boundingSphere, {
        // 动画,定位到初始位置的过渡时间,设置成0,就没有动画
        duration: 0,
      });
      // 将地图默认显示的文字和logo 隐藏掉
      viewer._cesiumWidget._creditContainer.style.display = "none";
      // 文字颜色
      const _textColor = "rgb(11, 255, 244)";
      let shuj = [
        {
          id:1,
          name: '广告牌1',
          j: 120.5552,
          w: 31.87532,
          img: '/assets/true.jpg'
        },
        {
          id:2,
          name: '广告牌2',
          j: 120.5554,
          w: 31.87632,
          img: '/assets/Icon_.png'
        },
        {
          id:3,
          name: '广告牌3',
          j: 120.55238,
          w: 31.87432,
          img: '/assets/Icon_.png'
        },
        {
          id:4,
          name: '广告牌4',
          j: 120.55338,
          w: 31.87732,
          img: '/assets/wux.png'
        },
        {
          id:5,
          name: '广告牌5',
          j: 120.55538,
          w: 31.87732,
          img: '/assets/k.jpg'
        },
        {
          id:6,
          name: '广告牌6',
          j: 120.55538,
          w: 31.87432,
          img: '/assets/Icon_.png'
        },
        {
          id:7,
          name: '广告牌7',
          j: 120.55438,
          w: 31.8754,
          img: '/assets/true.jpg'
        }
      ]
      for(let i = 0; i < shuj.length; i++){
        // 添加实体
        viewer.entities.add({
          id: shuj[i].id, // id 为唯一的
          name: shuj[i].name, // 名字
          position: Cesium.Cartesian3.fromDegrees(shuj[i].j, shuj[i].w), // 广告牌在地图上的位置,@params(经度{Number},维度{Number},高度{Number})
          billboard: {
            verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 广告牌的对齐方式
            image: shuj[i].img, // 图片需要放在public/assets下
            width: 18,
            height: 24,
          },
          // 图标下的点 pixelSize为大小
          point: {
            pixelSize: 5
          },
          // 标签名
          label: {
            // show: false,
            text:shuj[i].name,
            font: "12px monospace",
            style: Cesium.LabelStyle.FILL_AND_OUTLINE,
            // fillColor: Cesium.Color.LIME,
            fillColor: Cesium.Color.fromCssColorString(_textColor),
            outlineWidth: 4,
            verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 垂直方向以底部来计算标签的位置
            pixelOffset: new Cesium.Cartesian2(0, -25), // 偏移量 文字处于 (1,2) 1、正为右,负为左,2、上为负,下为正
          },
        });
      }
      // 点击广告牌的事件
      var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
      let leftclick = Cesium.ScreenSpaceEventType.LEFT_CLICK;
      viewer.screenSpaceEventHandler.removeInputAction(leftclick);

      // 鼠标左键事件
      handler.setInputAction((e) => {
            let pickObj = viewer.scene.pick(e.position,3, 3);
            console.log(pickObj);
            // 判断是否点击到地图上的图标
            if(Cesium.defined(pickObj)){
              if(pickObj.id && pickObj.id instanceof Cesium.Entity){
                console.log(pickObj.id._position._value);
                // text.value = pickObj.id._name
                // 将地图的经纬度转换成在画布的位置坐标
                var winpos = viewer.scene.cartesianToCanvasCoordinates(pickObj.id._position._value);
                // 调用显示的方法
                showInfo(viewer.entities.getById(pickObj.id.id),winpos);
                // viewer.trackedEntity = viewer.entities.getById(pickObj.id.id); // 点击实体拉近与实体的距离
              }
            }else{
              hideInfo()
            }
        }, leftclick);

      })

      
      // 显示信息
			function showInfo(entity,winpos) {
		        var info = document.getElementById("info");
		        // 对位置进行定位
		        if(winpos) {
		          info.style.left = (winpos.x).toFixed(0) + 'px';
		          info.style.top = (winpos.y - 120).toFixed(0) + 'px';
		        }
		        // 显示框里的内容
				info.innerHTML = '';
				info.innerHTML = entity.name;
				info.style.display = 'block';
			}
 
			function hideInfo() {
        		var info = document.getElementById("info");
				info.style.display = 'none';
			}
  
    return {
      text
    }
  }
}
</script>
<template>
  <div id="cesiumContainer">
    <div id="info"></div>
  </div>
</template>
<style scoped>
body{
  position: relative;
}
#cesiumContainer{
  width: 90vw;
  height: 90vh;
  margin:  0 auto;
}
#info {
    position: absolute;  
    width: 100px;
    height: 100px;
    z-index: 1000;
    display: none;
    background: rgba(255, 255, 255, 0.5);
    border: 2px solid greenyellow;
    border-radius: 4px;
}         
/* #look{
  width: 200px;
  height: 200px;
  background: yellow;
  opacity: 0.2;
} */
</style>



https://blog.csdn.net/weixin_46212682/article/details/127348864?ops_request_misc=&request_id=&biz_id=102&utm_term=vue3+vite+cesium&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-127348864.142v73insert_down3,201v4add_ask,239v1control&spm=1018.2226.3001.4187

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就躺了吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值