From e9d104b53f73b06c22450da358ce7caca3c05839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?hagjoon=28=EC=9D=B4=ED=95=99=EC=A4=80=29?= Date: Mon, 15 May 2023 20:15:03 +0900 Subject: [PATCH] =?UTF-8?q?pav-utils=20=EA=B3=B5=EC=8B=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/pav-utils.js | 207 ++++++++++++++++++++++++---------------------- 1 file changed, 108 insertions(+), 99 deletions(-) diff --git a/test/pav-utils.js b/test/pav-utils.js index 78bb675..c7d10aa 100644 --- a/test/pav-utils.js +++ b/test/pav-utils.js @@ -1,117 +1,126 @@ // degree -> radian 변환 -const deg2rad = (deg) => { - return deg * (Math.PI / 180); -} -const rad2deg = (rad) => { - return rad * (180 / Math.PI); -} +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 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) + // 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); + 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 { - x += Math.cos(rad) * currentDist; - y += Math.sin(rad) * currentDist; - } - r.push([x, y]) + 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(coord2) - return r; -} + 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} + 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.5210, 126.6082]; - // const coord2 = [37.5210, 126.6057]; // x 절편 - const coord2 = [37.5200, 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) - } -} + 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}) - -} + 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();