프로젝트 정리/애완동물 종합 솔루션(CatDogForest)

Kakao Map API with 애완동물병원 #5

이전글

2023.03.15 - [프로젝트 정리/애완동물 종합 솔루션(CatDogForest)] - Kakao Map API with 애완동물병원#4

 

@SpringBootTest
@Slf4j
public class KakaoMapTest {

    @Autowired
    GoverMentService goverMentService;

    @Test
    @DisplayName("return location input lat, lon")
    public void getLocationTest() throws Exception {
        Double x = 190562.90915523;
        Double y = 189333.017062573;
        /*
        String url = "https://dapi.kakao.com/v2/local/geo/coord2regioncode.json";
        double x = 126.9863309;
        double y = 37.563398;
        */
        RestTemplate restTemplate = new RestTemplate();
        String url = "https://dapi.kakao.com/v2/local/geo/coord2regioncode.json";
        UriComponents uri = UriComponentsBuilder.newInstance()
                .fromHttpUrl(url)
                .queryParam("x",x)
                .queryParam("y",y)
                .queryParam("input_coord","TM")
                .build();

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Authorization", String.format("KakaoAK APP_KEY"));

        // when
        HttpEntity requestMessage = new HttpEntity(httpHeaders);
        ResponseEntity response = restTemplate.exchange(
                uri.toUriString(),
                HttpMethod.GET,
                requestMessage,
                String.class);
        // then
        // 해당 JObject와 Response 객체간의 매핑
        Gson gson = new Gson();
        KaKaoMapResponse mapped_data = gson.fromJson(response.getBody().toString(),KaKaoMapResponse.class);
        String firstName = mapped_data.documents.get(0).address_name;
        String secondName = mapped_data.documents.get(1).address_name;
        String target = mapped_data.documents.get(0).region_type;
        System.out.println(firstName);
        System.out.println(secondName);
        System.out.println(target);
        assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
    }


    @Test
    @DisplayName("bring goverment data")
    public void govermentDBTest() {
        // goverMentService.getAll();
        Assert.assertNotNull(goverMentService.getAll());
        List<GovermentDTO> all = goverMentService.getAll();

        IntStream.rangeClosed(1, 10).forEach(count ->{
            System.out.println("longitude : " + all.get(count).getLongitude() + " latitude : "+ all.get(count).getLatitude());
        });
    }

    @Test
    @Transactional
    @DisplayName("convert goverment data to kakao location")
    public void convertDBTest() {

        RestTemplate restTemplate = new RestTemplate();
        String url = "https://dapi.kakao.com/v2/local/geo/coord2regioncode.json";

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Authorization", String.format("KakaoAK APP_KEY"));

        List<GovermentDTO> all = goverMentService.getAll();
        int bCnt = 0;
        int hCnt = 0;
        for(int idx = 0; idx < all.size(); idx++){
            Double x = all.get(idx).getLongitude();
            Double y = all.get(idx).getLatitude();

            UriComponents uri = UriComponentsBuilder.newInstance()
                    .fromHttpUrl(url)
                    .queryParam("x",x)
                    .queryParam("y",y)
                    .queryParam("input_coord","TM")
                    .build();

            // when
            HttpEntity requestMessage = new HttpEntity(httpHeaders);
            ResponseEntity response = restTemplate.exchange(
                    uri.toUriString(),
                    HttpMethod.GET,
                    requestMessage,
                    String.class);

            // then
            // 해당 JObject와 Response 객체간의 매핑
            Gson gson = new Gson();
            KaKaoMapResponse mapped_data = gson.fromJson(response.getBody().toString(),KaKaoMapResponse.class);
            String firstName = mapped_data.documents.get(0).address_name;
            String secondName = mapped_data.documents.get(1).address_name;
            String target = mapped_data.documents.get(0).region_type;


            if (mapped_data.documents.get(0).region_type.equals("H")) {
                hCnt++;
            } else {
                bCnt++;
            }
            if(mapped_data.documents.get(1).region_type.equals("H")){
                hCnt++;
            }else {
                bCnt++;
            }
            assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
        }
        log.info("bCnt : "+bCnt);
        log.info("hCnt : "+hCnt);
    }
}

카카오의 coord2regioncode api를 활용 EPSG:2097 지도 데이터를 WGS84 형식으로 바꾸고 지역정보를 가져오는 테스트와

공공데이터를 가져오는 테스트 가져온 공공데이터를 모두 변환하는 테스트를 만들었다.

 

이제 해야하는 일은 변환한 데이터를 DB에 넣고 병원 URL로 이동시

REST API 형식으로 변환시킨 모든 데이터를 가져와 marker 배열에 넣고 클러스터로 출력하는것

 

그리고 geolocation으로 현재 좌표를 특정하고 현재 좌표와 지도 크기를 대조하여 지도의 모서리 값 안에 위치한 마커들을 리스트로 표시하는것 (max 5 items)

그리고 가장 가까운 위치 기준순으로 정렬하는 것

 

그리고 마커 클릭시 자세한 정보를 보여주는 페이지를 만드는 일이 남았다.

 

클러스터의 텍스트를 마커의 region_depth 값을 가지고 setText() 함수를 사용해 바꿔줘야 하는데 관련 예제를 찾아보고 있다.