月球大数据地理空间分析展示平台-【前端】-月球2期前端
surprise
2023-11-27 b1e9c826c1ba48c3dc263039699636ed2ba3be4e
src/assets/js/Map/index.js
@@ -1,135 +1,209 @@
//配置文件地址
import config from "./config";
// import config from "../../../../public/config/config";
//服务加载配置文件
import { Store } from "vuex";
import server from "./server";
import store from "@/store";
const InitMap = {
    sgworld: null,
    Viewer: null,
    //地图初始化
    init3DMap() {
        //设置月球坐标系
        Cesium.Ellipsoid.WGS84 = new Cesium.Ellipsoid(
            1737400.0,
            1737400.0,
            1737400.0
        );
        //页面初始化
        this.sgworld = new SmartEarth.SGWorld("cesiumContainer", {
            url: SmartEarthRootUrl + config.imgUrl,
            licenseServer: config.licenseServer,
            infoBox: false,
        });
        this.Viewer = this.sgworld._Viewer;
        window.sgworld = this.sgworld;
        window.Viewer = this.Viewer;
        //显示fps
        sgworld._Viewer.scene.debugShowFramesPerSecond = false;
        //添加月球初始化切片服务
        server.AddTmsLayer(config.moonTms);
        //添加鼠标左击事件
        this.addMouseLeftClickEvents();
        this.addMouseMouseMoveEvents();
    },
    //鼠标左键点击事件添加
    addMouseLeftClickEvents() {
        if (window.handleLeftClick) {
            window.handleLeftClick.removeInputAction(
                Cesium.ScreenSpaceEventType.LEFT_CLICK
            ); //移除事件
            window.handleLeftClick = null;
  earthCtrl: null,
  Viewer: null,
  graticules: null,
  //地图初始化
  init3DMap() {
    SmartEarth.Cesium.ExternalParameter.eliminate = false;
    SmartEarth.Cesium.ExternalParameter.changeApproximateTerrainHeights = true;
    SmartEarth.Cesium.ExternalParameter.maxTerrainHeight = 2000000;
    SmartEarth.Cesium.ExternalParameter.minTerrainHeight = -2000000;
    SmartEarth.Cesium.ShadowMap.MAXIMUM_DISTANCE = 20000000000;
    SmartEarth.Cesium.ExternalParameter.ellipsoidCoordinates = 'MOON2000'
    window.Cesium = SmartEarth.Cesium;
    SmartEarth.Cesium.Ellipsoid.WGS84 = new SmartEarth.Cesium.Ellipsoid(
      1737400.0,
      1737400.0,
      1737400.0
    );
    //页面初始化
    this.earthCtrl = new SmartEarth.EarthCtrl("cesiumContainer", {
      StaticFileBaseUrl: config.StaticFileBaseUrl,
      ellipsoidCoordinates: 'MOON2000',
      timeline: true,
      shadowBackCul1: false
    });
    this.earthCtrl.Viewer.scene.debugShowFramesPerSecond = true
    this.earthCtrl.coreMap.scene.screenSpaceCameraController.enableCollisionDetection = true;
    this.earthCtrl.Viewer.scene.globe.terrainExaggeration = 1.00001
    // this.earthCtrl.shadowMap.maximumDistance = 10000.0;
    window.earthCtrl = this.earthCtrl;
    window.Viewer = this.earthCtrl._Viewer;
    Viewer.scene.skyAtmosphere.show = false;
    window.Cesium = SmartEarth.Cesium;
    window.sgworld = earthCtrl;
    sgworld.Creator.SimpleGraphic.edit(true, { editProp: false });
    // 最小缩放高度(米)
    Viewer.scene.screenSpaceCameraController.minimumZoomDistance =10000;
    // 最大缩放高度(米)
    Viewer.scene.screenSpaceCameraController.maximumZoomDistance = 5000000;
    //=======================
    //阴影分析
    Viewer.scene.globe.lightingFadeOutDistance = 5.8e+7;
    Viewer.scene.globe.enableLighting = false;
    earthCtrl.shadows = false;
    //设置球体颜色
    window.Viewer.scene.globe.baseColor = new Cesium.Color.fromCssColorString('#A9A9A9');
    //清除所有默认图层
    window.Viewer.imageryLayers.removeAll();
    window.setLayer();
    Viewer.scene.globe.depthTestAgainstTerrain = false; // 开启深度测试
    Viewer.animation.container.style.visibility = "hidden";
    Viewer.timeline.container.style.visibility = "hidden";
    //=======================
    //大气层
    Viewer.scene.globe.showGroundAtmosphere = false;
    sgworld._Viewer.scene.debugShowFramesPerSecond = false;
    sgworld.Navigate.Stop(); //取消飞行状态
    sgworld.Navigate.setPosition(-1093596.38, 5729026.12, 4136590.41);
    this.addMouseLeftClickEvents();
    this.addMouseLeftDownEvents();
  },
  addMouseLeftDownEvents() {
    if (window.handleLeftClick) {
      window.handleLeftClick.removeInputAction(
        Cesium.ScreenSpaceEventType.LEFT_CLICK
      ); //移除事件
      window.handleLeftClick = null;
    }
    const pickGlobeSlope = new SmartEarth.Cesium.PickGlobeSlope(earthCtrl.Viewer)
    window.handleLeftClick = new Cesium.ScreenSpaceEventHandler(
      window.Viewer.scene.canvas
    );
    var that = this;
    window.handleLeftClick.setInputAction(function (event) {
      const angle = pickGlobeSlope.pickSlope(event.position)
      if (store.state.slopeQueyFlag) {
        if (!store.state.showSlopeQuey) {
          store.state.showSlopeQuey = true;
        }
        window.handleLeftClick = new Cesium.ScreenSpaceEventHandler(
            window.Viewer.scene.canvas
        );
        window.handleLeftClick.setInputAction(function (event) {
            let cartesian = window.Viewer.camera.pickEllipsoid(event.position);
            if (cartesian) {
                let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度
                let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
                let alt = cartographic.height; // 高度,椭球面height永远等于0
                let coordinate = {
                    longitude: Number(lng.toFixed(6)),
                    latitude: Number(lat.toFixed(6)),
                    altitude: Number(alt.toFixed(2)),
        store.state.slopeQueyValue = angle.toFixed(6);
                };
      }
            }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  },
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    },
  //鼠标左键点击事件添加
  addMouseLeftClickEvents() {
    if (window.handleLeftDown) {
      window.handleLeftDown.removeInputAction(
        Cesium.ScreenSpaceEventType.LEFT_DOWN
      ); //移除事件
      window.handleLeftDown = null;
    }
    window.handleLeftDown = new Cesium.ScreenSpaceEventHandler(
      window.Viewer.scene.canvas
    );
    var that = this;
    window.handleLeftDown.setInputAction(function (event) {
      let cartesian = window.Viewer.scene.pick(event.position);
      if (Cesium.defined(cartesian)) {
    addMouseMouseMoveEvents() {
        if (window.handleMouseMove) {
            window.handleMouseMove.removeInputAction(
                Cesium.ScreenSpaceEventType.MOUSE_MOVE
            ); //移除事件
            window.handleMouseMove = null;
        if (cartesian.id.shpType && cartesian.id.shpType == 'temporaryLayer') {
          that.setEditTemporaryLayer(cartesian.id._id)
        }
        window.handleMouseMove = new Cesium.ScreenSpaceEventHandler(window.Viewer.scene.canvas);
        window.handleMouseMove.setInputAction(function (movement) {
            let cartesian = window.Viewer.camera.pickEllipsoid(
                movement.endPosition,
                window.Viewer.scene.globe.ellipsoid
            );
            if (cartesian) {
                //将笛卡尔坐标转换为地理坐标
                var cartographic =
                    window.Viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
                //将弧度转为度的十进制度表示
                var lng = Cesium.Math.toDegrees(cartographic.longitude);
                var lat = Cesium.Math.toDegrees(cartographic.latitude);
                //获取相机高度
                var alt = Math.ceil(window.Viewer.camera.positionCartographic.height);
                let coordinate = {
                    longitude: Number(lng.toFixed(6)),
                    latitude: Number(lat.toFixed(6)),
                    altitude: Number(alt.toFixed(2)),
                    type: 'MOUSE_MOVE'
                };
                window.addMouseEvents(coordinate)
            }
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
    },
      }
    }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
  },
  setEditTemporaryLayer(res) {
    // store.state.editTemporaryId = res;
    // console.log(store.state.editTemporaryId)
    //CGCS2000转月球坐标---待验证
    Cjcs2000ToMoon() {
        // 定义待转换的经纬度坐标和高度
        const longitude = 110.5;
        const latitude = 34.5;
        const height = 0;
    if (store.state.editTemporaryId && store.state.editTemporaryId == res) {
        // 定义CGCS2000坐标系
        const cgcs2000 = new Cesium.Ellipsoid(
            6378137.0,
            6378137.0,
            6356752.3142451793
        );
      store.state.setEditTemporaryShow = true;
    }
  },
  addMouseMouseMoveEvents() {
    if (window.handleMouseMove) {
      window.handleMouseMove.removeInputAction(
        Cesium.ScreenSpaceEventType.MOUSE_MOVE
      ); //移除事件
      window.handleMouseMove = null;
    }
    window.handleMouseMove = new Cesium.ScreenSpaceEventHandler(
      window.Viewer.scene.canvas
    );
    window.handleMouseMove.setInputAction(function (movement) {
      let cartesian = window.Viewer.camera.pickEllipsoid(
        movement.endPosition,
        window.Viewer.scene.globe.ellipsoid
      );
      if (cartesian) {
        //将笛卡尔坐标转换为地理坐标
        var cartographic =
          window.Viewer.scene.globe.ellipsoid.cartesianToCartographic(
            cartesian
          );
        //将弧度转为度的十进制度表示
        var lng = Cesium.Math.toDegrees(cartographic.longitude);
        var lat = Cesium.Math.toDegrees(cartographic.latitude);
        //获取相机高度
        var alt = Math.ceil(window.Viewer.camera.positionCartographic.height);
        // 定义Moon2000坐标系
        const moon2000 = new Cesium.Ellipsoid(1737400.0, 1737400.0, 1737400.0);
        let coordinate = {
          longitude: Number(lng.toFixed(6)),
          latitude: Number(lat.toFixed(6)),
          altitude: Number(alt.toFixed(2)),
          type: "MOUSE_MOVE",
        };
        window.addMouseEvents(coordinate);
      }
    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  },
        // 将经纬度坐标转换为笛卡尔坐标系
        const cartesian3 = Cesium.Cartesian3.fromDegrees(
            longitude,
            latitude,
            height,
            cgcs2000
        );
        // 将笛卡尔坐标系转换为Moon2000坐标系
        const moonCartesian3 = Cesium.Transforms.eastNorthUpToFixedFrame(
            cartesian3,
            cgcs2000,
            moon2000
        );
        // 输出转换后的经纬度坐标和高度
        console.log(moonCartesian3);
        // 将Moon2000坐标系的笛卡尔坐标转换为经纬度坐标
        const moonPosition = Cesium.Cartographic.fromCartesian(moonCartesian3);
        // 输出转换后的经纬度坐标和高度
        console.log(moonPosition);
    },
  //CGCS2000转月球坐标---待验证
  Cjcs2000ToMoon() {
    // 定义待转换的经纬度坐标和高度
    const longitude = 110.5;
    const latitude = 34.5;
    const height = 0;
    // 定义CGCS2000坐标系
    const cgcs2000 = new Cesium.Ellipsoid(
      6378137.0,
      6378137.0,
      6356752.3142451793
    );
    // 定义Moon2000坐标系
    const moon2000 = new Cesium.Ellipsoid(1737400.0, 1737400.0, 1737400.0);
    // 将经纬度坐标转换为笛卡尔坐标系
    const cartesian3 = Cesium.Cartesian3.fromDegrees(
      longitude,
      latitude,
      height,
      cgcs2000
    );
    // 将笛卡尔坐标系转换为Moon2000坐标系
    const moonCartesian3 = Cesium.Transforms.eastNorthUpToFixedFrame(
      cartesian3,
      cgcs2000,
      moon2000
    );
    // 输出转换后的经纬度坐标和高度
    console.log(moonCartesian3);
    // 将Moon2000坐标系的笛卡尔坐标转换为经纬度坐标
    const moonPosition = Cesium.Cartographic.fromCartesian(moonCartesian3);
    // 输出转换后的经纬度坐标和高度
    console.log(moonPosition);
  },
};
export default InitMap;
export default InitMap;