TIL 65일차 - haversine를 이용해서 거리 계산 구현

박찬웅·2023년 4월 11일
0

항해99

목록 보기
70/105

23년 4월 11일

시도 한 것, 알게 된 점

어제 사진 구현은 서로 겨우 마무리 되고, 오늘은 현재 위치에서 해당 반경 내에 맛집이 있으면 그 맛집만 조회 할 수 있는 API를 구현했다.
여기서 사용한 라이브러리는 팀원 한분이 발견해 주셔서 다음과 같은 haversine 라이브러리를 이용해서 어떤 원리인지 알게 되었고 예시는 다음과 같이 하면 되었다.

const haversine = require('haversine');

const lyon = { latitude: 45.7597, longitude: 4.8422 };
const paris = { latitude: 48.8567, longitude: 2.3508 };

const distance = haversine(lyon, paris, { unit: 'km' });

console.log(distance.toFixed(2) + " km");

해당 예시문은 lyon과 paris의 경도, 위도를 나타냈고, haversine라이브러리에서 제공하는 distance 함수를 사용해서 두 지역을 찍고, unit은 거리단위인 km(킬로미터)를 적용한 방식이다.
이걸 콘솔로그로 찍으면 두지역의 거리가 출력되는 로직이였다.
그래서 우리는 x, y, range 를 프론트에서 각각 경도, 위도, 그리고 반경 거리를 나타내는 것을 body로 보내준다고 가정하고 다음과 같은 알고리즘을 몇시간 고민하면서 짜고 겨우 구현을 성공하였였다.

const haversine = require('haversine');
...
// 1. 유저 현 위치 좌표(x, y)와 반경 거리 안에 있는 range를 프론트에서 받아와서 request body로 받는다.
        const { x, y, range } = req.body;
...
let result = [];
            // 2. for문을 만든다 , 반복횟수 : 전체가게 갯수
            for (let i = 0; i < shops.length; i++) {
                // 3. 가게 하나 현 위치 좌표인 shop 테이블의 x, y 값을 가져온다.
                const userLocate = { latitude: x, longitude: y };
                // 4. 유저 현 위치 좌표(x, y)와 가게 현위치 좌표(x, y)를 참고해서 계산을 한다.
                const shopLocate = { latitude: shops[i].x, longitude: shops[i].y };
                const distance = haversine(userLocate, shopLocate, { unit: 'meter' }); // meter가 미터를 뜻함
                console.log(distance.toFixed(2) + " m");
                // 5. 그 계산한 값이 if문을 사용해서 range(예시에는 500) 값보다 작는 조건문을 쓴다. => 3번의 자료를 저장한다
                if (distance <= range) {
                    result.push(shops[i]); // 6. 조건에 맞는 가게 정보를 push함수를 사용해서 result 배열에 추가한다
                } // 7. for문이 끝난다
            }
            // 8. 그 조건에 맞는 가게들만 API 명세서에 있는 대로 모두 다 출력해서 해당 조건에 맞는 가게 정보의 모든 조회를 도출 한다
            res.status(200).json({ shops : result }) 
{
    "x": 1.0004,
    "y": 1.0004,
    "range" : 500
}

이렇게 팀원 한분이 haversine 라이브러리를 설명해 주었고, 그걸 통해 해당 반경 내에만 조회되게 구현을 하는데 마무리 하였다. 팀원 한분의 라이브러리를 설명 해 주셨고, 그걸 어떻게 로직을 짜야할지 상당히 힘들었는데 간만에 스스로 구현을 해냈다는 것에 뿌듯했던 하루였다.

앞으로 할 일

오늘 특별히 기술매니저님이 순회를 해 주셔서 json 파일에 거의 3천개가 넘는 맛집을 db에 저장하는 방법을 제시를 하였고, 내일 3천개가 넘는 데이터를 넣는 작업을 해볼 계획이다. 그리고 오늘 회의로 기능들이 변경되어서 API 명세서랑 데이터베이스와 ERD 수정을 해야 할 것으로 예상된다.

profile
향해 13기 node.js 백앤드

0개의 댓글