스프링

위도 경도로 주변 반경 게시물 찾기 함수

컴공코딩러 2024. 5. 31. 13:12
    // km 기준
    private Double getDistance(Double lat, Double lnt, Double lat2, Double lnt2) {
        double theta = lnt - lnt2;
        double dist = Math.sin(deg2rad(lat))* Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat))*Math.cos(deg2rad(lat2))*Math.cos(deg2rad(theta));
        dist = Math.acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60*1.1515*1609.344;

        return dist / 1000;
    }

    //10진수를 radian(라디안)으로 변환
    private static double deg2rad(double deg){
        return (deg * Math.PI/180.0);
    }
    //radian(라디안)을 10진수로 변환
    private static double rad2deg(double rad){
        return (rad * 180 / Math.PI);
    }

 

내 프로젝트에 적용한 함수이다. 위도 경도 차이로 두 값의 거리를 나타내는 함수.

 

    @Operation(summary = "주변 게시물 찾기 API")
    @GetMapping("/find-near-post/{lat}/{lng}/{tags}")
    public Slice<PostsDto> getBoardListFromUserSearch(@PageableDefault(size = 6,sort = "createdDate",direction = Sort.Direction.DESC) @Parameter(hidden = true) Pageable pageable
    , @PathVariable Double lat, @PathVariable Double lng, @PathVariable String tags) {
        List<UserPost> userPostData= userPostService.getUserPostList();
        List<UserPost> userPostList = new ArrayList<>();
        Long tags_num=convertTags(tags);
        for (int i=0;i<userPostData.size();i++){
            if (getDistance(lat,lng,userPostData.get(i).getLat(),userPostData.get(i).getLng())<=5
                    && ((tags_num&userPostData.get(i).getTagsNum()))==tags_num){
                userPostList.add(userPostData.get(i));
            }
        }
        return getUserPostsDto(pageable,userPostList);
    }

 

나는 이런식으로 주변게시물 찾기 함수로 거리와 태그를 같이 적용하여 찾을수 있는 함수를 만들었다.

 

 

참고

https://se-jung-h.tistory.com/entry/%EC%9E%90%EB%B0%94intelij-%EC%A2%8C%ED%91%9C%EC%9C%84%EB%8F%84%EA%B2%BD%EB%8F%84%EB%A1%9C-%EC%8B%A4%EC%A0%9C-%EA%B1%B0%EB%A6%AC-%EA%B5%AC%ED%95%98%EA%B8%B0