데이터를 기반으로

T-map API 본문

데이터 수집/API

T-map API

이노후 2020. 7. 18. 18:34
728x90
반응형

안녕하세요~~


오늘은 !!!


T-map API 파이썬으로 호출하기를 해보려고 합니다!!


요즘은 API가 활성화 되어서 특정 언어로 API 호출해서 데이터를 받아오는 건 기본 중 기본이 되어가고 있네요...


전 정말 처음엔 어렵게 블로그들 보면서 겨우 겨우 하고 그랬는데 지금은 한번 짜 놓은 코드 덕분에 수워할게 업무를 진행하고 있습니다~!!


먼저 API 호출 방식은 크게 2가지로 나뉩니다. 


XML 형식Json 형식으로 나뉘는데 각각 크게 차이는 없는 것같아요 파이썬에서는 그냥 호출하고 받아오고 파싱하는 과정에서의


명령어들이 조금씩 다른 정도로 보여집니다.(전적으로 데이터 추출 관점)


저는 Json 방식으로 진행을 했습니다 ㅎㅎㅎ 자 그럼 본격적으로 시작에 앞서!!


무료인 T-map API 에서 회원가입 후 인증key를 받아야겠죠? 모든 API는 Key값을 받아야 호출해서 데이터를 받을 수 있습니다!!


KEY는 마이페이지 가서 확인을 해보시면 됩니다~~!!


저는 T-map API 서비스 중 다중 경유지 안내30 서비스를 호출해보았습니다.



링크 : https://tmapapi.sktelecom.com/main.html#webservice/sample/WebSampleRouteSeq30

호출 요소 확인 링크 : https://tmapapi.sktelecom.com/main.html#webservice/docs/tmapRouteSequential30


위 링크를 타고 들어가시면 다중 경유지 안내 30에 대한 호출 요소들과 응답 요소들을 확인하실 수 있습니다!!



방법은 간단 합니다!! 요청할 요소들을 지정해서 요청을 하고 해당 요청 값에 따른 데이터를 받는 것입니다!!


먼저 파이썬으로 진행한 코드를 보여드리면



가장 먼저 패키지들을 import 해줍니다!!


re는 나중에 정규식을 사용하기 위해서 미리 import 시켜주었습니다!! ㅎㅎ


time1은 각 경유지 별로 머무는 시간을 설정해 주는 것입니다.


택배차로 가정하였을 경우 한 배송지에 도착했을 때 평균 물품 전달 시간으로 생각하시면 편하실 것 같습니다~ㅎㅎ


단위는 초이기에 저는 약 10분 정도 소요할 것 같아 600초로 지정해 두었습니다!!


그리고 starttime 이라는 변수는 시작 시간을 말합니다!!! 


마지막에 최종 소요시간 및 마지막 배송지에 도착한 시간들을 계산하기 위해 지정했습니다!!


저는 총 3 곳을 경유를 하고자합니다~ 


각각 경유지마다 이름을 설정하시고, 위경도 값을 받아야합니다!!


주소지에 따른 위경도 값은 지오코딩을 하시든 아니면 인터넷에서 따로 추출하는 방법도 있으니 


자세한 건 구글링을 통해 작업하시면 될것 같습니다~!!



그렇게 출발지와 경유지들을 선택한 후 이제는 요청을 시작해야겠죠?


요청의 첫 번째는 바로 Headers !!!!


headers 부분에 요청을 위한 필수 값들을 입력해줍니다!!(위에 요청 필수 요소들은 앞서 설명드린 링크를 통해 확인 가능합니다!!)


요청의 두 번째는 바로 payload !!!!


처음 출발지 및 각 경유지에 대한 요청 해당값들을 입력해주고, 경유지 개수 만큼 리스트에 넣어주시면 됩니다!!


첫 중괄호 { 부터 첫 대괄호 [ 까지는 출발지를 의미 합니다~


그리고 첫 대괄호 부터는 경유지들에 대한 정보를 의미합니다~


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
payload = {
    "reqCoordType" : "WGS84GEO",
    "resCoordType" : "WGS84GEO",
    "startName" : "출발 : " + str(start_name),
    "startX" : str(start_X) ,
    "startY" : str(start_Y) ,
    "startTime" : "202003160900",
    "endName" : "도착 : " + str(start_name),
    "endX" : str(start_X) ,
    "endY" : str(start_Y) ,
    "endPoiId" : "",
    "searchOption" : "0",
    "carType" : "4",
    "viaPoints" : 
    [
        { 
        "viaPointId" : "첫번째 경유지",
        "viaPointName" : str(loc1_name),
        "viaX" : str(loc1_X),
        "viaDetailAddress" : str(loc1_name),
        "viaY" : str(loc1_Y),
        "viaPoiId" : "",
        "viaTime"str(time1), 
        "wishStartTime"""
        "wishEndTime"""
        },
        { 
        "viaPointId" : "두번째 경유지",
        "viaPointName" : str(loc2_name),
        "viaX" : str(loc2_X),
        "viaDetailAddress" : str(loc2_name),
        "viaY" : str(loc2_Y),
        "viaPoiId" : "",
        "viaTime"str(time1),
        "wishStartTime"""
        "wishEndTime"""},
        { 
        "viaPointId" : "세번째 경유지",
        "viaPointName" : str(loc3_name),
        "viaX" : str(loc3_X),
        "viaDetailAddress" : str(loc3_name),
        "viaY" : str(loc3_Y),
        "viaPoiId" : "",
        "viaTime"str(time1),
        "wishStartTime"""
        "wishEndTime"""},
        
    ] 
      
}
cs


이렇게 모든 경유지에 대한 정보를 입력하여 지정해 두었습니다!!


자!!! 이제!!! 호출을 해볼까요??



호출 명령어는 requests를 이용해 진행하였습니다~~


호출된 명령어를 json.loads를 통해 json 형식의 text로 가져왔습니다!!!



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
= requests.post(url, json=payload, headers=headers)
 
jsonObj = json.loads(r.text)
 
print ("전체 거리 ",
       str(round(int(jsonObj['properties']['totalDistance'])/100,2)) + "km",
       "전체 소요 시간",
       str(round(int(jsonObj['properties']['totalTime'])/60)) + "분",
       "",
       "시작 시간 : " + str(re.sub("(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})",
                               r"\1년\2월\3일 \4시\5분\6초",
                               jsonObj['features'][0]['properties']['arriveTime'])),
       "",
       str(jsonObj['features'][1]['properties']['viaPointId']) + " : " 
       + str(jsonObj['features'][1]['properties']['viaDetailAddress']),
       
       "도착 시간 : " + str(re.sub("(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})",
                               r"\1년\2월\3일 \4시\5분\6초",
                               jsonObj['features'][2]['properties']['arriveTime'])),
       "",
       str(jsonObj['features'][3]['properties']['viaPointId']) + " : " 
       + str(jsonObj['features'][3]['properties']['viaDetailAddress']),
       
       "도착 시간 : " + str(re.sub("(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})",
                               r"\1년\2월\3일 \4시\5분\6초",
                               jsonObj['features'][3]['properties']['arriveTime'])),
       "",
       str(jsonObj['features'][5]['properties']['viaPointId']) + " : " 
       + str(jsonObj['features'][5]['properties']['viaDetailAddress']),
       
       "도착 시간 : " + str(re.sub("(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})",
                               r"\1년\2월\3일 \4시\5분\6초",
                               jsonObj['features'][5]['properties']['arriveTime'])),
       "",
       "완료 시간 : " + str(re.sub("(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})",
                               r"\1년\2월\3일 \4시\5분\6초",
                               jsonObj['features'][5]['properties']['completeTime'])),
       
       sep="\n" 
)
cs



위의 코드는 제가 추출하고 싶은 값들만 따로 뽑아서 추출하느라 각각의 전처리가 필요했습니다!!


저는 배송의 가장 중요한 점은 시간 아니겠습니까!?


그래서 저는 시간을 위주로 항목들을 추출하였습니다!! ㅎㅎㅎ


아까 위에 요청 요소를 확인할 수 있는 링크에 가시면 응답 요소들도 나와있으니 원하시는 요소들을 골라서 추출하시면 될 것 같습니다~ㅎㅎ


저는 초로 값이 나오는 항목들을 분으로 변환해주고 각각 배송지 위치명 등 제가 원하는 값들만 추출해서 전처리하고 정규식을 통해 


한글 값으로 확인할 수 있게 적용하였습니다.


나중에 이것을 서비스르 진행한다면 이러한 배송하시는 분이 보시기 편하게 하려면 정제하는 과정이 필요할 것 같다 생각이 들어서 


미리 작업을 해두었습니다~ ㅎㅎㅎ


그렇게 출력된 결과물은!!!!




제가 출력했던 항목은 전체 거리, 전체 소요 시간, 시작 시간, 각 경유지 별 도착 시간, 마지막 완료 시간


이렇게 출력을 했습니다.


제가 아까 한 경유지 당 물품 전달 소요 시간을 10분으로 했는 데 그 부분까지 정확히 잘 부여된 것 같아 기분이 좋네요 ㅎㅎ


암튼 저튼 쨌든


이렇게 T-map API를 호출하여 값을 가져왔습니다!!


만약 이 과정을 서비스로 진행하려면 경유지 별로 입력할 때 자동으로 호출값으로 들어가게 하고 그 값들을 자동으로 위경도 값도


추출해주는 코드가 필요해 보입니다 ㅎㅎㅎ 




한번 이렇게 API 호출을 했다면!!!


나중에는 어떤 API든 JSON으로 호출하기 쉬워지실 겁니다 ㅎㅎㅎ 각 API 마다 요청 요소만 확인한다면 무리없이 호출하 실 수 있으실 거에요~~~



그럼 오늘은 여기까지!!


모두에게 도움이 되셨길 바랍니다~~


감사합니다 :)

728x90
반응형