// 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]; 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; } r.push([x, y]); } // 마지막 좌표 r.push(coord2); return r; }; 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: 'KM', speed: 145.8, heading: 227.94, 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();