1. 맵 출력
HTML에 지도 영역을 div#map 으로 작성해주고 JS에서 카카오 공식문서를 따라 작성한다.
https://apis.map.kakao.com/web/
<!-- 지도영역 -->
<div id="map"></div>
var container = document.getElementById('map'); //지도를 담을 영역의 DOM 레퍼런스
var options = { //지도를 생성할 때 필요한 기본 옵션
center: new kakao.maps.LatLng(37.58506980062978, 126.88550246441767), //지도의 중심좌표.
level: 3 //지도의 레벨(확대, 축소 정도)
};
var map = new kakao.maps.Map(container, options); //지도 생성 및 객체 리턴
2. 교통정보 표시
맵에 교통정보를 표시하고 버튼을 누르면 표시하지 않게 되는 기능을 만들었다.
//교통정보보기버튼 변수로 저장
const t_on = document.querySelectorAll(".traffic li")[0];
//교통정보 끄기 버튼 변수로 저장
const t_off = document.querySelectorAll(".traffic li")[1];
JS에서 HTML 요소를 가져와 변수로 저장한다.
//교통정보 보기 버튼 클릭시
t_on.addEventListener("click", (e)=>{
e.preventDefault();
if(t_on.classList.contains("on")) return;
map.addOverlayMapTypeId(kakao.maps.MapTypeId.TRAFFIC);
t_on.classList.add("on");
t_off.classList.remove("on");
});
//교통정보 끄기 버튼 클릭시
t_off.addEventListener("click",e=>{
e.preventDefault();
//이미 t_off에 on이 있다면 아래 코드를 실행하지 않고 코드 종료
if(t_off.classList.contains("on")) return;
map.removeOverlayMapTypeId(kakao.maps.MapTypeId.TRAFFIC);
t_on.classList.remove("on");
t_off.classList.add("on");
});
변수에 이벤트리스너를 등록 후 클릭을 하면 표시 / 미표시 설정을 하고 on 클래스를 수정한다.
3. 마커 표시
원하는 위치에 마커를 표시하고 마커 이미지를 입혀보았다.
var imageSrc = 'img/marker1.png', // 마커이미지의 주소입니다
imageSize = new kakao.maps.Size(116, 50), // 마커이미지의 크기입니다
imageOption = {offset: new kakao.maps.Point(58, 50)}; // 마커이미지의 옵션입니다. 마커의 좌표와 일치시킬 이미지 안에서의 좌표를 설정합니다.
// 마커의 이미지정보를 가지고 있는 마커이미지를 생성합니다
var markerImage = new kakao.maps.MarkerImage(imageSrc, imageSize, imageOption),
markerPosition = new kakao.maps.LatLng(37.58506980062978, 126.88550246441767);
var marker = new kakao.maps.Marker({
position: markerPosition,
image: markerImage // 마커이미지 설정
});
// 마커가 지도 위에 표시되도록 설정합니다
marker.setMap(map);
공식문서에서 알려주는 것처럼 이미지 루트를 설정하고 크기, 옵션을 지정 후 마커를 표시한다.
마커 이미지를 여러 개 표시하고 버튼을 클릭 시 해당 마커로 맵을 이동시킬 수 있도록 개발해보았다.
//브랜치 버튼 변수저장
const branch_btns = document.querySelectorAll(".branch li");
let markerOptions =[
{
title: "본점",
latlng : new kakao.maps.LatLng(37.58506980062978, 126.88550246441767),
imgSrc : 'img/marker1.png',
imgSize : new kakao.maps.Size(116, 50),
imgPos : {offset: new kakao.maps.Point(58, 50)},
button: branch_btns[0]
},
{
title: "지점1",
latlng : new kakao.maps.LatLng(37.5162016, 127.0759248),
imgSrc : 'img/marker2.png',
imgSize : new kakao.maps.Size(116, 50),
imgPos : {offset: new kakao.maps.Point(58, 50)},
button: branch_btns[1]
},
{
title: "지점2",
latlng : new kakao.maps.LatLng(37.5116828, 127.059151),
imgSrc : 'img/marker3.png',
imgSize : new kakao.maps.Size(116, 50),
imgPos : {offset: new kakao.maps.Point(58, 50)},
button:branch_btns[2]
}
];
변수 설정 및 기본 마커 위치 지정을 해주었다.
//반복을 돌면서 마커이미지를 정해진 위치로 배치
for(let i=0; i<markerOptions.length; i++){
let marker = new kakao.maps.Marker({
map:map,
position:markerOptions[i].latlng,
title:markerOptions[i].title,
image: new kakao.maps.MarkerImage(markerOptions[i].imgSrc, markerOptions[i].imgSize, markerOptions[i].imgPos)
});
마커 이미지를 지정한 위치로 이동시켰다.
//각 브랜치 버튼을 클릭했을때
markerOptions[i].button.addEventListener("click", e=>{
e.preventDefault();
//브랜치 버튼 활성화
for(let k=0; k<markerOptions.length; k++){
markerOptions[k].button.classList.remove("on");
}
markerOptions[i].button.classList.add("on");
//클릭한 브랜치위치로 이동
map.panTo(markerOptions[i].latlng);
})
}
마커에 해당하는 버튼을 누르면 해당 마커의 위치로 맵을 이동시킨다.
//브라우저너비사이즈를 변경할때
//마커가 항상 화면 가운데 위치하도록
window.addEventListener("resize",()=>{
//branch li에서 on이 붙은 li를 찾는다
let active_btn = document.querySelector(".branch li.on");
//on이 붙은 li의 data-index을 찾는다
let active_index = active_btn.getAttribute("data-index");
//배열중에서 data-index번째의 위치로 항상 가운데 유지
map.setCenter(markerOptions[active_index].latlng)
});
브라우저 사이즈를 변경하면 마커의 위치가 달라질 수 있으므로 브라우저 사이즈를 변경할 때마다 위치를 재설정해준다.
'Today I Learned > JS' 카테고리의 다른 글
[JS] Form Validation 2 - 에이블런 프론트엔드 부트캠프 21일차 (0) | 2024.08.12 |
---|---|
[JS] Form Validation - 에이블런 프론트엔드부트캠프 20일차 (4) | 2024.08.12 |
[JS] 동적으로 HTML 구성 - 에이블런 프론트엔드부트캠프 17일차 (0) | 2024.08.07 |
[JS] swiper.js - 에이블런 프론트엔드부트캠프 17일차 (0) | 2024.08.06 |
[JS] isotope.js - 에이블런 프론트엔드부트캠프 16일차 (0) | 2024.08.06 |