jihongshun
3 天以前 ca62ae43d7614216e5d43dd905fde1fd4a260158
src/utils/components/init-map.vue
@@ -4,15 +4,42 @@
    <div ref="cesiumContainer" id="cesiumContainer"></div>
    <!-- 相机视角容器 -->
    <div ref="cesiumCamera" id="cesiumCamera"></div>
    <div class="zoom-ui-container" @wheel="handleWheel">
       <!-- 中间黄色准星框 -->
    <div
      class="reticle"
      :style="{ width: boxWidth + 'px', height: boxHeight + 'px' }"
    ></div>
    <!-- 使用 ElementUI 的 Slider 替代变倍轴 -->
    <div class="zoom-bar-slider">
      <el-slider
        v-model="zoomRatio"
        vertical
        height="200px"
        :min="minZoom"
        :max="maxZoom"
        :step="0.1"
        :format-tooltip="formatTooltip"
        :marks="marks"
        @input="onSliderInput"
      />
    </div>
      <!-- 左下角倍率信息 -->
      <div class="zoom-info">
        <el-tag type="success">倍率: {{ zoomRatio.toFixed(1) }}X</el-tag>
      </div>
    </div>
    <!-- botton -->
    <div class="cesiumBotton">
      <div class="cesiumButtonGroup">
        <el-button id="groundPoi" @click="addGroundPoi()" type="primary">地面点</el-button>
        <!-- <el-button id="groundPoi" @click="addGroundPoi()" type="primary">停留时间</el-button> -->
        <el-input v-model="mergeNumber" placeholder="请输入合并范围" type="number" style="width: 150px;"></el-input>
        <el-button  @click="mergePoint()" type="success">合并</el-button>
        <el-button  @click="renderData()" type="success">数据渲染</el-button>
      </div>
      <!-- <div class="key-container">
        <div class="arrow-row">
@@ -132,10 +159,29 @@
        mergeNumber:null,
        activeKey: null,
        timer: null,
        zoomRatio: 1,
        minZoom: 1,
        maxZoom: 56,
        baseBoxSize: 400,
        marks: {
          1: '1X',
          7: '7X',
          14: '14X',
          28: '28X',
          56: '56X'
        }
    }
  },
  mounted(){
     this.initCesium();
  },
  computed: {
    boxWidth() {
      return this.baseBoxSize / this.zoomRatio;
    },
    boxHeight() {
      return (this.baseBoxSize * 0.75) / this.zoomRatio; // 高度保持 4:3 比例
    }
  },
  beforeDestroy() {
    counter = 0
@@ -365,6 +411,7 @@
                const distance1 = Cesium.Cartesian3.distance(point1, point2)
                console.log(distance1)
                data.distance = distance1
                _this.zoomRatio = 1
                _this.createVideoScope(data)
                setTimeout(() => {
                  viewerC.camera.changed.addEventListener(_this.onCameraChange)
@@ -677,9 +724,6 @@
    cammove_measure_point(){
      CesiumSurvey.cammeasureMovePoint(viewerC,'cammoveResultCon');
    },
    renderData(){
        this.$emit('renderData',viewerM)
    },
    mergePoint(){
      let allEntities = viewerM.entities.values; // 所有实体对象组成的数组
      const grouped = {};
@@ -789,7 +833,7 @@
          roll: Cesium.Math.toRadians(0),
        });
        let frustum = new Cesium.PerspectiveFrustum({
          fov: Cesium.Math.toRadians(6),
          fov: Cesium.Math.toRadians(1),
          aspectRatio: Number(1.77778), // 宽高比
          near: Number(0.05), // 设备焦距
          far: Number(data.distance), // 拍摄距离
@@ -902,7 +946,7 @@
      console.log(chooseId)
      preVideoScopePrimitiveArrTie.map((item)=>{
        if(item.id == chooseId){
          let obj = this.updateSZScope(Cesium.Math.toDegrees(position.longitude),Cesium.Math.toDegrees(position.latitude),position.height,heading,pitch,roll,1,distanceBetween)
          let obj = this.updateSZScope(Cesium.Math.toDegrees(position.longitude),Cesium.Math.toDegrees(position.latitude),position.height,heading,pitch,roll,this.zoomRatio,distanceBetween)
          item.primitive.inverseViewMatrix = obj.M
          item.primitive.frustum = obj.F
        }
@@ -933,6 +977,24 @@
      console.log(inverseViewMatrixNew)
      return {M: inverseViewMatrixNew, F: frustum};
    },
    handleWheel(event) {
      const delta = event.deltaY;
      const step = 0.5;
      if (delta > 0) {
        this.zoomRatio = Math.min(this.zoomRatio + step, this.maxZoom);
      } else {
        this.zoomRatio = Math.max(this.zoomRatio - step, this.minZoom);
      }
      this.onCameraChange()
    },
    formatTooltip(val) {
      if(val){
        return `${val.toFixed(1)}X`;
      }
    },
    onSliderInput(val) {
      this.zoomRatio = val;
    }
  }
}
</script>
@@ -945,20 +1007,23 @@
#cesiumContainer {
    margin: 0;
    padding: 0;
    width: 60%;
    width: 73%;
    height: calc(100vh - 205px);
}
#cesiumCamera {
    position: absolute;
    z-index: 2;
    background-color: rgba(47, 53, 60, 1);
    padding: 0 5px;
    right: 0px;
    top: 0px;
    /* padding: 0 5px; */
    right: 10px;
    /* top: 0px; */
    bottom: 80px;
    margin: 0;
    width: 33%;
    height:  calc(100vh - 400px);
    border: 1px solid #000;
    width: 400px;
    height: 300px;
    z-index: 6;
    /* height:  calc(100vh - 400px); */
    /* border: 1px solid #000; */
}
.cesiumBotton {
    position: absolute;
@@ -967,14 +1032,16 @@
    /* padding: 0 5px; */
    margin-top: 10px;
    right: 0px;
    width: 420px;
    height: calc(100vh - 210px);
    bottom: 30px;
    margin: 0;
    width: 33%;
    height: calc(30% - 30px);
}
.cesiumButtonGroup{
  margin-top: 10px;
  margin-left: 10px;
  position: absolute;
  bottom: 0;
  /* margin-top: 10px;
  margin-left: 10px; */
}
.moveResult{position:absolute;z-index:2;background-color:rgba(47,53,60,1);padding:0 5px;right:50%;bottom:30px;
    border:1px solid rgba(255,255,255,.1);box-sizing:content-box;width:220px;height:30px;font-size:14px;text-align:center}
@@ -1029,4 +1096,51 @@
.key.active {
  background-color: #00aaff;
}
</style>
<style scoped>
.zoom-ui-container {
  /* width: 100%;
  height: 100%;
  position: relative;
  background: #1e1e1e; /* 你可以替换成图像或视频背景 */
  /* overflow: hidden; */
  width: 400px;
  height: 300px;
  position: absolute;
  right: 10px;
  bottom:80px;
  /* background-color: red; */
  z-index: 9;
}
/* 黄色准星框 */
.reticle {
  position: absolute;
  left: 50%;
  top: 50%;
  border: 2px dashed orange;
  transform: translate(-50%, -50%);
  pointer-events: none;
}
/* ElementUI 滑块样式区域 */
.zoom-bar-slider {
  position: absolute;
  right: 20px;
  top: 50px;
  height: 200px;
}
/* 左下角倍率标签 */
.zoom-info {
  position: absolute;
  bottom: 20px;
  left: 20px;
}
</style>
<style>
.el-slider.is-vertical .el-slider__marks-text{
  width: 30px!important;
}
</style>