커스텀 컨트롤

기본 줌 컨트롤을 제거하고, 직접 만든 +/- 버튼으로 줌을 제어하는 예제입니다.

네이버 공식 튜토리얼 - 커스텀 컨트롤

코드 보기
import { useEffect, useState } from 'react';
import {
  NavermapsProvider,
  Container as MapDiv,
  NaverMap,
  useNavermaps,
  useMap,
} from 'react-naver-maps';

const locationBtnHtml = `
<a href="#" style="
  z-index: 100;
  overflow: hidden;
  display: inline-block;
  position: absolute;
  top: 7px;
  left: 5px;
  width: 34px;
  height: 34px;
  border: 1px solid rgba(58,70,88,.45);
  border-radius: 2px;
  background: #fcfcfd;
  background-clip: border-box;
  text-align: center;
  -webkit-background-clip: padding;
  background-clip: padding-box;
">
  <span style="
    overflow: hidden;
    display: inline-block;
    color: transparent !important;
    vertical-align: top;
    background: url(https://ssl.pstatic.net/static/maps/m/spr_trff_v6.png) 0 0;
    background-size: 200px 200px;
    width: 20px;
    height: 20px;
    margin: 7px 0 0 0;
    background-position: -153px -31px;
  ">NAVER 그린팩토리</span>
</a>
`;

function MyCustomControl() {
  const navermaps = useNavermaps();
  const map = useMap();

  useEffect(() => {
    // 방법 1: CustomControl 객체 사용
    const customControl = new navermaps.CustomControl(locationBtnHtml, {
      position: navermaps.Position.TOP_LEFT,
    });
    customControl.setMap(map);

    const domElement = customControl.getElement();
    const handleClick1 = () => {
      map.setCenter(new navermaps.LatLng(37.3595953, 127.1053971));
    };
    domElement.addEventListener('click', handleClick1);

    // 방법 2: map.controls 활용
    const parent = document.createElement('div');
    parent.innerHTML = locationBtnHtml;
    const locationBtnEl = parent.children[0] as HTMLElement;
    map.controls[naver.maps.Position.LEFT_CENTER].push(locationBtnEl);

    const handleClick2 = () => {
      map.setCenter(new navermaps.LatLng(37.3595953, 127.1053971));
    };
    locationBtnEl.addEventListener('click', handleClick2);

    return () => {
      domElement.removeEventListener('click', handleClick1);
      locationBtnEl.removeEventListener('click', handleClick2);
      customControl.setMap(null);
    };
  }, [map, navermaps]);

  return null;
}

function CustomControlMapContent() {
  useNavermaps(); // 네이버맵 스크립트 로드 대기
  const [init, setInit] = useState(false);

  return (
    <NaverMap defaultZoom={13} onInit={() => setInit(true)}>
      {init && <MyCustomControl />}
    </NaverMap>
  );
}

function CustomControlMapInner() {
  return (
    <MapDiv style={{ width: '100%', height: '600px' }}>
      <CustomControlMapContent />
    </MapDiv>
  );
}

export default function CustomControlExample() {
  return (
    <NavermapsProvider ncpKeyId="aluya4ff04">
      <CustomControlMapInner />
    </NavermapsProvider>
  );
}

설명

zoomControl={false}로 기본 줌 컨트롤을 숨기고, 지도 컨테이너 위에 절대 위치 버튼을 배치합니다. ref로 map 인스턴스에 접근하여 setZoom()을 호출합니다.