🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

vworld-react-3d

Package Overview
Dependencies
Maintainers
1
Versions
1
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

vworld-react-3d

VWorld 3.0 API React Component - 한국 공공데이터 3D 지도 컴포넌트

latest
Source
npmnpm
Version
3.0.0
Version published
Maintainers
1
Created
Source

VWorld React 3D

한국 공공데이터 VWorld 3.0 API를 React에서 쉽게 사용할 수 있는 컴포넌트 패키지입니다.

🚀 설치

npm install vworld-react-3d
# 또는
yarn add vworld-react-3d

📖 사용법

기본 사용법

import React from "react";
import { VWorldMap } from "vworld-react-3d";

function App() {
  return (
    <div>
      <h1>VWorld 3D 지도</h1>
      <VWorldMap
        config={{ apiKey: "YOUR_VWORLD_API_KEY" }}
        width="100%"
        height="600px"
        onMapReady={(map) => {
          console.log("맵이 준비되었습니다:", map);
        }}
        onMapClick={(coord) => {
          console.log("클릭 위치:", coord);
        }}
      />
    </div>
  );
}

고급 사용법 (카메라 제어)

import React, { useState, useRef } from "react";
import {
  VWorldMap,
  getGwanghwamunCameraPosition,
  createCoordZ,
  createDirection,
  createCameraPosition,
} from "vworld-react-3d";

function App() {
  const [mapInstance, setMapInstance] = useState(null);
  const [cameraPosition, setCameraPosition] = useState(null);

  // 서울타워로 이동
  const moveToSeoulTower = () => {
    const seoulTower = createCameraPosition(
      createCoordZ(126.988, 37.551, 1000), // 경도, 위도, 고도
      createDirection(0, -30, 0) // heading, pitch, roll
    );
    setCameraPosition(seoulTower);
  };

  // 부산으로 이동
  const moveToBusan = () => {
    const busan = createCameraPosition(
      createCoordZ(129.075, 35.179, 2000),
      createDirection(0, -45, 0)
    );
    setCameraPosition(busan);
  };

  return (
    <div>
      <VWorldMap
        config={{ apiKey: "YOUR_VWORLD_API_KEY" }}
        options={{
          mapId: "vmap",
          logo: true,
          navigation: true,
          backgroundColor: "#f0f0f0",
        }}
        initCameraPosition={getGwanghwamunCameraPosition(500)}
        cameraPosition={cameraPosition}
        width="100%"
        height="500px"
        onMapReady={(map) => {
          console.log("맵 준비:", map);
          setMapInstance(map);
        }}
        onMapClick={(coord) => {
          console.log("클릭 위치:", coord);
        }}
        onCameraChange={(camera) => {
          console.log("카메라 변경:", camera);
        }}
      />

      <div style={{ marginTop: "10px" }}>
        <button onClick={moveToSeoulTower}>서울타워로 이동</button>
        <button onClick={moveToBusan}>부산으로 이동</button>
      </div>
    </div>
  );
}

맵 인스턴스 직접 제어

import React, { useRef } from "react";
import { VWorldMap } from "vworld-react-3d";

function App() {
  const mapRef = useRef(null);

  const controlMap = () => {
    if (mapRef.current) {
      const map = mapRef.current;

      // 현재 위치 가져오기
      const currentPos = map.getCurrentPosition();
      console.log("현재 위치:", currentPos);

      // 새로운 위치로 이동
      const newCoord = new window.vw.CoordZ(126.977, 37.571, 1000);
      map.setPosition(newCoord);
    }
  };

  return (
    <div>
      <VWorldMap
        ref={mapRef}
        config={{ apiKey: "YOUR_VWORLD_API_KEY" }}
        width="100%"
        height="500px"
        onMapReady={(map) => {
          console.log("사용 가능한 메서드:", Object.getOwnPropertyNames(map));
        }}
      />

      <button onClick={controlMap}>맵 제어</button>
    </div>
  );
}

🔑 API 키 발급

VWorld API 키는 VWorld 개발자 포털에서 발급받을 수 있습니다.

📚 Props

VWorldMapProps

PropTypeRequiredDefaultDescription
configVWorldConfig-VWorld API 설정
optionsPartial<VWorldMapOptions>{}맵 옵션
initCameraPositionVWorldCameraPosition광화문초기 카메라 위치
cameraPositionVWorldCameraPosition-동적 카메라 위치
zoomnumber-줌 레벨
onMapReady(map: VWorldMapInstance) => void-맵 준비 완료 콜백
onMapLoad() => void-맵 로드 완료 콜백
onCameraChange(camera: VWorldCameraPosition) => void-카메라 변경 콜백
onZoomChange(zoom: number) => void-줌 변경 콜백
onMapClick(coord: VWorldCoord) => void-맵 클릭 콜백
onMapDoubleClick(coord: VWorldCoord) => void-맵 더블클릭 콜백
onMouseMove(coord: VWorldCoord) => void-마우스 이동 콜백
onWheel(delta: number) => void-휠 스크롤 콜백
onError(error: string) => void-오류 발생 콜백
classNamestring''CSS 클래스명
styleReact.CSSProperties{}인라인 스타일
widthstring | number'100%'컨테이너 너비
heightstring | number'600px'컨테이너 높이

VWorldConfig

PropertyTypeRequiredDescription
apiKeystringVWorld API 키

VWorldMapOptions

PropertyTypeDefaultDescription
mapIdstring'vmap'맵 컨테이너 ID
logobooleantrue로고 표시 여부
navigationbooleantrue네비게이션 컨트롤 표시 여부
autoRotatebooleanfalse자동 회전 여부
showGridbooleanfalse그리드 표시 여부
showAxisbooleanfalse축 표시 여부
backgroundColorstring'#000000'배경색
terrainbooleantrue지형 표시 여부
buildingsbooleantrue건물 표시 여부
roadsbooleantrue도로 표시 여부
waterbooleantrue물 표시 여부
vegetationbooleantrue식생 표시 여부
enableAntialiasingbooleantrue안티앨리어싱 활성화
enableShadowsbooleantrue그림자 활성화
maxFPSnumber60최대 FPS

🛠️ 유틸리티 함수

좌표 및 위치 생성

import {
  createCoord,
  createCoordZ,
  createDirection,
  createCameraPosition,
  getGwanghwamunCameraPosition,
} from "vworld-react-3d";

// 2D 좌표 생성
const coord2D = createCoord(126.977, 37.571);

// 3D 좌표 생성 (고도 포함)
const coord3D = createCoordZ(126.977, 37.571, 500);

// 방향 생성 (heading, pitch, roll)
const direction = createDirection(0, -45, 0);

// 카메라 위치 생성
const cameraPos = createCameraPosition(coord3D, direction);

// 광화문 위치 (고도 기반)
const gwanghwamun = getGwanghwamunCameraPosition(1000); // 1000m 고도

🎯 주요 기능

✅ 완전한 TypeScript 지원

  • 모든 타입이 정확하게 정의됨
  • IntelliSense 완벽 지원

✅ React 16.8+ 호환

  • Hooks 기반 구현
  • forwardRef 지원으로 맵 인스턴스 직접 접근 가능

✅ 자동 스크립트 로딩

  • jQuery 자동 로드
  • VWorld 3.0 API 자동 로드
  • 순차적 스크립트 로딩으로 안정성 보장

✅ 64개 공식 API 메서드 지원

  • 맵 초기화 및 제어
  • 카메라 위치 및 방향 제어
  • 줌 및 회전 제어
  • 이벤트 처리
  • 성능 최적화

✅ 이벤트 시스템

  • 맵 준비/로드 이벤트
  • 카메라 변경 이벤트
  • 클릭/더블클릭 이벤트
  • 마우스 이동/휠 이벤트

✅ 에러 처리

  • 스크립트 로딩 실패 처리
  • 맵 초기화 실패 처리
  • 사용자 친화적 에러 메시지

🌐 브라우저 지원

  • Chrome 60+
  • Firefox 55+
  • Safari 12+
  • Edge 79+

📦 패키지 구조

vworld-react-3d/
├── dist/                    # 빌드된 파일들
│   ├── index.esm.js        # ES 모듈
│   ├── index.d.ts          # TypeScript 타입 정의
│   └── index.js            # CommonJS
├── src/
│   ├── VWorldMap.tsx       # 메인 컴포넌트
│   ├── types.ts            # TypeScript 타입 정의
│   ├── utils.ts            # 유틸리티 함수
│   └── index.ts            # 진입점
├── package.json
├── rollup.config.mjs       # 빌드 설정
└── README.md

🔧 개발

# 의존성 설치
npm install

# 개발 모드 (파일 감시)
npm run dev

# 빌드
npm run build

# 타입 체크
npm run type-check

# 린트
npm run lint

📄 라이선스

MIT License

🤝 기여하기

  • Fork the repository
  • Create your feature branch (git checkout -b feature/amazing-feature)
  • Commit your changes (git commit -m 'Add some amazing feature')
  • Push to the branch (git push origin feature/amazing-feature)
  • Open a Pull Request

🐛 문제 신고

버그나 기능 요청이 있으시면 GitHub Issues에 등록해주세요.

📝 변경 이력

3.0.0

  • 🎯 VWorld 3.0 API 완전 지원 (64개 메서드)
  • 🎮 카메라 제어 기능 (위치, 방향, 줌)
  • 📡 완전한 이벤트 시스템 (클릭, 카메라 변경, 마우스 등)
  • 🛠️ 유틸리티 함수 (좌표 생성, 위치 관리)
  • 🔧 forwardRef 지원 (맵 인스턴스 직접 접근)
  • 📚 완전한 TypeScript 타입 정의

2.0.0

  • 🚀 성능 최적화
  • 🔧 빌드 시스템 개선
  • 📦 ES 모듈 지원

1.0.0

  • 🎉 초기 릴리스
  • 🗺️ 기본 VWorld 3D 맵 컴포넌트
  • 📱 React 16.8+ 지원

Keywords

vworld

FAQs

Package last updated on 18 Jul 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts