Browse Source

真方位,磁方位显示

wxp
ctw 2 months ago
parent
commit
8f48ade9bf
  1. 104
      ruoyi-ui/src/views/cesiumMap/index.vue

104
ruoyi-ui/src/views/cesiumMap/index.vue

@ -577,10 +577,15 @@ export default {
// 线
if (entityData && entityData.type === 'line') {
const length = this.calculateLineLength(entityData.positions)
//
const bearingType = entityData.bearingType || 'true';
const bearing = bearingType === 'magnetic'
? this.calculateMagneticBearing(entityData.positions)
: this.calculateTrueBearing(entityData.positions);
//
this.hoverTooltip = {
visible: true,
content: `长度:${length.toFixed(2)}`,
content: `长度:${length.toFixed(2)}\n${bearingType === 'magnetic' ? '磁方位' : '真方位'}${bearing.toFixed(2)}°`,
position: {
x: movement.endPosition.x + 10,
y: movement.endPosition.y - 10
@ -842,10 +847,12 @@ export default {
// 线
const tempPositions = [...this.drawingPoints, newPosition];
const length = this.calculateLineLength(tempPositions);
//
// bearingType
const bearing = this.calculateTrueBearing(tempPositions);
//
this.hoverTooltip = {
visible: true,
content: `长度:${length.toFixed(2)}`,
content: `长度:${length.toFixed(2)}\n真方位:${bearing.toFixed(2)}°`,
position: {
x: movement.endPosition.x + 10,
y: movement.endPosition.y - 10
@ -1959,7 +1966,8 @@ export default {
pointEntities: pointEntities, //
color: this.defaultStyles.line.color,
width: this.defaultStyles.line.width,
label: `线 ${this.entityCounter}`
label: `线 ${this.entityCounter}`,
bearingType: 'true' //
}
this.allEntities.push(entityData)
entity.clickHandler = (e) => {
@ -2089,6 +2097,94 @@ export default {
}
return totalLength
},
calculateTrueBearing(positions) {
if (!positions || positions.length < 2) {
return 0;
}
// 线
const startPos = positions[positions.length - 2];
const endPos = positions[positions.length - 1];
//
const startCartographic = Cesium.Cartographic.fromCartesian(startPos);
const endCartographic = Cesium.Cartographic.fromCartesian(endPos);
//
const startLat = startCartographic.latitude;
const startLng = startCartographic.longitude;
const endLat = endCartographic.latitude;
const endLng = endCartographic.longitude;
//
const dLng = endLng - startLng;
const y = Math.sin(dLng) * Math.cos(endLat);
const x = Math.cos(startLat) * Math.sin(endLat) - Math.sin(startLat) * Math.cos(endLat) * Math.cos(dLng);
let bearing = Math.atan2(y, x);
// 0-360
bearing = Cesium.Math.toDegrees(bearing);
return (bearing + 360) % 360;
},
//
calculateMagneticDeclination(lat, lng) {
//
// 使 WMM (World Magnetic Model)
//
const latDeg = Cesium.Math.toDegrees(lat);
const lngDeg = Cesium.Math.toDegrees(lng);
//
//
let declination;
if (lngDeg >= 73 && lngDeg <= 135 && latDeg >= 18 && latDeg <= 53) {
//
// 20200.1
const year = new Date().getFullYear();
const yearOffset = (year - 2020) * 0.1;
if (lngDeg < 100) {
// 西
declination = 2.0 - yearOffset;
} else if (lngDeg < 115) {
//
declination = 1.0 - yearOffset;
} else {
//
declination = 0.5 - yearOffset;
}
} else {
// 0
declination = 0;
}
return declination;
},
//
calculateMagneticBearing(positions) {
if (!positions || positions.length < 2) {
return 0;
}
//
const trueBearing = this.calculateTrueBearing(positions);
// 线
const startPos = positions[positions.length - 2];
const startCartographic = Cesium.Cartographic.fromCartesian(startPos);
const startLat = startCartographic.latitude;
const startLng = startCartographic.longitude;
//
const declination = this.calculateMagneticDeclination(startLat, startLng);
//
let magneticBearing = trueBearing + declination;
// 0-360
return (magneticBearing + 360) % 360;
},
calculatePolygonArea(positions) {
if (positions.length < 3) return 0
let area = 0

Loading…
Cancel
Save