Skip to content

DrawingManager

DrawingManagernaver.maps.drawing.DrawingManager를 React 컴포넌트로 감싼 API입니다. 사용자가 지도에 도형을 그리고 편집할 수 있는 그래픽 인터페이스를 제공합니다.

서브모듈 필요

이 컴포넌트는 drawing 서브모듈이 필요합니다.

tsx
<NaverMapProvider ncpKeyId="..." submodules={["drawing"]}>

기본 사용법

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

function MyMap() {
  return (
    <NaverMap defaultCenter={{ lat: 37.5666, lng: 126.9784 }} defaultZoom={14}>
      <DrawingManager
        drawingControl={[
          naver.maps.drawing.DrawingMode.RECTANGLE,
          naver.maps.drawing.DrawingMode.ELLIPSE,
          naver.maps.drawing.DrawingMode.POLYLINE,
          naver.maps.drawing.DrawingMode.POLYGON,
          naver.maps.drawing.DrawingMode.MARKER
        ]}
      />
    </NaverMap>
  );
}

공개 타입

ts
interface DrawingManagerOptionProps {
  drawingControl?: DrawingMode[] | null;
  drawingControlOptions?: DrawingControlOptions;
  drawingMode?: DrawingMode;
  controlPointOptions?: DrawingControlPointOptions;
  rectangleOptions?: RectangleOptions;
  ellipseOptions?: EllipseOptions;
  polylineOptions?: PolylineOptions;
  arrowlineOptions?: PolylineOptions;
  polygonOptions?: PolygonOptions;
  markerOptions?: MarkerOptions;
}

interface DrawingManagerEventProps {
  onDrawingAdded?: (overlay: DrawingOverlay) => void;
  onDrawingRemoved?: (overlay: DrawingOverlay) => void;
  onDrawingSelect?: (overlay: DrawingOverlay) => void;
  onDrawingStart?: (overlay: DrawingOverlay) => void;
  onDrawingCanceled?: (overlay: DrawingOverlay) => void;
  onDrawingManagerReady?: (manager: DrawingManager) => void;
}

interface DrawingManagerRef {
  getInstance: () => DrawingManager | null;
  getMap: () => Map | null;
  getDrawings: () => Record<string, DrawingOverlay>;
  getDrawing: (id: string) => DrawingOverlay | undefined;
  addDrawing: (overlay: DrawingOverlay, mode: DrawingMode, id?: string) => void;
  removeDrawing: (overlayOrId: DrawingOverlay | string) => void;
  toGeoJson: () => object;
  setDrawingMode: (mode: DrawingMode) => void;
  getDrawingMode: () => DrawingMode | undefined;
}

옵션 프로퍼티

PropTypeDefaultDescription
drawingControlDrawingMode[] | null모든 도구표시할 그리기 도구 목록. null이면 도구 UI 숨김
drawingControlOptionsDrawingControlOptions-그리기 도구 컨트롤의 위치와 스타일
drawingModeDrawingModeHAND초기 그리기 모드
controlPointOptionsDrawingControlPointOptions-편집 제어점 옵션
rectangleOptionsRectangleOptions-사각형 도형 옵션
ellipseOptionsEllipseOptions-타원 도형 옵션
polylineOptionsPolylineOptions-폴리라인 도형 옵션
arrowlineOptionsPolylineOptions-화살표 폴리라인 옵션
polygonOptionsPolygonOptions-폴리곤 도형 옵션
markerOptionsMarkerOptions-마커 옵션

이벤트 프로퍼티

PropTypeDescription
onDrawingAdded(overlay) => void도형이 추가될 때
onDrawingRemoved(overlay) => void도형이 삭제될 때
onDrawingSelect(overlay) => void도형이 선택될 때
onDrawingStart(overlay) => void그리기가 시작될 때
onDrawingCanceled(overlay) => void그리기가 취소될 때
onDrawingManagerReady(manager) => void매니저 초기화 완료 시

Ref 메서드

MethodReturn TypeDescription
getInstance()DrawingManager네이티브 인스턴스
getMap()Map연결된 Map 인스턴스
getDrawings()Record<string, DrawingOverlay>그려진 모든 도형 객체
getDrawing(id)DrawingOverlay특정 ID의 도형 객체
addDrawing()void도형 추가
removeDrawing()void도형 삭제
toGeoJson()objectGeoJSON 형식으로 내보내기
setDrawingMode()void그리기 모드 변경
getDrawingMode()DrawingMode현재 그리기 모드

DrawingMode

tsx
naver.maps.drawing.DrawingMode.HAND; // 기본 모드 (그리기 비활성)
naver.maps.drawing.DrawingMode.RECTANGLE; // 사각형
naver.maps.drawing.DrawingMode.ELLIPSE; // 타원
naver.maps.drawing.DrawingMode.POLYLINE; // 폴리라인
naver.maps.drawing.DrawingMode.ARROWLINE; // 화살표 폴리라인
naver.maps.drawing.DrawingMode.POLYGON; // 폴리곤
naver.maps.drawing.DrawingMode.MARKER; // 마커

DrawingControlOptions

tsx
interface DrawingControlOptions {
  position?: naver.maps.Position;
  style?: naver.maps.drawing.DrawingStyle;
}

위치 옵션

tsx
naver.maps.Position.TOP_LEFT;
naver.maps.Position.TOP_CENTER;
naver.maps.Position.TOP_RIGHT;
naver.maps.Position.LEFT_CENTER;
naver.maps.Position.RIGHT_CENTER;
naver.maps.Position.BOTTOM_LEFT;
naver.maps.Position.BOTTOM_CENTER;
naver.maps.Position.BOTTOM_RIGHT;

스타일 옵션

tsx
naver.maps.drawing.DrawingStyle.HORIZONTAL;
naver.maps.drawing.DrawingStyle.HORIZONTAL_2;
naver.maps.drawing.DrawingStyle.VERTICAL;
naver.maps.drawing.DrawingStyle.VERTICAL_2;

도형 스타일 커스터마이징

tsx
<DrawingManager
  rectangleOptions={{
    fillColor: "#ff0000",
    fillOpacity: 0.3,
    strokeWeight: 2,
    strokeColor: "#ff0000"
  }}
  ellipseOptions={{
    fillColor: "#00ff00",
    fillOpacity: 0.3,
    strokeWeight: 2,
    strokeColor: "#00ff00"
  }}
  polylineOptions={{
    strokeColor: "#0000ff",
    strokeWeight: 3
  }}
  polygonOptions={{
    fillColor: "#ffff00",
    fillOpacity: 0.3,
    strokeWeight: 2,
    strokeColor: "#ffd100"
  }}
/>

GeoJSON 내보내기

tsx
import { useRef } from "react";
import { DrawingManager, type DrawingManagerRef } from "react-naver-maps-kit";

function MyMap() {
  const drawingRef = useRef<DrawingManagerRef>(null);

  const handleExport = () => {
    const geoJson = drawingRef.current?.toGeoJson();
    console.log(JSON.stringify(geoJson, null, 2));
  };

  return (
    <>
      <DrawingManager ref={drawingRef} />
      <button onClick={handleExport}>GeoJSON 내보내기</button>
    </>
  );
}

동작 규칙

  • NaverMap 내부에서만 사용 가능합니다.
  • drawing 서브모듈이 로드되어야 사용 가능합니다.
  • 마우스 왼쪽 클릭: 도형 선택 및 편집
  • 마우스 오른쪽 클릭: 도형 삭제
  • HAND 모드: 그리기 비활성화, 지도 기본 조작만 가능
  • 폴리라인/폴리곤: 클릭으로 점 추가, 더블클릭으로 완료
  • 원(Circle)은 타원(Ellipse)으로 대체됩니다.

Released under the MIT License.