// 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);
}
나는 이런식으로 주변게시물 찾기 함수로 거리와 태그를 같이 적용하여 찾을수 있는 함수를 만들었다.
참고