|
|
|
// degree -> radian 변환
|
|
|
|
const deg2rad = deg => {
|
|
|
|
return deg * (Math.PI / 180);
|
|
|
|
};
|
|
|
|
const rad2deg = rad => {
|
|
|
|
return rad * (180 / Math.PI);
|
|
|
|
};
|
|
|
|
// 좌표간 거리계산
|
|
|
|
const getDistanceFromCoordByMeter = (coord1, coord2) => {
|
|
|
|
const R = 6371; // Radius of the earth in km
|
|
|
|
const dLat = deg2rad(coord2[0] - coord1[0]); // deg2rad below
|
|
|
|
const dLon = deg2rad(coord2[1] - coord1[1]);
|
|
|
|
const a =
|
|
|
|
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
|
|
|
Math.cos(deg2rad(coord1[0])) *
|
|
|
|
Math.cos(deg2rad(coord2[0])) *
|
|
|
|
Math.sin(dLon / 2) *
|
|
|
|
Math.sin(dLon / 2);
|
|
|
|
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
|
|
// var d = R * c; // Distance in km
|
|
|
|
const d = R * c * 1000; // Distance in m
|
|
|
|
return d;
|
|
|
|
};
|
|
|
|
// 두 좌표사이 특정 거리만큼의 좌표 추출
|
|
|
|
const getCoordsFormBetweenCoord = (coord1, coord2, dist) => {
|
|
|
|
// console.log('init ===> ', {coord1, coord2, dist})
|
|
|
|
const r = [];
|
|
|
|
// 처음 좌표
|
|
|
|
r.push(coord1);
|
|
|
|
// 중간 좌표
|
|
|
|
const totalDist = getDistanceFromCoordByMeter(coord1, coord2);
|
|
|
|
const dx = coord2[0] - coord1[0];
|
|
|
|
const singX = dx < 0 ? -1 : 1;
|
|
|
|
const dy = coord2[1] - coord1[1];
|
|
|
|
const singY = dy < 0 ? -1 : 1;
|
|
|
|
const m = dy / dx;
|
|
|
|
const rad = Math.atan(m);
|
|
|
|
|
|
|
|
const currentTotalDist = Math.sqrt(dx ** 2 + dy ** 2);
|
|
|
|
const currentDivDist = (dist * currentTotalDist) / totalDist;
|
|
|
|
const div = Math.floor(currentTotalDist / currentDivDist);
|
|
|
|
|
|
|
|
for (let i = 1; i <= div; i++) {
|
|
|
|
const currentDist = currentDivDist * i;
|
|
|
|
let x = coord1[0];
|
|
|
|
let y = coord1[1];
|
|
|
|
// var heading = Math.atan2(dy, dx) * 180 / Math.PI;
|
|
|
|
// if (heading < 0) {
|
|
|
|
// heading += 360;
|
|
|
|
// }
|
|
|
|
if (dx === 0) {
|
|
|
|
y += currentDist * singY;
|
|
|
|
} else if (dy === 0) {
|
|
|
|
x += currentDist * singX;
|
|
|
|
} else {
|
|
|
|
const angle = Math.atan2(dy, dx);
|
|
|
|
x += Math.cos(angle) * currentDist;
|
|
|
|
y += Math.sin(angle) * currentDist;
|
|
|
|
}
|
|
|
|
const heading = calculateHeading(
|
|
|
|
r[r.length - 1][0],
|
|
|
|
r[r.length - 1][1],
|
|
|
|
x,
|
|
|
|
y
|
|
|
|
);
|
|
|
|
r.push([x, y, heading]);
|
|
|
|
}
|
|
|
|
// 마지막 좌표
|
|
|
|
r.push(coord2);
|
|
|
|
return r;
|
|
|
|
};
|
|
|
|
|
|
|
|
function calculateHeading(x1, y1, x2, y2) {
|
|
|
|
var dx = x2 - x1;
|
|
|
|
var dy = y2 - y1;
|
|
|
|
var heading = (Math.atan2(dy, dx) * 180) / Math.PI;
|
|
|
|
|
|
|
|
// Ensure heading is within the range [0, 360)
|
|
|
|
heading = (heading + 360) % 360;
|
|
|
|
|
|
|
|
return heading;
|
|
|
|
}
|
|
|
|
|
|
|
|
const dumyData = {
|
|
|
|
authKey: '1cc2e08e-0c5c-43b2-8d4d-cddd3de558e3',
|
|
|
|
terminalId: 'SANDBOX-01',
|
|
|
|
command: 'SANDBOX',
|
|
|
|
body: [
|
|
|
|
{
|
|
|
|
objectId: 'JAL497',
|
|
|
|
lat: 37.52097,
|
|
|
|
lon: 126.6146,
|
|
|
|
elevType: 'M',
|
|
|
|
elev: 125.4,
|
|
|
|
speedType: 'm/s',
|
|
|
|
speed: 40.5,
|
|
|
|
heading: 0,
|
|
|
|
terminalRcvDt: '20210629173145',
|
|
|
|
betteryLevel: 91,
|
|
|
|
betteryVoltage: 50,
|
|
|
|
dronStatus: 'TAKEOFF',
|
|
|
|
moveDistance: 120,
|
|
|
|
moveDistanceType: 'M',
|
|
|
|
sensorCo: 100.11,
|
|
|
|
sensorSo2: 200.22,
|
|
|
|
sensorNo2: 300.33,
|
|
|
|
sensorO3: 400.44,
|
|
|
|
sensorDust: 500.55
|
|
|
|
}
|
|
|
|
]
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
getDistanceFromCoordByMeter,
|
|
|
|
deg2rad,
|
|
|
|
getCoordsFormBetweenCoord,
|
|
|
|
dumyData
|
|
|
|
};
|
|
|
|
|
|
|
|
const test = () => {
|
|
|
|
const coord1 = [37.521, 126.6082];
|
|
|
|
// const coord2 = [37.5210, 126.6057]; // x 절편
|
|
|
|
const coord2 = [37.52, 126.6082]; // y 절편
|
|
|
|
// const coord2 = [37.5220, 126.6057]; // 일반
|
|
|
|
const r = getCoordsFormBetweenCoord(coord1, coord2, 10);
|
|
|
|
console.log(r);
|
|
|
|
for (let i = 1; i < r.length; i++) {
|
|
|
|
const dist = getDistanceFromCoordByMeter(r[i - 1], r[i]);
|
|
|
|
console.log(dist);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// test();
|
|
|
|
|
|
|
|
const test2 = () => {
|
|
|
|
let m = 10.5 / 14;
|
|
|
|
console.log(3 / 4, 13.5 / 18, (13.5 - 3) / (18 - 4));
|
|
|
|
let rad = Math.atan(m);
|
|
|
|
let tan = Math.tan(rad);
|
|
|
|
let cos = Math.cos(rad);
|
|
|
|
let sin = Math.sin(rad);
|
|
|
|
console.log({ rad, tan, cos, sin });
|
|
|
|
let x = Math.cos(rad) * 15;
|
|
|
|
let y = Math.sin(rad) * 15;
|
|
|
|
console.log({ x, y });
|
|
|
|
};
|
|
|
|
// test2();
|