본문 바로가기

웹개발/API

[API] 보행자 경로 구현 (Tmap API)



난이도는 아무 지도나 기본 지도만을 띄울 수 있다면 필요할 때 Copy & Paste하실 수 있을 것 입니다.

홍대입구역에서 출발하여 홍대 놀이터, 트릭아이 미술관을 거쳐 한큐에 자바 학원까지 걸어서 가보도록 하겠습니다.

여러 지도 API 중 보행자 경로에 대한 지원이 있는 Open API는 바로 TMap! 
단 한 곳이었습니다.

다음은 2017.11.13. 기준 알아본 대표적인 지도 API의 보행자 경로 관련 입장입니다.

  • 네이버 - 경로 관련 API는 추후 제공할 계획은 있으나 현재는 제공하지 않음.
  • 구글 - 보행자 경로는 제공되지 않음. 대중교통만 제공함. 한국 법률상 도보 경로는 불가하다고 함.
  • 다음 - 기능 사용은 가능하나, Open API로는 제공하지 않음
(제가 알아본 주관적인 정보입니다. 이 기능이 필요하시다면 우선적으로 Tmap을 고려하시고 다른 api들의 지원여부를 알아보시길 바랍니다!)

[용어 설명]

  • 좌표와 좌표계

    전 세계에는 엄청나게 많은 좌표계가 존재합니다. 예를 들어 우리가 많이 들어본 “동경132 북위 37”은 '경위도 좌표계'라고 합니다. 
    좌표는 (경도, 위도)로 표현됩니다. 그런데 이 좌표는 좌표계에 따라 같은 위치도 값이 완전히 달라지게 됩니다.

    자세히 알아보면 어렵구요... 우리가 구현하는데 필요한 사실은 좌표는 (경도,위도)로 표현한다 만 아시면 됩니다.
  • 레이어

    지도 API에는 Layer라는게 존재합니다. 포토샵 좀 만져 보신 분들은 쉽게 이해가 되실겁니다. 쉽게 비유를 통해 설명해드리겠습니다.
종이 위에 그림을 그려 액자에 넣는다 === 레이어 위에 어떤 짓을 한 뒤 지도 위에 올린다. // true


이렇게 표현 가능합니다
저 어떤 짓은 그림설명점 등을 다양하게 그릴수 있습니다.

다른 점이 있다면 이 layer는 종이가 투명하기 때문에 서로 겹쳐서 하나로 보이게 되죠.

제가 앞으로 만들 경로는 layer위에 그린 후에 지도위에 올리면 지도와 하나로 보이게 되는 셈입니다.


[구현 소스]

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

<head>
  <script src="js/admin/jquery.js"></script>

  <script src="js/admin/jquery-ui.min.js"></script>

</head>

 

<body>

 

<!-- tmap api를 불러옵니다 -->

// appkey이후의 ******에는 본인의 키를 써주세요

 

<script type="text/javascript">

 

$(document).ready(function() {

    

    init(); // 지도 그리기

    

    drawDirections(); // 경로그리기

});

 

var map;

// **전역 객체 사용은 자제합시다!**

 

// 지도 그리기 함수

var init = function() {

        

    var cLonLat = new Tmap.LonLat(14134558.628515,4517068.9592956);  //지도의 처음 중심 좌표.

    var zoom = 15;  // zoom level입니다.  0~19 레벨

    var mapW = '100%';  // 지도의 가로 크기 입니다.

    var mapH = '100%';  // 지도의 세로 크기 입니다.

    

    // 지도객체를 만듭니다.

    map = new Tmap.Map({div:'map_div', width:mapW, height:mapH}); 

 

    map.setCenter(cLonLat,zoom); // center를 잡습니다!

}

 

// 경로 그리기 함수

var drawDirections = function() {

              

    //출발지와 목적지의 좌표값을 설정해줍니다

    var startX = 14129005.823725;

    var startY = 4516902.583792;

    var endX = 14128464.387021;

    var endY = 4516740.197076;

            

    // 경로 포맷을 만듭니다.

    // 별 건 아니고 경로 만든걸 어떤 형태로 만들겠다고 선언 및 초기화 해준겁니다!

    var route = new Tmap.Format.KML({extractStyles:true, extractAttributes:true});

    

    // tmap에 보낼 url입니다. 이 url에 출발지와 도착지를 담아 보냅니다. 

    urlStr += "&startName='"+encodeURIComponent("출발지")+"'&endName='"+encodeURIComponent("도착지")+"'";

    urlStr += "&startX="+startX+"&startY="+startY+"&endX="+endX+"&endY="+endY;

    urlStr += "&appKey=**********"// 본인의 키를 

    

    // 이렇게 요청을 보내서 road에 경로가 저장됩니다.

    var road = new Tmap.Protocol.HTTP({ 

        

        url: urlStr,

        format:route // 위에서 쓰인 포맷이 여기에 쓰입니다.

      }); 

                         

    // layer에 방금 받아온 road를 추가하여 만듭니다.

    // 종이에 그림을 그린겁니다.

    var routeLayer = new Tmap.Layer.Vector("route", {protocol:road, strategies:[new Tmap.Strategy.Fixed()]});

         

      //경로가 그려지면 모든 경로가 다 보이게 zoom을 조정하는 event 추가합니다.

    routeLayer.events.register("featuresadded", routeLayer, showRoute);

 

      // layer를 map에 추가합니다.

      // 완성된 그림을 액자에 넣습니다

    map.addLayers([routeLayer]);

}

 

// 모든 경로가 다 보이게 하는 함수

function showRoute(event){ 

     

    map.zoomToExtent(this.getDataExtent());

}

        

</script>

 

<div id="map_div"></div>
 

</body>










세부 설명은 주석으로 달아놨습니다.

참고로 제이쿼리를 호출하지 않으시면 동작하지 않습니다!




여기에 저는 경유지 기능이 필요해서 경유지를 추가했습니다. 

[이동 경로]
홍대 놀이터 > 트릭아이 미술관 > 한큐에 자바

경유지 추가는 기존 요청에 String을 추가해서 보내면 됩니다. 
다만 문자열의 형식이 있습니다.

각 경유지는 "경도,위도"로 구성되며 "1번경유지_2번경유지_3번경유지"로 보내야 합니다.

"경도,위도_경도,위도_경도,위도" 이런 식으로 말이죠.

그렇다면 "놀이터의 경도,위도_미술관의 경도,위도"로 호출을 보내면 됩니다.


클릭해서 보시면 확대됩니다!

코드는 저 빨간 부분만 추가하면 됩니다.

[구현 화면]