Skip to content

지도 컨트롤

지도의 줌, 타입, 스케일 등 컨트롤을 설정하는 방법을 설명합니다.

라이브 데모

줌 컨트롤

줌 인/아웃 버튼을 표시합니다:

tsx
import { NaverMap, NaverMapProvider } from "react-naver-maps-kit";

function ZoomControlExample() {
  return (
    <NaverMapProvider ncpKeyId={import.meta.env.VITE_NCP_KEY_ID}>
      <NaverMap
        center={{ lat: 37.5665, lng: 126.978 }}
        zoom={12}
        zoomControl
        zoomControlOptions={{
          position: naver.maps.Position.TOP_RIGHT,
          style: naver.maps.ZoomControlStyle.SMALL
        }}
        style={{ width: "100%", height: "500px" }}
      />
    </NaverMapProvider>
  );
}

줌 컨트롤 옵션

옵션설명
position컨트롤 위치
style컨트롤 스타일 (SMALL, LARGE)

줌 범위 제한

tsx
<NaverMap minZoom={6} maxZoom={18} zoomControl />

지도 타입 컨트롤

일반 지도, 위성 지도, 하이브리드 전환:

tsx
import { NaverMap, NaverMapProvider } from "react-naver-maps-kit";

function MapTypeControlExample() {
  return (
    <NaverMapProvider ncpKeyId={import.meta.env.VITE_NCP_KEY_ID}>
      <NaverMap
        center={{ lat: 37.5665, lng: 126.978 }}
        zoom={12}
        mapTypeControl
        mapTypeControlOptions={{
          position: naver.maps.Position.TOP_RIGHT,
          mapTypeIds: [
            naver.maps.MapTypeId.NORMAL,
            naver.maps.MapTypeId.TERRAIN,
            naver.maps.MapTypeId.SATELLITE,
            naver.maps.MapTypeId.HYBRID
          ]
        }}
        style={{ width: "100%", height: "500px" }}
      />
    </NaverMapProvider>
  );
}

지도 타입

타입설명
NORMAL일반 지도 (기본값)
TERRAIN지형도
SATELLITE위성 지도
HYBRID위성 + 지도 정보

스케일 컨트롤

지도 축척 표시:

tsx
<NaverMap
  scaleControl
  scaleControlOptions={{
    position: naver.maps.Position.BOTTOM_LEFT
  }}
/>

로고 컨트롤

네이버 로고 표시 여부:

tsx
<NaverMap
  logoControl
  logoControlOptions={{
    position: naver.maps.Position.BOTTOM_RIGHT
  }}
/>

지도 데이터 컨트롤

지도 데이터(도로명, 건물명 등) 표시:

tsx
<NaverMap
  mapDataControl
  mapDataControlOptions={{
    position: naver.maps.Position.BOTTOM_LEFT
  }}
/>

인터랙션 제어

사용자 입력 제어:

tsx
import { NaverMap, NaverMapProvider } from "react-naver-maps-kit";

function InteractionControlExample() {
  return (
    <NaverMapProvider ncpKeyId={import.meta.env.VITE_NCP_KEY_ID}>
      <NaverMap
        center={{ lat: 37.5665, lng: 126.978 }}
        zoom={12}
        style={{ width: "100%", height: "500px" }}
        // 드래그
        draggable={true}
        // 스크롤 휠 줌
        scrollWheel={true}
        // 핀치 줌 (모바일)
        pinchZoom={true}
        // 키보드 단축키
        keyboardShortcuts={false}
        // 더블클릭 줌 비활성화
        disableDoubleClickZoom={true}
        // 더블탭 줌 비활성화 (모바일)
        disableDoubleTapZoom={false}
        // 관성 스크롤 비활성화
        disableKineticPan={false}
      />
    </NaverMapProvider>
  );
}
Prop기본값설명
draggabletrue드래그로 이동
scrollWheeltrue휠로 줌
pinchZoomtrue핀치로 줌
keyboardShortcutstrue키보드 이동
disableDoubleClickZoomfalse더블클릭 줌 비활성화

이동 범위 제한

지도 이동을 특정 영역으로 제한:

tsx
<NaverMap
  maxBounds={{
    south: 33.0, // 대한민국 영역
    west: 124.0,
    north: 39.0,
    east: 132.0
  }}
/>

커스텀 컨트롤 (Ref 사용)

직접 컨트롤 버튼을 만들어 지도를 제어:

tsx
import { useRef, useState } from "react";
import { NaverMap, NaverMapProvider, type NaverMapRef } from "react-naver-maps-kit";

function CustomControls() {
  const mapRef = useRef<NaverMapRef>(null);
  const [mapType, setMapType] = useState("normal");

  const zoomIn = () => {
    const currentZoom = mapRef.current?.getZoom() ?? 12;
    mapRef.current?.setZoom(currentZoom + 1);
  };

  const zoomOut = () => {
    const currentZoom = mapRef.current?.getZoom() ?? 12;
    mapRef.current?.setZoom(currentZoom - 1);
  };

  const changeMapType = (type: string) => {
    mapRef.current?.setMapTypeId(type);
    setMapType(type);
  };

  const goToSeoul = () => {
    mapRef.current?.panTo({ lat: 37.5665, lng: 126.978 });
  };

  return (
    <div>
      <div style={{ marginBottom: "1rem", display: "flex", gap: "0.5rem" }}>
        <button onClick={zoomIn}>+</button>
        <button onClick={zoomOut}>-</button>
        <button onClick={goToSeoul}>서울로 이동</button>
        <button onClick={() => changeMapType("normal")}>일반</button>
        <button onClick={() => changeMapType("satellite")}>위성</button>
        <button onClick={() => changeMapType("terrain")}>지형</button>
      </div>

      <NaverMapProvider ncpKeyId={import.meta.env.VITE_NCP_KEY_ID}>
        <NaverMap
          ref={mapRef}
          center={{ lat: 37.5665, lng: 126.978 }}
          zoom={12}
          style={{ width: "100%", height: "400px" }}
        />
      </NaverMapProvider>

      <p>현재 지도 타입: {mapType}</p>
    </div>
  );
}

완전한 컨트롤 예제

tsx
import { useRef, useState } from "react";
import { NaverMap, NaverMapProvider, type NaverMapRef } from "react-naver-maps-kit";

function FullControlExample() {
  const mapRef = useRef<NaverMapRef>(null);
  const [center, setCenter] = useState({ lat: 37.5665, lng: 126.978 });
  const [zoom, setZoom] = useState(12);

  return (
    <div>
      <NaverMapProvider ncpKeyId={import.meta.env.VITE_NCP_KEY_ID}>
        <NaverMap
          ref={mapRef}
          center={center}
          zoom={zoom}
          onCenterChanged={setCenter}
          onZoomChanged={setZoom}
          minZoom={6}
          maxZoom={18}
          zoomControl
          mapTypeControl
          scaleControl
          style={{ width: "100%", height: "500px" }}
        />
      </NaverMapProvider>

      <div style={{ marginTop: "1rem" }}>
        <p>
          중심 좌표: {center.lat.toFixed(4)}, {center.lng.toFixed(4)}
        </p>
        <p>줌 레벨: {zoom}</p>
      </div>
    </div>
  );
}

다음 단계

Released under the MIT License.