修改显示

main
suixy 2 months ago
parent edfb22d2e7
commit 6e436ebfe5

@ -835,6 +835,83 @@ function getXYDistanceFromMin(current, minPoint) {
return {xDistance, yDistance};
}
const DEG_TO_RAD = Math.PI / 180;
function lonLatToXY(lon, lat, lat0) {
const R = 111320; // 111.32 km
const cosLat = Math.cos(lat0 * DEG_TO_RAD);
return {x: lon * R * cosLat, y: lat * R};
}
function calcRectangleFromPoints(points) {
if (!points || points.length !== 4) throw new Error("必须传入4个点");
// points name = "1","2","3","4"
const p1raw = points.find(p => p.name === "点位1") || points[0];
const p2raw = points.find(p => p.name === "点位2") || points[1];
const p3raw = points.find(p => p.name === "点位3") || points[2];
const p4raw = points.find(p => p.name === "点位4") || points[3];
const lat0 = (points.reduce((s, p) => s + p.lat, 0) / points.length);
const p1 = lonLatToXY(p1raw.lon, p1raw.lat, lat0);
const p2 = lonLatToXY(p2raw.lon, p2raw.lat, lat0);
const p3 = lonLatToXY(p3raw.lon, p3raw.lat, lat0);
const p4 = lonLatToXY(p4raw.lon, p4raw.lat, lat0);
const dist = (a, b) => Math.hypot(a.x - b.x, a.y - b.y);
const top = dist(p2, p3); // (2->3)
const bottom = dist(p4, p1); // (4->1)
const left = dist(p4, p3); // (4->3)
const right = dist(p1, p2); // (1->2)
//
const trapezoid = Math.abs(top - bottom) / Math.max(top, bottom) > 0.05;
const width = trapezoid ? (top + bottom) / 2 : bottom; //
const height = trapezoid ? (left + right) / 2 : right; //
// **** p4 -> p1
// atan2 +X
const bottomAngleRad = Math.atan2(p1.y - p4.y, p1.x - p4.x);
const angleDeg = bottomAngleRad * 180 / Math.PI; //
return {
width: Number(width.toFixed(2)),
height: Number(height.toFixed(2)),
angle: Number(angleDeg.toFixed(6)) // >180
};
}
function getLocalPositionRelativeToP4(point, rectPoints, rectInfo) {
// rectInfo.angle calcRectangleFromPoints p4->p1
if (!rectInfo || typeof rectInfo.angle !== 'number') {
throw new Error("rectInfo.angle 必须是由 calcRectangleFromPoints 得到的角度");
}
const lat0 = rectPoints.reduce((a, b) => a + b.lat, 0) / rectPoints.length;
const p4raw = rectPoints.find(p => p.name === "点位4") || rectPoints[3];
const p4 = lonLatToXY(p4raw.lon, p4raw.lat, lat0);
const p = lonLatToXY(point.lon, point.lat, lat0);
// p4
const dx = p.x - p4.x;
const dy = p.y - p4.y;
// X -angle
const rad = -rectInfo.angle * DEG_TO_RAD;
const x_local = dx * Math.cos(rad) - dy * Math.sin(rad);
const y_local = dx * Math.sin(rad) + dy * Math.cos(rad);
//
const rotate_local = ((point.rotate ?? 0) - rectInfo.angle + 360) % 360;
return {
x: Number(x_local.toFixed(2)),
y: Number(y_local.toFixed(2)),
rotate: Number(rotate_local.toFixed(2))
};
}
const processData = (data) => {
// console.log('data',data.ty)
// console.log('FodName', data.FodName)
@ -855,12 +932,15 @@ const processData = (data) => {
lat: data.Latitude,
}
// boxPos.value = location
let res = getLocalPosition_Point1AsCenter({
const rectInfo = calcRectangleFromPoints(areaPoints.value);
const point = {
lon: data.Longitude,
lat: data.Latitude,
rotate: data.HeadingAngle
}, areaPoints.value, areaData.value)
console.log(res)
};
const local = getLocalPositionRelativeToP4(point, areaPoints.value, rectInfo);
console.log(local)
}
};

Loading…
Cancel
Save