티스토리 뷰

Android Tmap 경로 API

  • 프로젝트 진행중 걸은 거리를 추적해서 이동 경로를 지도상에 선 형태로 그려주는 기능을 구현하려고 했다. 
  • 처음에는 GPS 값만 가져와 Google Map에서 지원해주는 Polyline 형태로 그려주는 방법을 생각했었는데 실제 도로에 표시되지 않는 정확도가 떨어지는 경우가 많았다.
    • Polyline을 그리는 자세하 방법은 아래 포스트를 참고해주세요
 

(Android) Google Map 이동한 거리 선(polyline) 으로 그리기

Android Google Map Polyline Google Map 라이브러리를 사용하여 지도 관련 프로젝트를 진행하고 있습니다. GPS를 통해 걸음을 체크하는 서비스 걸음 시작 버튼을 누른 후부터 특정 주기로 GPS를 기록하여 이동한..

jinseongsoft.tistory.com

  • 방법을 알아보다 Tmap의 경로 API를 통해서 출발, 도착 Point를 가지고 도로에 Point들을 매핑 하도록 구현을 하기로 했다. 
    • Google Road API도 동일한 기능을 지원 하지만 한국에는 지원을 하지 않았음
 

Guide | T MAP API

 

tmapapi.sktelecom.com


구현 방법

  • 기본적인 코드 베이스는 아래 위치를 참고하였다.
 

15KauSoftwareKCG/kauSoftware

test. Contribute to 15KauSoftwareKCG/kauSoftware development by creating an account on GitHub.

github.com

기본적인 동작 방식

  • 우선 T API에 가입후 API를 발급 받아야 한다. (자세한 발급 방법은 검색을 참고하시면 됩니다)
  • 아래 코드의 BasicNameValuePair에는 API Argument로 출발지, 도착지, 좌표계 등을 넣어준 후 Http post로 요청을 날린다.
    • Point 값은 지점의 좌표값 이고 LineString은 경로의 좌표들을 나타내는 것 같아보임
  • 얻어진 좌표값을 LatLng ArrayList에 넣어주고 반환하면 그대로 지도상에 Polyline으로 그려준다.
    • 다른 데이터들을 활용하거나 T map 경로 API의 자세한 정보는 이곳에서 확인하실수 있습니다.

https://developers.skplanetx.com/apidoc/kor/t-map/course-guide/

불러오는 중입니다...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
public class RoadTracker {
    private static final String TAG = "RoadTracker";
    private GoogleMap mMap;
    private GeoApiContext mContext;
    private ArrayList<LatLng> mCapturedLocations = new ArrayList<LatLng>();        //지나간 좌표 들을 저장하는 List
    private static final int PAGINATION_OVERLAP = 5;
    private static final int PAGE_SIZE_LIMIT = 100;
    private ArrayList<com.google.android.gms.maps.model.LatLng> mapPoints;
 
    int totalDistance;
 
    public RoadTracker(GoogleMap map){
        mMap = map;
    }
 
    //    public void drawCorrentPath(ArrayList<LatLng> checkedLocations){
//        getJsonData().get();
//    }
 
    public ArrayList<com.google.android.gms.maps.model.LatLng> getJsonData(final LatLng startPoint, final LatLng endPoint){
        Thread thread = new Thread(){
            @Override
            public void run(){
                HttpClient httpClient = new DefaultHttpClient();
 
                String urlString = "https://apis.skplanetx.com/tmap/routes/pedestrian?version=1&format=json&appKey=본인의 API 키";
                try{
                    URI uri = new URI(urlString);
 
                    HttpPost httpPost = new HttpPost();
                    httpPost.setURI(uri);
 
                    List<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>();
                    nameValuePairs.add(new BasicNameValuePair("startX", Double.toString(startPoint.lng)));
                    nameValuePairs.add(new BasicNameValuePair("startY", Double.toString(startPoint.lat)));
 
                    nameValuePairs.add(new BasicNameValuePair("endX", Double.toString(endPoint.lng)));
                    nameValuePairs.add(new BasicNameValuePair("endY", Double.toString(endPoint.lat)));
 
                    nameValuePairs.add(new BasicNameValuePair("startName""출발지"));
                    nameValuePairs.add(new BasicNameValuePair("endName""도착지"));
 
                    nameValuePairs.add(new BasicNameValuePair("reqCoordType""WGS84GEO"));
                    nameValuePairs.add(new BasicNameValuePair("resCoordType""WGS84GEO"));
 
                    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
 
                    HttpResponse response = httpClient.execute(httpPost);
 
                    int code = response.getStatusLine().getStatusCode();
                    String message = response.getStatusLine().getReasonPhrase();
                    Log.d(TAG, "run: " + message);
                    String responseString;
                    if(response.getEntity() != null)
                        responseString = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
                    else
                        return;
                    String strData = "";
 
                    Log.d(TAG, "0\n");
                    JSONObject jAr = new JSONObject(responseString);
 
                    Log.d(TAG, "1\n");
 
                    JSONArray features = jAr.getJSONArray("features");
                    mapPoints = new ArrayList<>();
 
 
                    for(int i=0; i<features.length(); i++)
                    {
                        JSONObject test2 = features.getJSONObject(i);
                        if(i == 0){
                            JSONObject properties = test2.getJSONObject("properties");
                            totalDistance += properties.getInt("totalDistance");
                        }
                        JSONObject geometry = test2.getJSONObject("geometry");
                        JSONArray coordinates = geometry.getJSONArray("coordinates");
 
 
                        String geoType = geometry.getString("type");
                        if(geoType.equals("Point"))
                        {
                            double lonJson = coordinates.getDouble(0);
                            double latJson = coordinates.getDouble(1);
 
                            Log.d(TAG, "-");
                            Log.d(TAG, lonJson+","+latJson+"\n");
                            com.google.android.gms.maps.model.LatLng point = new com.google.android.gms.maps.model.LatLng(latJson, lonJson);
                            mapPoints.add(point);
 
                        }
                        if(geoType.equals("LineString"))
                        {
                            for(int j=0; j<coordinates.length(); j++)
                            {
                                JSONArray JLinePoint = coordinates.getJSONArray(j);
                                double lonJson = JLinePoint.getDouble(0);
                                double latJson = JLinePoint.getDouble(1);
 
                                Log.d(TAG, "-");
                                Log.d(TAG, lonJson+","+latJson+"\n");
                                com.google.android.gms.maps.model.LatLng point = new com.google.android.gms.maps.model.LatLng(latJson, lonJson);
 
                                mapPoints.add(point);
 
                            }
                        }
                    }
 
                } catch (URISyntaxException e) {
                    Log.e(TAG, e.getLocalizedMessage());
                    e.printStackTrace();
                } catch (ClientProtocolException e) {
                    Log.e(TAG, e.getLocalizedMessage());
                    e.printStackTrace();
                } catch (IOException e) {
                    Log.e(TAG, e.getLocalizedMessage());
                    e.printStackTrace();
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
 
            }
        };
        thread.start();
 
        try{
            thread.join();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        return mapPoints;
    }
}
cs

관련글

 

Android DialogFragment 구현 방법 및 예제

사용자에게 데이터를 입력받을 Dialog를 사용합니다. 이 때 Dialog를 Fragment형식으로 구현하는 방법을 알아보겠습니다. 기능은 간단하게 하나의 EditText에 값을 입력하고 확인, 취소 버튼을 누를 수 있습니다...

jinseongsoft.tistory.com

 

Android Tesseract OCR 의 원리

이번 시간에는 OCR(광학 문자 인식) 오픈 소스 라이브러리인 Tesseract 에 대해서 알아보겠습니다. Tesseract 란? Tesseract 란 다양한 OS를 지원하기 위한 OCR 엔진이다. Free Software이고 Apache 라이선스이다..

jinseongsoft.tistory.com

 

Android Layout에 선 그리기 (Divider)

Layout에 선 그리기 UI를 짜다보면 View 들 사이를 구분하기 위해서 선을 그려줘야 하는 경우가 있는데요. 다른 경우로 필요하기도 합니다. 방법은 매우 간단합니다. 1 2 3 4 5

 

[Android] Jsoup 을 이용한 영어 단어 정보 Parsing

Jsoup 을 이용한 영어 단어 정보 Parsing 이번에는 Android 에서 Jsoup 을 이용하여 다음 단어사전 Page를 Parsing 하여 단어의 정보들을 가져오는 방법에 대해서 알아보겠습니다. 일단 Jsoup을 사용하기 위해서는..

jinseongsoft.tistory.com

 

Android Json Binder, Parser 구현

프로젝트 진행을 하면서 지나온 mappoints, 여러 좌표들을 DB 에 저장해야 되는 상황이 생겨 데이터들을 넣고 JSON 으로 binding 과 parsing 하는 기능을 구현하게 됬습니다. 소스코드 소스 코드는 아래와

jinseongsoft.tistory.com


끝으로

이 글이 도움이 되었다면, 하단의 Google 광고 👎👎👎 한번씩 클릭 부탁 드립니다. 🙏🙏🙏

광고 클릭은 많은 힘이 됩니다! 

 

 

 

 

반응형
댓글