본문 바로가기
개발/안드로이드

[안드로이드] 네이버 길찾기 api 파싱해서 구글맵 폴리라인 찍기

by 핸디(Handy) 2020. 5. 11.

단계는 크게 2가지입니다
1. 네이버에 출발지, 목적지 값을 넣고 api 요청한다
2. 값을 받아와서 파싱한후 구글맵에 찍는다 입니다.

그럼 설명 시작하겠습니다.

최종 결과

 

네이버 플랫폼의 설명을 잘 따라하셨다면 다음과 같은 결과를 얻을 수 있습니다. (postman 으로 테스트)
Respond 객체를 보시면 아시다시피 매우 복잡합니다. 파싱하기 어렵습니다만 차근차근해보겠습니다. 

응답을 response로 받고 result에 문자열로 넣어줍니다. 
root JSONObject 를 받들고 전체를 받아와줍니다.
    root = {"code" : 0, ...} 형태
그 다음에 root 안의 route를 객체로 또 받아와 줍니다.
   route = {"route" : {..... }, .... } 형태
그러한 방식으로 계속 파싱해옵니다. 쭉쭉쭉

{ } -> JSONObject
[ ] -> JSONArray 
이것만 기억하시면 됩니다. 직접 해보시면서 로그 찍어보시길 추천드립니다.

아래의 코드는 api 요청하기 위해 AsyncTask 를 이용한 클래스입니다. 보시면 onPostExecute 안에 출발지로 이동하는 코드와 폴리라인을 그리는 코드가 있습니다.

여기서 naverRouteList는 LatLng을 값을 가지는 ArrayList 입니다.

 class NaverRouteAPI extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(naverRouteList.get(0), 15));

            for ( int i = 0 ; i < naverRouteList.size()-1; i++){
                Polyline polyline = mMap.addPolyline(new PolylineOptions()
                        .add(naverRouteList.get(i), naverRouteList.get(i+1))
                        .width(5)
                        .color(Color.RED));
            }
        }
        @Override
        protected String doInBackground(String... strings) {
            Log.d("Task3", "Deer");
            String temp = "Not Gained";
            try {
                temp = GET("");
                return temp;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return temp;
        }

        private String GET(String x) throws IOException {
            String data2 = "";
            
            // 요청 url 출발지 -> 도착지
            String naver_url = "https://naveropenapi.apigw.ntruss.com/map-direction/v1/driving?start=127.110413,37.364960,&goal=127.125632,37.411722";
            String myUrl = String.format(naver_url, x);


            try {
                URL url = new URL(myUrl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(10000);
                conn.setConnectTimeout(15000);
                conn.setRequestMethod("GET");
                //네이버 플랫폼에서 발급받은 키
                conn.setRequestProperty("X-NCP-APIGW-API-KEY-ID", "------");
                conn.setRequestProperty("X-NCP-APIGW-API-KEY", "---------");
                conn.setDoInput(true);
                conn.connect();

                String line;
                String result = "";
                InputStream inputStream = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                StringBuffer response = new StringBuffer();

                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }

                result = response.toString();
                JSONObject root = new JSONObject(result);
                JSONObject route = root.getJSONObject("route");
                JSONObject traoptimal = (JSONObject) route.getJSONArray("traoptimal").get(0);
                JSONObject summary = traoptimal.getJSONObject("summary");
                JSONArray path = traoptimal.getJSONArray("path");

                naverDistance = summary.getInt("distance");
                naverDepartureTime = summary.getString("departureTime");
                naverTollFare = summary.getInt("tollFare");
                naverTaxiFare = summary.getInt("taxiFare");
                naverFuelPriace = summary.getInt("fuelPrice");
                
                if(naverRouteList != null) naverRouteList.clear();
                for (int i = 0 ; i < path.length() ; i++){
                    JSONArray pathIndex = (JSONArray) path.get(i);
                    naverRouteList.add(new LatLng(pathIndex.getDouble(1),pathIndex.getDouble(0)));
                }
                
            } catch (NullPointerException | JSONException e) {
                e.printStackTrace();

            }
            return data2;
        }
    }

추가적으로 네이버의 경우 Lati, long 이 아닌 long, lati 형식으로 값을 주니 앞 뒤 순서를 바꿔서 넣어주셔야 제대로 동작합니다.

댓글