Kakao 위도 경도 & 좌표 거리계산

김성인·2023년 7월 31일
0

🍃 SpringBoot

목록 보기
7/18
post-thumbnail

가장 많이 참고한 블로그:
https://wildeveloperetrain.tistory.com/171

카카오 개발자 문서 (로컬 REST API)
https://developers.kakao.com/docs/latest/ko/local/dev-guide#address-coord


기능정의

  1. 주소를 통해서 좌표를 반환하기
  2. 좌표를 통해서 주소를 반환하기
    좌표 : [경도 langtitude, 위도 latitude]

API 권한 키파일

.gitignore 처리하였음.


API 응답 형태

json으로 파싱하지 않고 응답받을 클래스를 정의해버렸습니다..

1. 주소 검색하기

https://developers.kakao.com/docs/latest/ko/local/dev-guide#address-coord-response

2. 좌표로 주소 변환하기

https://developers.kakao.com/docs/latest/ko/local/dev-guide#coord-to-address-request


1.주소를 통해서 좌표 반환

/v2/local/search/address.${FORMAT}

    public ResponseEntity<LocationInfoRes>  kakaoLocalAPI(String query){
        String url = "https://dapi.kakao.com/v2/local/search/address.json?query=" + query;
        RestTemplate restTemplate = new RestTemplate();
        //HTTPHeader를 설정해줘야 하기때문에 생성함
        HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization", "KakaoAK "+ KakaoSecret.kakaoRestAPIKey);
        headers.set("content-type", "application/json;charset=UTF-8");
        HttpEntity<?> entity = new HttpEntity<>(headers);
        return restTemplate.exchange(
                url,
                HttpMethod.GET,
                entity,
                LocationInfoRes.class
        );
    }

2. 좌표를 통해서 주소를 반환

/v2/local/geo/coord2address.${FORMAT}

    public ResponseEntity<LocationXYRes>  kakaoXYAPI(double x, double y){
        String url = "https://dapi.kakao.com/v2/local/geo/coord2address.json?"
                + "x=" + x
                + "&y=" + y
                + "&input_coord=WGS84";

        RestTemplate restTemplate = new RestTemplate();
        //HTTPHeader를 설정해줘야 하기때문에 생성함
        HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization", "KakaoAK "+ KakaoSecret.kakaoRestAPIKey);
        headers.set("content-type", "application/json;charset=UTF-8");
        HttpEntity<?> entity = new HttpEntity<>(headers);
        return restTemplate.exchange(
                url,
                HttpMethod.GET,
                entity,
                LocationXYRes.class
        );
    }
}

3. 테스트

    public AddressNames addrName(Double longitude, Double latitude) throws BaseException{
        ResponseEntity<LocationXYRes> apiResponse;
        try{
            apiResponse = locationValue.kakaoXYAPI(longitude, latitude);
        }catch (Exception e) {
            throw new BaseException(DATABASE_ERROR);
        }

        // 카카오 위치 API 응답 실패
        if (apiResponse.getStatusCode() != HttpStatus.OK){
            throw new BaseException(DATABASE_ERROR);
        }

        try{
            // 응답 값이 1이상이면 결과가 존재함
            LocationXYRes currentLoc = apiResponse.getBody();
            if (currentLoc.getDocuments().length == 0){
                throw new BaseException(DATABASE_ERROR);
            }

            if (currentLoc.getDocuments()[0] != null){
                String locAddress = currentLoc.getDocuments()[0].getAddress().getAddress_name();
                String roadAddress = currentLoc.getDocuments()[0].getRoad_address().getAddress_name();


                return new AddressNames(locAddress, roadAddress);
            }
            return new AddressNames("지도를 조금만 옮겨주세요", "좌표가 정확하지 않음.");
        }catch(NullPointerException ne){
            return new AddressNames("지도를 조금만 옮겨주세요", "좌표가 정확하지 않음.");
        }catch (Exception e){
            throw new BaseException(DATABASE_ERROR);
        }

    }


참고 블로그

[SpringBoot] Kakao REST API 검색어로 위도 경도 좌표 받아오기
https://velog.io/@clickyour/SpringBoot-Kakao-REST-API-%EA%B2%80%EC%83%89%EC%96%B4%EB%A1%9C-%EC%9C%84%EB%8F%84-%EA%B2%BD%EB%8F%84-%EC%A2%8C%ED%91%9C-%EB%B0%9B%EC%95%84%EC%98%A4%EA%B8%B0#%EB%B0%9C%EA%B8%89%EB%B0%9B%EC%9D%80-%ED%82%A4%EB%A1%9C-api-%ED%98%B8%EC%B6%9C%ED%95%98%EA%B8%B0

[Spring Boot] 주소에서 위/경도 가져오기 (with Geocoding API)
https://furang-note.tistory.com/19

구글검색
https://www.google.com/search?q=springboot+%EC%B9%B4%EC%B9%B4%EC%98%A4+%EC%9C%84%EB%8F%84+%EA%B2%BD%EB%8F%84+API&sxsrf=AB5stBj2z2K3h5YU_Dpu9s2Dobl5obqVtg%3A1690574546866&ei=0h7EZIK-NMGwoASYjqjgBw&ved=0ahUKEwiC79P6mLKAAxVBGIgKHRgHCnwQ4dUDCA8&uact=5&oq=springboot+%EC%B9%B4%EC%B9%B4%EC%98%A4+%EC%9C%84%EB%8F%84+%EA%B2%BD%EB%8F%84+API&gs_lp=Egxnd3Mtd2l6LXNlcnAaAhgDIiZzcHJpbmdib290IOy5tOy5tOyYpCDsnITrj4Qg6rK964-EIEFQSTIFEAAYogQyDhAAGPEEGIkFGKIEGIsDMggQABiiBBiLA0ihD1CPBlixDnABeACQAQCYAYgBoAGmCqoBBDAuMTG4AQPIAQD4AQHCAgoQABhHGNYEGLAD4gMEGAAgQYgGAZAGCg&sclient=gws-wiz-serp

카카오맵 API
https://well-made-codestory.tistory.com/36

GEOCODING
https://developers.google.com/maps/documentation/geocoding/requests-geocoding?hl=ko#geocoding-lookup

역 지오코딩

https://developers.google.com/maps/documentation/geocoding/requests-reverse-geocoding?hl=ko#required_parameters

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

공감하며 읽었습니다. 좋은 글 감사드립니다.

답글 달기