본문 바로가기

TIL

아웃소싱 팀 프로젝트 ③ - 카카오맵 api 로 자전거 경로 지도 출력

■  카카오맵 api 활용해서 지도 불러오기

(1) 카카오 디벨로퍼스에 가입 및 앱 생성 후 앱키(javascript 키) 를 받아서 index.html 에 추가해주었다.

     (key 는 .env.local 파일에 환경변수로 만들어서 사용!)

<body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
    <script
      type="text/javascript"
      src="//dapi.kakao.com/v2/maps/sdk.js?appkey=%VITE_KAKAO_KEY%&libraries=services,clusterer"
    ></script>
  </body>

 

(2) 사용할 컴포넌트 안에서 지도 불러오기

https://apis.map.kakao.com/web/sample/basicMap/

카카오에 api 가이드가 잘 정리되어 있어서 참고해서 쉽게 지도를 불러올 수 있다.

// 예시코드
var mapContainer = document.getElementById('map'), // 지도를 표시할 div 
    mapOption = { 
        center: new kakao.maps.LatLng(33.450701, 126.570667), // 지도의 중심좌표
        level: 3 // 지도의 확대 레벨
    };

// 지도를 표시할 div와  지도 옵션으로  지도를 생성합니다
var map = new kakao.maps.Map(mapContainer, mapOption);

<div id="map" style="width:100%;height:350px;"></div>

이때 지도를 표시할 mapContainer의 'map' 과 <div id="map"> 은 같아야 한다.

 

■  지도에 자전거 경로 그리기

공공데이터포털 사이트에서 자전거 도로 api 를 받아 만든 db.json 이다. 나는 이 중 id와 roadLine 을 이용해서 지도를 출력해주었다.

roadLine에는 대략 8천개정도의 데이터가 배열안 객체형태로 들어있는데  이중 위도 좌표값 LINE_XP 와 경도 좌표값 LINE_YP 를 이용해서 경로를 선으로 그려주었다.

8천개 중 하나를 지도에 찍어보면 점으로 나오는데 이 점이 8천개가 모여서 선이 된다.

* 공공데이터포털(https://www.data.go.kr/index.do) - 여러 데이터, 오픈API 들을 제공한다.

 

최종 코드

부모 컴포넌트인 Posting.jsx 에서 db.json의 feed 데이터를 map으로 순회해서 RidingMap 컴포넌트에 id와 roadLine을 props로 내려주었다. id 값은 container와 <div> id값으로 넣어주어 피드 별로 각각의 지도를 만들어주었다.

지도에서 보여줄 중심 좌표로는 roadLine의 중간 값의 좌표를 넣어주어 linePath 가 보이도록 해주었다.

나는 마우스 드래그로 지도 이동 기능을 막고 싶어서 옵션에 draggable: false 를 추가하였다.

import { useEffect } from "react";

const { kakao } = window;

const RidingMap = ({ id, roadLine }) => {
  useEffect(() => {
    const container = document.getElementById(id);
    const options = {
    // 지도에서 보여줄 중심좌표 - roadLine 의 중간값 좌표를 넣어주었다.
      center: new kakao.maps.LatLng(
        roadLine[Math.floor(roadLine.length / 2)].LINE_XP,
        roadLine[Math.floor(roadLine.length / 2)].LINE_YP
      ),
      level: 11, // linePath 전체가 보이도록 지도 확대 레벨을 늘려주었다.
      draggable: false
    };

    const map = new kakao.maps.Map(container, options);

    // 빈 배열의 linePath 를 선언하여 roadLine을 forEach 문으로 각 linePath의 LatLng를 넣어주었다.
    // 선을 구성하는 좌표배열
    const linePath = [];
    roadLine.forEach((el) => linePath.push(new kakao.maps.LatLng(el.LINE_XP, el.LINE_YP)));

    const polyline = new kakao.maps.Polyline({
      path: linePath,
      strokeWeight: 5, // 선의 두께
      strokeColor: "#ff3700", // 선의 색깔
      strokeOpacity: 0.7, // 선의 투명도
      strokeStyle: "solid" // 선의 스타일
    });
    // 지도에 선을 표시
    polyline.setMap(map);
  }, []);

  return <div id={id} style={{ width: "300px", height: "230px" }}></div>;
};

export default RidingMap;

roadLine으로 linePath 에 위도경도 좌표값을 넣어주고 콘솔에 찍어보면 이렇다.

 

출력한 지도 모습

 

 

🧐 느낀점

이것저것 클릭해보고 시도해본 뒤인 지금은 조금 사용이 익숙해졌지만 처음 api 사용 가이드를 봤을 때는 이게 무슨말이고 어떻게 활용해야하는 지 막막했다. 그치만 여러 api 들을 활용해보면서 활용할 수 있는 데이터들이 정말 많은 것 같다 느꼈고 조금 자신감이 생겼다.

혼자 부딪혀보고 삽질도 해봐야 온전하게 내 것으로 만들 수 있는 것 같다.