jihongshun
10 小时以前 307db148645230afc780a3d5d16ffb97aa32c189
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
const modelUrl = 'http://192.168.1.21:9999/powerTower.glb'; // GLB模型路径
const pois = [125.1541, 46.5542, 236]; //glb模型原点坐标
const distance = 100; // 沿原点坐标和地面点坐标方向上选取空中点的距离
//初始化相机窗口视角参数
let cameraPostion = viewerM.camera.position;
let cameraHeading = viewerM.camera.heading;
let cameraPitch = viewerM.camera.pitch;
let cameraRoll = viewerM.camera.roll;
 
// 设置视角,使其默认查看某个地理位置
viewerM.scene.camera.setView({
  destination: Cesium.Cartesian3.fromDegrees(125.1511, 46.5542, 349.0), // 以经纬度设置位置(例如:大庆龙兴路)
  orientation: {
    heading: Cesium.Math.toRadians(86.94), // 方向
    pitch: Cesium.Math.toRadians(-30.22), // 俯角
    roll: 0
  }
});
 
//创建模型
const glbModelPoi = Cesium.Cartesian3.fromDegrees(pois[0], pois[1], pois[2]);
const heading = Cesium.Math.toRadians(10);
const pitch = Cesium.Math.toRadians(0);
const roll = Cesium.Math.toRadians(0);
const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
const orientations = Cesium.Transforms.headingPitchRollQuaternion(glbModelPoi, hpr);
creatModel(glbModelPoi, orientations, modelUrl, viewerM);
creatModel(glbModelPoi, orientations, modelUrl, viewerC);
 
// 同步函数:鹰眼地图同步主地图的视角
const syncViewer = () => {
  viewerC.camera.flyTo({
    destination: viewerM.camera.position,
    orientation: {
      heading: viewerM.camera.heading,
      pitch: viewerM.camera.pitch,
      roll: cameraRoll
    },
    duration: 0.0 // 设置为 0.0 以立即完成同步
  });
};
// 监听主地图的视图更新事件,在主地图更新时同步鹰眼地图
viewerM.scene.preRender.addEventListener(syncViewer);
//创建地面点
//初始化变量
let counter = 0;
function addGroundPoi() {
  let createPinHandler = new Cesium.ScreenSpaceEventHandler(viewerM.canvas);
  createPinHandler.setInputAction(function (click) {
    let cartesian = viewerM.scene.pickPosition(click.position);
    if (Cesium.defined(cartesian)) {
      let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
      let height = cartographic.height; //模型高度
      if (Number(height) < 0) {
        let ray = viewerM.camera.getPickRay(click.position);
        cartesian = viewerM.scene.globe.pick(ray, viewerM.scene);
      }
      cartographic = Cesium.Cartographic.fromCartesian(cartesian);
      let lng = Cesium.Math.toDegrees(cartographic.longitude);
      let lat = Cesium.Math.toDegrees(cartographic.latitude);
      height = cartographic.height;
      camPosition = lng + ',' + lat + ',' + height;
    }
 
    //在两个窗口创建标注
    creatPin('groundPoiId' + counter, cartesian.clone(), '观', Cesium.Color.BLUE, viewerM);
    creatPin('groundPoiId' + counter, cartesian.clone(), '观', Cesium.Color.BLUE, viewerC);
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
 
  // 右键点击结束监听,并创建空中点
  createPinHandler.setInputAction(function (click) {
    // 获取实体
    const groupEntity = viewerM.entities.getById('groundPoiId' + counter);
    const groupPosition = groupEntity.position.getValue(Cesium.JulianDate.now());
    if (groupPosition) {
      // 如果位置存在,将其转换为经纬度
      const cartographic = Cesium.Cartographic.fromCartesian(groupPosition);
      const longitude = Cesium.Math.toDegrees(cartographic.longitude);
      const latitude = Cesium.Math.toDegrees(cartographic.latitude);
      const height = cartographic.height;
      //根据两点坐标计算方位角
      const positionA = Cesium.Cartesian3.fromDegrees(pois[0], pois[1], height);
      const positionB = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
      // 计算方向向量
      const direction = Cesium.Cartesian3.subtract(positionB, positionA, new Cesium.Cartesian3());
      /**计算沿方向向量移动的点**/
      const normalize = Cesium.Cartesian3.normalize(direction, new Cesium.Cartesian3());
      //根据偏移量求偏移向量
      const scalerNormalize = Cesium.Cartesian3.multiplyByScalar(
        normalize,
        distance,
        new Cesium.Cartesian3()
      );
      const tagert = Cesium.Cartesian3.add(positionB, scalerNormalize, new Cesium.Cartesian3());
      creatPin('aerialPoiId' + counter, tagert, '空', Cesium.Color.RED, viewerM);
      console.log(direction);
      console.log(normalize);
      console.log(azimuthtwopoi(longitude, latitude, pois[0], pois[1]));
 
      //结束右键监听
      createPinHandler.destroy();
      //结束主图联动鹰眼监听
      viewerM.scene.preRender.removeEventListener(syncViewer);
      //更新相机视角为空中点
      changeCamera(tagert, azimuthtwopoi(longitude, latitude, pois[0], pois[1]));
      counter += 1;
    }
    console.log('右键点击监听已停止');
  }, Cesium.ScreenSpaceEventType.RIGHT_CLICK); // 监听右键点击
}
 
function changeCamera(position, heading) {
  console.log(position);
  console.log(heading);
  viewerC.camera.flyTo({
    destination: position,
    orientation: {
      heading: Cesium.Math.toRadians(heading),
      pitch: 0,
      roll: 0
    },
    duration: 0.0 // 设置为 0.0 以立即完成同步
  });
}
 
//动态坐标
// move_measure_point();
//动态相机参数
cammove_measure_point();
//拾取坐标
// measure_point();