본문 바로가기

:: Develop/Python

Google Maps API를 사용해보자 !

작업중인 프로젝트에서 대중교통을 이용한 길찾기 기능이 필요했다. Naver API 에서는 자동차 길찾기만 제공해주고 있었으므로 다른 대안이 필요했고 Google Maps API 중 Directions API 를 사용하면 내가 원하는 일련의 결과를 얻을 수 있을것 같다는 생각이 들었다.

 

 

:: 내가 필요한 것을 적어보자.

1. 출발지와 목적지를 위도, 경도로 검색 할 수 있어야 한다.

2. 대중교통과 도보만 이용한 경로가 결과로 주어져야 한다.

3. 주어진 결과를 위도, 경도로 변환하여 사용 할 수 있어야 한다.

4. 위의 작업을 되도록이면 Python에서 할 수 있었으면 한다.

 

 

기존에 Naver API를 사용하여 자동차 길찾기를 한 결과는 아래와 같은데, 경로에 해당하는 각각의 파란색 점의 위도, 경도를 가져와 사용 할 수가 있었다. 지도에 표시되어있는 빨간색 사각형과 파란색 점들 역시 Naver API 에서 제공하는 함수들을 이용하여 자동적으로 매번 원하는 Scope를 그리고 해당 경로를 점으로 찍어 시각화 하는데 매우 유용했다.

 

출발지와 목적지를 실제의 자동차 길찾기 결과를 반영하여 출력한 결과화면

 

이와 같은 작업을 이번에는 대중교통과 도보만을 이용한 경로로 도출해 내고 싶었고, 하나씩 시도해보고자 한다.

 

먼저 Google Cloud Platform에 가서 프로젝트를 생성해야한다. 생성 과정에서 신용카드가 필요하니 참고하자. 기본적으로 무료로 제공되는 다양한 Maps API가 있지만 유료로 제공되는 API도 있기에 초과분에 대해서 청구 할 수 있도록 하는 것 같다. 일단은 겁부터 먹지 않아도 된다. 최초로 프로젝트를 등록하면 아래와 같이 1년동안 사용 할 수 있는 $300 를 무료로 주니까 요금 폭탄을 맞을 일은 일단 접어두자.

 

$300 한 번 알뜰하게 써보는걸로.

 

생성한 프로젝트의 Dashboard내 APIS 메뉴를 누르면 아래와 같이 내가 지금 사용할 수 있는 API들과 신청 해서 사용 할 수 있는 API를 볼 수있다. 간단히 말하면 돈내고 써야 하는 애들은 처음에는 신청 되어있지 않다.

 

 

여기서 우리는 Directions API를 사용할 것이다. 처음에는 Additional APIs에 있으니 신청해서 Enabled APIs로 옮겨주도록 하자.

그 후 Directions API 오른쪽에 있는 Details에 들어가 Credentials 에 보면 내 계정의 API Key를 볼 수 있다. 복사해서 잘 가지고 있자.

 

 

그 다음은 이 Key를 코드안에 하드 코딩 해두기 싫으므로 .. ( 내 통장이 걸려있다 숨겨야 한다 ) JSON 파일로 따로 빼서 관리하려고 한다. 간단히 google_keys.json 파일을 만들어서 아래와같이 코딩해 두었다.

 

프로젝트를 여려명이서 함께 한다면 각각의 구글 계정마다 id와 key를 구성하여 $300를 돌려 쓸 수 있을 것이다.

 


 

자 일단 여기까지 하고 본격적으로 코딩하기전에 내 API Key가 정상적으로 작동하는지 check 해볼 필요가 있다.

https://maps.googleapis.com/maps/api/directions/json?origin=Disneyland&destination=Universal+Studios+Hollywood&key=API key

 

위 주소에 당신이 가진 API 키를 넣어서 인터넷 주소창에 붙여넣고 Enter를 눌렀을때 결과값이 아래와같이 정상적으로 출력된다면, 축하 한다 당신의 통장은 이제 Google과 연결되었다.

 

 


 

일단 기본적으로 Direntions API는 HTTP Request를 이용해서 요청을하고 결과를 JSON으로 받아 파싱해서 사용한다. 그럼 우리는 딱 두가지만 잘하면 된다. Request를 날릴때 필요한 Parameter들을 정확히 넣는것과 결과로 나온 JSON에서 내가 원하는 정보만 잘 파싱해서 사용하는것.

 

아주 다양한 Parameter들이 있지만 여기선 딱 필요한 Parameter만 짚고 넘어가겠다. 

 

기본적으로 요청할 URL의 앞부분은 

https://maps.googleapis.com/maps/api/directions/json?

이며, 각각의 Parameter 들은 &로 연결해주면 된다. 그리고 마지막으로 항상 맨 마지막에는 key=자신의 API Key 를 Parameter로 붙여줘야한다.

 

origin = 위도, 경도

설명 : 출발지

예시 : origin=41.43206,-81.38992

주의할점 : 위도와 경도 사이에 공백 없어야함 문자열 형식으로 묶지말고 숫자로 바로 쓸 것

 

destination = 위도, 경도

설명 : 도착지

예시 : destination=41.43206,-81.38992

주의할 점 : 위도와 경도 사이에 공백 없어야함, 문자열 형식으로 묶지말고 숫자로 바로 쓸 것

 

mode = driving, walking, bicycling, transit

설명 : 길찾기 모드를 선택한다. 기본값은 driving 이며, 각각 도보, 자전거, 대중교통을 나타낸다.

 

departure_time = 초단위정수

설명 : 출발 시간을 설정 할 수 있다. 

예시 : departure_time=1343641500 일 경우 2012 년 7 월 30 일 오전 9:45에 출발 하도록 설정한 값인데, 이는 우리가 익숙한 UTC 1970 년 1월 1일 0시 0분 0초 부터 경과한 초를 정수로 반환한 값을 사용한다. 만약 지금 시간으로 설정하고 싶을경우 departure_time=now로 입력하면 된다.

 


 

일단 어떤 형식인지 알겠으니, 우리가 익숙한 경로에 하나를 요청해보고 결과값을 받아 보자.

 

광화문 세종대왕동상 위도,경도 : 37.5728359,126.9746922

 

잠실 롯데월드타워 위도,경도 : 37.5129907,127.1005382

 

 

광화문 세종대왕동상에서 출발(origin)해서 잠실 롯데월드타워(destination)에 도착하는 대중교통(transit)을 현재시간(departure_time=now)를 기준으로 요청 하려한다.

 

https://maps.googleapis.com/maps/api/directions/json?origin=37.5728359,126.9746922&destination=37.5129907,127.1005382&mode=transit&departure_time=now&key=당신의 API Key

 

위와 같은 정보로 요청하면 아래와 같은 결과값을 받을 수 있다. 

{
   "geocoded_waypoints" : [
      {
         "geocoder_status" : "OK",
         "place_id" : "ChIJ4caUupSifDURYuT2qUs4W2A",
         "types" : [ "street_address" ]
      },
      {
         "geocoder_status" : "OK",
         "place_id" : "ChIJdS39NLilfDURnzPeBKoCG1Y",
         "types" : [ "establishment", "food", "point_of_interest", "restaurant" ]
      }
   ],
   "routes" : [
      {
         "bounds" : {
            "northeast" : {
               "lat" : 37.5728359,
               "lng" : 127.105059
            },
            "southwest" : {
               "lat" : 37.512886,
               "lng" : 126.9746922
            }
         },
         "copyrights" : "지도 데이터 ©2019 SK telecom",
         "legs" : [
            {
               "arrival_time" : {
                  "text" : "오후 9:39",
                  "time_zone" : "Asia/Seoul",
                  "value" : 1563367152
               },
               "departure_time" : {
                  "text" : "오후 8:57",
                  "time_zone" : "Asia/Seoul",
                  "value" : 1563364631
               },
               "distance" : {
                  "text" : "16.5 km",
                  "value" : 16548
               },
               "duration" : {
                  "text" : "42분",
                  "value" : 2521
               },
               "end_address" : "대한민국 서울특별시 송파구 신천동 27",
               "end_location" : {
                  "lat" : 37.5129907,
                  "lng" : 127.1005382
               },
               "start_address" : "대한민국 서울특별시 종로구 도렴동 81-4",
               "start_location" : {
                  "lat" : 37.5728359,
                  "lng" : 126.9746922
               },
               "steps" : [
                  {
                     "distance" : {
                        "text" : "0.3 km",
                        "value" : 287
                     },
                     "duration" : {
                        "text" : "5분",
                        "value" : 289
                     },
                     "end_location" : {
                        "lat" : 37.571522,
                        "lng" : 126.977138
                     },
                     "html_instructions" : "광화문역까지 도보",
                     "polyline" : {
                        "points" : "gmidFyv~eWlHkMe@]"
                     },
                     "start_location" : {
                        "lat" : 37.5728359,
                        "lng" : 126.9746922
                     },
                     "steps" : [
                        {
                           "distance" : {
                              "text" : "0.3 km",
                              "value" : 262
                           },
                           "duration" : {
                              "text" : "4분",
                              "value" : 263
                           },
                           "end_location" : {
                              "lat" : 37.571329,
                              "lng" : 126.976989
                           },
                           "polyline" : {
                              "points" : "gmidFyv~eWlHkM"
                           },
                           "start_location" : {
                              "lat" : 37.5728359,
                              "lng" : 126.9746922
                           },
                           "travel_mode" : "WALKING"
                        },
                        {
                           "distance" : {
                              "text" : "25 m",
                              "value" : 25
                           },
                           "duration" : {
                              "text" : "1분",
                              "value" : 26
                           },
                           "end_location" : {
                              "lat" : 37.571522,
                              "lng" : 126.977138
                           },
                           "html_instructions" : "\u003cspan class=\"location\"\u003e9\u003c/span\u003e 입구 이용",
                           "polyline" : {
                              "points" : "ycidFee_fWe@]"
                           },
                           "start_location" : {
                              "lat" : 37.571329,
                              "lng" : 126.976989
                           },
                           "travel_mode" : "WALKING"
                        }
                     ],
                     "travel_mode" : "WALKING"
                  },
                  {
                     "distance" : {
                        "text" : "6.6 km",
                        "value" : 6597
                     },
                     "duration" : {
                        "text" : "13분",
                        "value" : 780
                     },
                     "end_location" : {
                        "lat" : 37.561817,
                        "lng" : 127.037017
                     },
                     "html_instructions" : "지하철 상일동역행",
                     "polyline" : {
                        "points" : "_eidFcf_fW[@?AEaVAqAImAIwAYaCk@gD]aCSsBMuAKiFAwFEyDHu@IaAAeQDy@TaBv@eDp@{BdAcEz@sC`@yA\\s@r@mAZ_@dA{@d@Uh@UvAY~J[fDSVCh@Gh@Q`Ai@\\Wn@m@`@m@Ve@Zs@ZeAPkAHkAByAKiEWwLDaCH_A?AJaBJqAPmAPs@RcAh@gBlAkCbB_DxFqGjAyAv@oAP]|AoEbAmD`@mA?AXeAp@eCb@aA~@cBtA}Az@u@l@_@bEcBbDmAfAk@t@k@x@w@p@{@fAkBf@uAh@}A?Ah@qELqC?sAM}BYuBq@mCwAkD_AaC_AgC]kA_@cAsCwHo@oBm@_B?A}AgE{@kBmNkWkEuI]i@"
                     },
                     "start_location" : {
                        "lat" : 37.571522,
                        "lng" : 126.977138
                     },
                     "transit_details" : {
                        "arrival_stop" : {
                           "location" : {
                              "lat" : 37.561817,
                              "lng" : 127.037017
                           },
                           "name" : "왕십리"
                        },
                        "arrival_time" : {
                           "text" : "오후 9:15",
                           "time_zone" : "Asia/Seoul",
                           "value" : 1563365700
                        },
                        "departure_stop" : {
                           "location" : {
                              "lat" : 37.571522,
                              "lng" : 126.977138
                           },
                           "name" : "광화문역"
                        },
                        "departure_time" : {
                           "text" : "오후 9:02",
                           "time_zone" : "Asia/Seoul",
                           "value" : 1563364920
                        },
                        "headsign" : "상일동역",
                        "line" : {
                           "agencies" : [
                              {
                                 "name" : "서울도시철도공사",
                                 "url" : "http://www.odsay.com/Subway/LineInfo.asp?CID=1000&LMenu=2/"
                              }
                           ],
                           "color" : "#663399",
                           "name" : "서울지하철",
                           "short_name" : "5호선",
                           "text_color" : "#ffffff",
                           "vehicle" : {
                              "icon" : "//maps.gstatic.com/mapfiles/transit/iw2/6/subway2.png",
                              "name" : "지하철",
                              "type" : "SUBWAY"
                           }
                        },
                        "num_stops" : 7
                     },
                     "travel_mode" : "TRANSIT"
                  },
                  {
                     "distance" : {
                        "text" : "80 m",
                        "value" : 80
                     },
                     "duration" : {
                        "text" : "1분",
                        "value" : 82
                     },
                     "end_location" : {
                        "lat" : 37.561265,
                        "lng" : 127.037603
                     },
                     "html_instructions" : "왕십리까지 도보",
                     "polyline" : {
                        "points" : "khgdFk|jfWnBsB"
                     },
                     "start_location" : {
                        "lat" : 37.561817,
                        "lng" : 127.037017
                     },
                     "steps" : [
                        {
                           "distance" : {
                              "text" : "1 m",
                              "value" : 0
                           },
                           "duration" : {
                              "text" : "1분",
                              "value" : 61
                           },
                           "end_location" : {
                              "lat" : 37.561817,
                              "lng" : 127.037017
                           },
                           "html_instructions" : "\u003cspan class=\"location\"\u003e5\u003c/span\u003e 출구 이용",
                           "polyline" : {
                              "points" : "khgdFk|jfW"
                           },
                           "start_location" : {
                              "lat" : 37.561817,
                              "lng" : 127.037017
                           },
                           "travel_mode" : "WALKING"
                        },
                        {
                           "distance" : {
                              "text" : "80 m",
                              "value" : 80
                           },
                           "duration" : {
                              "text" : "1분",
                              "value" : 21
                           },
                           "end_location" : {
                              "lat" : 37.561265,
                              "lng" : 127.037603
                           },
                           "polyline" : {
                              "points" : "khgdFk|jfWnBsB"
                           },
                           "start_location" : {
                              "lat" : 37.561817,
                              "lng" : 127.037017
                           },
                           "travel_mode" : "WALKING"
                        }
                     ],
                     "travel_mode" : "WALKING"
                  },
                  {
                     "distance" : {
                        "text" : "9.5 km",
                        "value" : 9514
                     },
                     "duration" : {
                        "text" : "16분",
                        "value" : 960
                     },
                     "end_location" : {
                        "lat" : 37.51335,
                        "lng" : 127.100171
                     },
                     "html_instructions" : "지하철 성수역행",
                     "polyline" : {
                        "points" : "{dgdF_`kfWA??AFiGAiCEkF@g@Bs@@YH_@Tu@Xi@Tc@X[XU\\Wd@Wp@QpCg@hCYzBWpDc@pCYhCWhFc@zDYvEa@bBOl@CvAAlAAb@ChBIzDa@h@Kj@OZOd@W\\Wh@m@d@y@Ri@n@wBbAkElAmFbB_IrAiG\\gBf@iCrA}GrB{J@?lAsGhC_MzB_Lf@}BdAcFjBkI|AmGvD{P?AlAeFpCcLV{A\\sBn@sDx@gFhAiHbAgGfBmLz@gFp@gEJgA@i@?u@Ag@Ck@YmBiAqHy@_F_BgKKs@KcACc@A{@BeAF_BJ{@Ls@TeAPo@Xq@Ti@h@_Ab@o@r@u@r@k@n@a@`FoC@?bDmBxEcCvA{@~BoA|CeBxGsD`E{BlC}AbEyBxDwBjDmBzDuBzBqAhEcCzAw@fAg@lEwBrAo@bBu@`Bq@zBcAv@S~@WdBUpBEvANrATj@P|@Xj@Xd@Zx@h@fA|@fAxAT\\\\t@x@rBv@~Cn@xD\\bB?@"
                     },
                     "start_location" : {
                        "lat" : 37.561265,
                        "lng" : 127.037603
                     },
                     "transit_details" : {
                        "arrival_stop" : {
                           "location" : {
                              "lat" : 37.51335,
                              "lng" : 127.100171
                           },
                           "name" : "잠실"
                        },
                        "arrival_time" : {
                           "text" : "오후 9:38",
                           "time_zone" : "Asia/Seoul",
                           "value" : 1563367080
                        },
                        "departure_stop" : {
                           "location" : {
                              "lat" : 37.561265,
                              "lng" : 127.037603
                           },
                           "name" : "왕십리"
                        },
                        "departure_time" : {
                           "text" : "오후 9:22",
                           "time_zone" : "Asia/Seoul",
                           "value" : 1563366120
                        },
                        "headsign" : "성수역",
                        "line" : {
                           "agencies" : [
                              {
                                 "name" : "서울메트로",
                                 "url" : "http://www.seoulmetro.co.kr/"
                              }
                           ],
                           "color" : "#0f993d",
                           "name" : "서울지하철",
                           "short_name" : "2호선",
                           "text_color" : "#ffffff",
                           "vehicle" : {
                              "icon" : "//maps.gstatic.com/mapfiles/transit/iw2/6/subway2.png",
                              "name" : "지하철",
                              "type" : "SUBWAY"
                           }
                        },
                        "num_stops" : 8
                     },
                     "travel_mode" : "TRANSIT"
                  },
                  {
                     "distance" : {
                        "text" : "70 m",
                        "value" : 70
                     },
                     "duration" : {
                        "text" : "1분",
                        "value" : 72
                     },
                     "end_location" : {
                        "lat" : 37.5129907,
                        "lng" : 127.1005382
                     },
                     "html_instructions" : "대한민국 서울특별시 송파구 신천동 27까지 도보",
                     "polyline" : {
                        "points" : "my}cFagwfWzAy@SO"
                     },
                     "start_location" : {
                        "lat" : 37.51335,
                        "lng" : 127.100171
                     },
                     "steps" : [
                        {
                           "distance" : {
                              "text" : "57 m",
                              "value" : 57
                           },
                           "duration" : {
                              "text" : "1분",
                              "value" : 58
                           },
                           "end_location" : {
                              "lat" : 37.512886,
                              "lng" : 127.100458
                           },
                           "html_instructions" : "\u003cspan class=\"location\"\u003e2-1\u003c/span\u003e 출구 이용",
                           "polyline" : {
                              "points" : "my}cFagwfWzAy@"
                           },
                           "start_location" : {
                              "lat" : 37.51335,
                              "lng" : 127.100171
                           },
                           "travel_mode" : "WALKING"
                        },
                        {
                           "distance" : {
                              "text" : "13 m",
                              "value" : 13
                           },
                           "duration" : {
                              "text" : "1분",
                              "value" : 14
                           },
                           "end_location" : {
                              "lat" : 37.5129907,
                              "lng" : 127.1005382
                           },
                           "polyline" : {
                              "points" : "qv}cF{hwfWSO"
                           },
                           "start_location" : {
                              "lat" : 37.512886,
                              "lng" : 127.100458
                           },
                           "travel_mode" : "WALKING"
                        }
                     ],
                     "travel_mode" : "WALKING"
                  }
               ],
               "traffic_speed_entry" : [],
               "via_waypoint" : []
            }
         ],
         "overview_polyline" : {
            "points" : "gmidFyv~eWlHkMe@][@EcVAqAImAc@yEiAiHa@iEKiFAwFEyDHu@IaAAeQDy@TaBv@eDp@{BdAcE|AmFpAaCZ_@dA{@nAk@vAY~J[fDS`AKh@Q`Ai@\\Wn@m@x@sAZs@ZeAPkAHkAByAKiEWwLDaCHaAVsDPmAPs@RcAh@gBlAkCbB_DxFqGjAyAhAmB|AoEbAmD`@oAjAkEb@aA~@cBtA}Az@u@l@_@bEcBbDmAfAk@nBcBp@{@fAkBpAsDh@sELqC?sAM}BYuBq@mCwAkD_CiG}@oCsCwHo@oBm@aB}AgE{@kBmNkWkEuI]i@lBsBFkGGuJD{AJy@Tu@Xi@Tc@X[v@m@d@Wp@QpCg@hCYlH{@dOuArK{@bBOl@CdDClCMzDa@h@Kj@OZOd@W\\Wh@m@d@y@bAaDbAkEpDmPpBqJzBgLtB{JlAsGhC_MbD}OpDoP|AmGvD{PlAgFpCcLV{AlAgHbCqObAgGfBmLlBoLLqBA}ACk@YmBcCqOkB{LOgB@aCF_BJ{@b@yBj@aB~@iBb@o@r@u@bBmAbFoCbDmBxEcCvEkCfWsNdVuMdIuEbD_B`HgDbBu@|EuBvBk@dBUpBEvANrAThBj@j@Xd@Z`CfB|AvBvAhDv@~Cn@xD\\dBzAy@SO"
         },
         "summary" : "",
         "warnings" : [
            "도보 경로는 베타 서비스입니다. 주의 – 이 경로에는 인도 또는 보행 경로가 누락되었을 수도 있습니다."
         ],
         "waypoint_order" : []
      }
   ],
   "status" : "OK"
}

 

아 .. 갓구글 .. 이 얼마나 친절한가 ㅠㅠ

JSON의 자료 구조를 알고 있다면 찬찬히 처음부터 읽어보면 금방 이해 할 수 있다. 처음에는 전체 출발지와 도착지에 대한 위도 경도 정보가 나와있으며 중간 중간은 각각의 travel_mode가 바뀔때마다 반복되는 구조를 주고있다. 

 


 

자, 여기까지를 일단 Python을 이용해 코딩해보자. 얼마 안걸리는 작업이니 후다닥 해보겠다.


# coding: utf-8
import time
import json
import os
import ssl
import urllib.request

if (__name__ == "__main__") :

    client = None
    with open("./google_key.json","r") as clientJson :
        client = json.load(clientJson)

    origin          = "37.5728359,126.9746922"
    destination     = "37.5129907,127.1005382"
    mode            = "transit"
    departure_time  = "now"
    key             = client["key"]

    url = "https://maps.googleapis.com/maps/api/directions/json?origin="+ origin \
            + "&destination=" + destination \
            + "&mode=" + mode \
            + "&departure_time=" + departure_time\
            + "&language=ko" \
            + "&key=" + key

    request         = urllib.request.Request(url)
    context         = ssl._create_unverified_context()
    response        = urllib.request.urlopen(request, context=context)
    responseText    = response.read().decode('utf-8')
    responseJson    = json.loads(responseText)

    with open("./Agent_Transit_Directions.json","w") as rltStream :
        json.dump(responseJson,rltStream)

 

아직 파일별로 분리는 하지않고, 이해를 돕기위해 하나의 파일안에 전체 코딩을 한 상태이다. 맨처음 client 변수안에 우리가 위에서 저장해두었던 google_key.json 파일을 열어서 key값을 가져온 후 url을 만들어서 request를 하고 response를 받은 후 json 형식으로 Agent_Transit_Directions.json 파일에 저장하는 간단한 코드다. 일단 이렇게 한번 request를 한 후에 만들어진 json 파일을 이용해 파싱할 코드를 짜면 된다.

 


자, 이제 이 작업의 꽃인 response 파싱을 해보자.

 

import json

if ( __name__ == "__main__" ) :

    wholeDict = None
    with open("./Agent_Transit_Directions.json","r") as transitJson :
        wholeDict = dict(json.load(transitJson))

    path            = wholeDict["routes"][0]["legs"][0]
    duration_sec    = path["duration"]["value"]
    start_geo       = path["start_location"]
    end_geo         = path["end_location"]

    print(duration_sec) // 전체 걸리는 시간을 초로 나타낸 것
    print(start_geo)	// 출발지 위도,경도
    print(end_geo)	// 도착지 위도,경도

 

print된 결과값은 다음과 같다.

 

2461
{'lat': 37.5728359, 'lng': 126.9746922}
{'lat': 37.5129907, 'lng': 127.1005382}

 

그 다음은 steps 인데, 다음 나오는 stepList는 전체 경로를 가지고 있는 List 이다.

stepList = path["steps"]
print(stepList[0])

 

print 안에 있는 stepList 안의 index를 변화시키며 출력해보면 각각의 step이 나타내는 바를 알 수 있는데, 각각의 step은 transit이 변화할 때 하나씩 올라간다. 만약 Agent가 도보 > 지하철 > 도보 > 지하철 로 이동했다면 총 4번의 스텝을 가지고 있는 것이다. 남아있는 각각의 step안에서는 큰 구조 몇가지만 남아있는 상태이므로 자신이 원하는 정보를 추출해서 사용하는데 무리가 없을 것이다.

 


마치며.

여기까지 따라왔다면 Google Map API 중 Directions API는 이제 입맛에 맞게 요리 할 준비가 된것이다. Naver나 Google 같은 굵직한 API를 이용하여 코딩을 했을때는 해당 코드를 잘 정리해 두는 것이 매우 유용하다. 계속해서 개발을 하다보면 반드시 다시 사용할 때가 오므로 Class 형태로 빼서 여러가지 함수로 나눠 놓으면 다시 해당 API를 써야할때 큰 도움이 된다. 

  • onemask 2019.07.17 23:02 신고

    좋은 정보 감사합니다 : )

  • yoosangoh 2020.02.28 17:21

    좋은 정보 감사합니다
    네이버 API에서 자동차 경로찾기 지원하는 줄은 몰랐는데 우연히 구글 api정보 얻으러왔다가 다른 정보까지 얻고갑니다!!

  • 파이썬 2020.03.04 17:12

    https://maps.googleapis.com/maps/api/directions/json?origin=37.5728359,126.9746922&destination=37.5129907,127.1005382&mode=transit&departure_time=now&key=

    이와같은 정보를 url 형태로 어떻게 얻나요??? 좋은정보 감사합니다.~

  • yerim 2020.06.26 13:23

    똑같이 따라해서 direction api발급 받았는데 "error_message" : "This IP, site or mobile application is not authorized to use this API key. Request received from IP address 121.186.109.111, with empty referer",
    "routes" : [],
    "status" : "REQUEST_DENIED" 이렇게 떠요ㅜㅜㅜ