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();
|