Surpriseplus
2022-10-20 0f0d87ffbe149d47342d2bf5d5e9ae6ce130c901
src/components/mapsdk.vue
@@ -1,50 +1,230 @@
<template>
  <div id="mapdiv"></div>
  <div id="mapdiv" class="mapdiv">
    <div class="bufferBox" v-if="showBufferBoxDialog">
      <el-card class="box-card">
        <div slot="header" class="clearfix">
          <span>缓冲区分析</span>
          <div style="float: right; cursor: pointer">
            <i class="el-icon-close" @click="closeBufferBox(1)"></i>
          </div>
        </div>
        <div class="box-body">
          <el-form ref="form" :model="bufFrom" label-width="100px">
            <el-form-item label="缓冲半径(米):">
              <el-input v-model="bufFrom.val"></el-input>
            </el-form-item>
            <el-form-item>
              <el-button @click="addBuffer(1)" type="info">点</el-button>
              <el-button @click="addBuffer(2)" type="info">线</el-button>
              <el-button @click="addBuffer(3)" type="info">面</el-button>
              <el-button @click="clearBuffer" type="info">清除</el-button>
            </el-form-item>
          </el-form>
        </div>
      </el-card>
    </div>
    <div class="coordLocalBox" v-if="showCoordLocalBoxDialog">
      <el-card class="box-card">
        <div slot="header" class="clearfix">
          <span>坐标定位</span>
          <div style="float: right; cursor: pointer">
            <i class="el-icon-close" @click="closeBufferBox(2)"></i>
          </div>
        </div>
        <div class="box-body">
          <el-form ref="form" :model="coordFrom" label-width="50px">
            <el-form-item label="经度:">
              <el-input v-model="coordFrom.lon"></el-input>
            </el-form-item>
            <el-form-item label="纬度:">
              <el-input v-model="coordFrom.lat"></el-input>
            </el-form-item>
            <el-form-item label="高度:">
              <el-input v-model="coordFrom.height"></el-input>
            </el-form-item>
            <el-form-item>
              <el-button @click="setCoordLocal" type="info">定位</el-button>
            </el-form-item>
          </el-form>
        </div>
      </el-card>
    </div>
  </div>
</template>
<script>
export default {
  name: '',
  data() {
    return {};
    return {
      buffer: null,
      showBufferBoxDialog: false,
      showCoordLocalBoxDialog: false,
      bufFrom: {
        val: 50,
      },
      coordFrom: {
        lon: 110,
        lat: 32,
        height: 8000000,
      },
    };
  },
  mounted() {
    this.init3DMap();
    this.$bus.$on('mapChangeBox', (res) => {
      this.showChangeBox(res);
    });
  },
  methods: {
    init3DMap() {
      //地图初始化
      window.sgworld = new SmartEarth.SGWorld('mapdiv', {
        url: '/SmartEarthSDK/Workers/image/earth.jpg',
        licenseServer: 'http://192.168.20.39/LFServer',
        licenseServer: window.sceneConfig.licenseServer,
      });
      window.Viewer = sgworld._Viewer;
      sgworld.Navigate.Stop(); //取消飞行状态
      window.Viewer = window.sgworld._Viewer;
      //定位
      // sgworld.Navigate.jumpTo({
      //   //跳转视角
      //   destination: new Cesium.Cartesian3.fromDegrees(110, 32, 8000000),
      // });
      sgworld.Navigate.jumpTo({
        //跳转视角
        destination: new Cesium.Cartesian3.fromDegrees(110, 32, 8000000),
        destination: {
          x: 311837.3471863137,
          y: 5628280.936629815,
          z: 2992581.921482893,
        },
        orientation: {
          heading: 2.5028896264234364,
          pitch: -0.2201285642360813,
          roll: 0.0,
        },
      });
      Viewer._enableInfoOrSelection = false;
      //显示fps
      sgworld._Viewer.scene.debugShowFramesPerSecond = false;
      //mpt添加
      Viewer.scene.debugShowFramesPerSecond = false;
      //导航控件
      window.sgworld.navControl('nav', false);
      //比例尺
      window.sgworld.navControl('scale', false);
      //影像对比设置
      var base = {
        url: 'https://a.tile.openstreetmap.org/',
      };
      window.openStreetMap = sgworld.Creator.createImageryProvider(
        'OpenStreetMap',
        'OpenStreetMap',
        base,
        '0',
        undefined,
        true,
        ''
      );
      openStreetMap.item.show = false;
      //mpt加载
      var option = {
        url: 'http://183.162.245.49:82/SG/Elevation',
        layerName: 'zhufeng.397336.mpt',
        url: window.sceneConfig.mpt.url,
        layerName: window.sceneConfig.mpt.name,
        requestVertexNormals: true,
      };
      sgworld.Creator.sfsterrainprovider('', option, '', true, '');
      //导航控件
      document.getElementById('distanceLegendDiv').style.display = 'none';
      //比例尺
      sgworld.navControl('enableCompass', false);
      //sgworld.navControl("enableDistanceLegend", false);
      setTimeout(() => {}, 10000);
      sgworld.Creator.sfsterrainprovider('mpt', option, '', true, '');
      window.elevationTool = new SmartEarth.ElevationTool(window.sgworld);
      //模型加载
    },
    //显示弹窗
    showChangeBox(res) {
      if (res.name == 'Query') {
        if (res.id == '6') {
        } else if (res.id == '7') {
        } else {
          this.showBufferBoxDialog = true;
        }
      } else if (res.name == 'Coord') {
        if (res.id == '1') {
          this.showCoordLocalBoxDialog = true;
        }
      }
    },
    closeBufferBox(res) {
      switch (res) {
        case 1:
          this.showBufferBoxDialog = false;
          this.clearBuffer();
          break;
        case 2:
          this.showCoordLocalBoxDialog = false;
          break;
      }
    },
    //定位
    setCoordLocal() {
      var lon = parseFloat(this.coordFrom.lon);
      var lat = parseFloat(this.coordFrom.lat);
      var height = parseFloat(this.coordFrom.height);
      sgworld.Navigate.jumpTo({
        //跳转视角
        destination: new Cesium.Cartesian3.fromDegrees(lon, lat, height),
      });
    },
    //缓冲区分析
    clearBuffer() {
      if (this.buffer == null) return;
      this.buffer && this.buffer.clearBuff();
      this.buffer = null;
    },
    getBufferTable(type) {
      const points =
        this.buffer.this_buff.buff.polygon.hierarchy.getValue().positions;
      let geometrys = '';
      let firstPoint;
      let degrees = '';
      points.forEach((p, i) => {
        degrees = window.sgworld.Core.toDegrees(p);
        geometrys += '[' + degrees.lon + ',' + degrees.lat + '],';
        i === 0 && (firstPoint = '[' + degrees.lon + ',' + degrees.lat + ']');
      });
      geometrys += firstPoint;
      if (geometrys.length != 0) geometrys.trimEnd(',');
      geometrys = '{rings:[[' + geometrys + ']]}';
    },
    addBuffer(res) {
      this.clearBuffer();
      var buffRadius = this.bufFrom.val;
      switch (res) {
        case 1:
          this.buffer = sgworld.Analysis.DrawPointBuffer(
            buffRadius,
            (event) => {
              this.getBufferTable('point');
            }
          );
          break;
        case 2:
          this.buffer = sgworld.Analysis.DrawPolylineBuffer(
            buffRadius,
            (event) => {
              this.getBufferTable('line');
            }
          );
          break;
        case 3:
          this.buffer = sgworld.Analysis.DrawPolygonBuffer(
            buffRadius,
            (event) => {
              this.getBufferTable('polygon');
            }
          );
          break;
      }
    },
  },
};
</script>
<style scoped>
#mapdiv {
.mapdiv {
  width: 100%;
  height: 100%;
  overflow: hidden;
@@ -52,4 +232,31 @@
  padding: 0;
  position: relative;
}
.bufferBox {
  width: 412px;
  height: 230px;
  z-index: 40;
  position: absolute;
  right: 1%;
  bottom: 1%;
}
.coordLocalBox {
  width: 350px;
  height: 370px;
  z-index: 40;
  position: absolute;
  right: 1%;
  bottom: 1%;
}
.box-card {
  background-color: rgba(0, 0, 0, 0.6);
  border: 1px solid rgba(32, 160, 255, 0.6);
  color: white;
}
.box-body {
  padding: 18px;
}
/deep/ .el-form-item__label {
  color: white !important;
}
</style>