단계는 크게 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 형식으로 값을 주니 앞 뒤 순서를 바꿔서 넣어주셔야 제대로 동작합니다.
'개발 > 안드로이드' 카테고리의 다른 글
[안드로이드] 구글은 왜 DP(Density-independent Pixel) 만들었을가 (0) | 2020.05.21 |
---|---|
[안드로이드] 원하는 좌표를 구글맵 화면에 표시해보자(LatLngBounds) (0) | 2020.05.16 |
[안드로이드] timepickerdialog spinner 모드로 변경하는 법 (0) | 2020.03.23 |
[안드로이드] json 파싱시 값이 null 또는 데이터가 없을 때 | 버그리포트 (2) | 2020.03.16 |
[안드로이드] 공공데이터 (공적마스크_코로나) api 받아서 구글맵에 마커찍기 (2) | 2020.03.15 |
댓글