vworld-react-3d
Version:
VWorld 3.0 API React Component - 한국 공공데이터 3D 지도 컴포넌트
325 lines (324 loc) • 10.5 kB
TypeScript
export interface VWorldConfig {
apiKey: string;
}
export interface VWorldCoord {
x: number;
y: number;
z: number;
}
export interface VWorldDirection {
heading: number;
pitch: number;
roll: number;
}
export interface VWorldCameraPosition {
coord: VWorldCoord;
direction: VWorldDirection;
}
export interface VWorldMapOptions {
mapId?: string;
initPosition?: VWorldCameraPosition;
logo?: boolean;
navigation?: boolean;
autoRotate?: boolean;
showGrid?: boolean;
showAxis?: boolean;
backgroundColor?: string;
skyColor?: string;
fogColor?: string;
fogDensity?: number;
terrain?: boolean;
buildings?: boolean;
roads?: boolean;
water?: boolean;
vegetation?: boolean;
enableAntialiasing?: boolean;
enableShadows?: boolean;
enableFog?: boolean;
maxFPS?: number;
minDistance?: number;
maxDistance?: number;
enablePan?: boolean;
enableZoom?: boolean;
enableRotate?: boolean;
animationDuration?: number;
easingFunction?: string;
}
export interface VWorldCameraChangeEvent {
type: "camerachange";
camera: VWorldCameraPosition;
}
export interface VWorldZoomChangeEvent {
type: "zoomchange";
zoom: number;
}
export interface VWorldClickEvent {
type: "click";
coord: VWorldCoord;
}
export interface VWorldDoubleClickEvent {
type: "dblclick";
coord: VWorldCoord;
}
export interface VWorldMouseMoveEvent {
type: "mousemove";
coord: VWorldCoord;
}
export interface VWorldWheelEvent {
type: "wheel";
delta: number;
}
export type VWorldMapEvent = VWorldCameraChangeEvent | VWorldZoomChangeEvent | VWorldClickEvent | VWorldDoubleClickEvent | VWorldMouseMoveEvent | VWorldWheelEvent;
export interface VWorldMapInstance {
setOption(options: Partial<VWorldMapOptions>): void;
start(): void;
stop(): void;
destroy(): void;
resize(): void;
getContainer(): HTMLElement;
getSize(): {
width: number;
height: number;
};
update(): void;
getCurrentPosition(): VWorldCameraPosition;
moveTo(position: VWorldCameraPosition, duration?: number): void;
flyTo(position: VWorldCameraPosition, duration?: number): void;
setCamera(position: VWorldCameraPosition): void;
getCamera(): VWorldCameraPosition;
lookAt(target: VWorldCoord, duration?: number): void;
orbit(center: VWorldCoord, radius: number, duration?: number): void;
pan(deltaX: number, deltaY: number, duration?: number): void;
rotate(angle: number, duration?: number): void;
tilt(angle: number, duration?: number): void;
zoomTo(level: number, duration?: number): void;
fitBounds(bounds: {
min: VWorldCoord;
max: VWorldCoord;
}, duration?: number): void;
zoomIn(level?: number): void;
zoomOut(level?: number): void;
setZoom(level: number): void;
getZoom(): number;
getMinZoom(): number;
getMaxZoom(): number;
setMinZoom(level: number): void;
setMaxZoom(level: number): void;
on(event: string, callback: (event: VWorldMapEvent) => void): void;
off(event: string, callback?: (event: VWorldMapEvent) => void): void;
once(event: string, callback: (event: VWorldMapEvent) => void): void;
trigger(event: string, data?: unknown): void;
addLayer(layer: VWorldLayer): void;
removeLayer(layerId: string): void;
getLayer(layerId: string): VWorldLayer | null;
getLayers(): VWorldLayer[];
setLayerVisibility(layerId: string, visible: boolean): void;
getLayerVisibility(layerId: string): boolean;
setLayerOpacity(layerId: string, opacity: number): void;
getLayerOpacity(layerId: string): number;
setLayerOrder(layerId: string, order: number): void;
getLayerOrder(layerId: string): number;
clearLayers(): void;
reloadLayer(layerId: string): void;
addFeature(feature: VWorldFeature): void;
removeFeature(featureId: string): void;
getFeature(featureId: string): VWorldFeature | null;
getFeatures(): VWorldFeature[];
setFeatureStyle(featureId: string, style: VWorldFeatureStyle): void;
getFeatureStyle(featureId: string): VWorldFeatureStyle | null;
setFeatureVisibility(featureId: string, visible: boolean): void;
getFeatureVisibility(featureId: string): boolean;
clearFeatures(): void;
pickFeature(screenX: number, screenY: number): VWorldFeature | null;
getBounds(): {
min: VWorldCoord;
max: VWorldCoord;
};
getCenter(): VWorldCoord;
getExtent(): {
min: VWorldCoord;
max: VWorldCoord;
};
getProjection(): string;
getScale(): number;
getResolution(): number;
getViewport(): {
width: number;
height: number;
};
getPixelRatio(): number;
animate(animation: VWorldAnimation): void;
ease(easing: string, duration: number): void;
interpolate(start: VWorldCameraPosition, end: VWorldCameraPosition, progress: number): VWorldCameraPosition;
setAnimationDuration(duration: number): void;
getAnimationDuration(): number;
stopAnimation(): void;
enableInteraction(): void;
disableInteraction(): void;
setInteractionMode(mode: string): void;
getInteractionMode(): string;
enablePan(): void;
disablePan(): void;
enableZoom(): void;
disableZoom(): void;
setRenderMode(mode: string): void;
getRenderMode(): string;
getFPS(): number;
setQuality(quality: string): void;
getQuality(): string;
setMaxFPS(fps: number): void;
loadData(url: string, options?: VWorldDataOptions): Promise<void>;
loadTile(x: number, y: number, z: number): Promise<void>;
loadTerrain(bounds: {
min: VWorldCoord;
max: VWorldCoord;
}): Promise<void>;
loadBuilding(buildingId: string): Promise<void>;
loadPOI(poiId: string): Promise<void>;
loadVectorData(url: string): Promise<void>;
screenToWorld(screenX: number, screenY: number): VWorldCoord;
worldToScreen(worldX: number, worldY: number, worldZ: number): {
x: number;
y: number;
};
pixelToWorld(pixelX: number, pixelY: number): VWorldCoord;
worldToPixel(worldX: number, worldY: number, worldZ: number): {
x: number;
y: number;
};
coordinateToPixel(lon: number, lat: number, alt: number): {
x: number;
y: number;
};
pixelToCoordinate(pixelX: number, pixelY: number): VWorldCoord;
raycast(origin: VWorldCoord, direction: VWorldDirection): VWorldRaycastResult | null;
getDistance(point1: VWorldCoord, point2: VWorldCoord): number;
getBearing(point1: VWorldCoord, point2: VWorldCoord): number;
getAltitude(lon: number, lat: number): Promise<number>;
getSlope(point1: VWorldCoord, point2: VWorldCoord): number;
getAspect(lon: number, lat: number): number;
getVisibility(point1: VWorldCoord, point2: VWorldCoord): boolean;
getSunPosition(date: Date): {
azimuth: number;
elevation: number;
};
enableShadows(): void;
disableShadows(): void;
setShadowQuality(quality: string): void;
enableFog(): void;
disableFog(): void;
setFogDensity(density: number): void;
}
export interface VWorldLayer {
id: string;
name: string;
type: string;
visible: boolean;
opacity: number;
order: number;
url?: string;
data?: unknown;
}
export interface VWorldFeature {
id: string;
type: string;
geometry: {
type: string;
coordinates: number[] | number[][] | number[][][];
};
properties: Record<string, unknown>;
style?: VWorldFeatureStyle;
visible: boolean;
}
export interface VWorldFeatureStyle {
color?: string;
opacity?: number;
size?: number;
symbol?: string;
outlineColor?: string;
outlineWidth?: number;
}
export interface VWorldAnimation {
type: string;
duration: number;
easing?: string;
target: VWorldCameraPosition;
}
export interface VWorldDataOptions {
format?: string;
projection?: string;
bounds?: {
min: VWorldCoord;
max: VWorldCoord;
};
}
export interface VWorldRaycastResult {
point: VWorldCoord;
distance: number;
feature?: VWorldFeature;
layer?: VWorldLayer;
}
export interface VWorldMapProps {
config: VWorldConfig;
options?: Partial<VWorldMapOptions>;
/** 최초 맵 생성 시 카메라 위치 */
initCameraPosition?: VWorldCameraPosition;
/** 동적 카메라 위치 제어 */
cameraPosition?: VWorldCameraPosition;
/** 줌 레벨 제어 */
zoom?: number;
/** 최소 줌 레벨 */
minZoom?: number;
/** 최대 줌 레벨 */
maxZoom?: number;
/** 카메라 이동 이벤트 콜백 */
onCameraChange?: (position: VWorldCameraPosition) => void;
/** 줌 변경 이벤트 콜백 */
onZoomChange?: (zoom: number) => void;
/** 맵 클릭 이벤트 콜백 */
onMapClick?: (position: VWorldCoord) => void;
/** 맵 더블클릭 이벤트 콜백 */
onMapDoubleClick?: (position: VWorldCoord) => void;
/** 마우스 이동 이벤트 콜백 */
onMouseMove?: (position: VWorldCoord) => void;
/** 마우스 휠 이벤트 콜백 */
onWheel?: (delta: number) => void;
/** 맵 준비 완료 콜백 */
onMapReady?: (map: VWorldMapInstance) => void;
/** 맵 로드 완료 콜백 */
onMapLoad?: () => void;
/** 에러 발생 콜백 */
onError?: (error: string) => void;
/** CSS 클래스명 */
className?: string;
/** 인라인 스타일 */
style?: React.CSSProperties;
/** 컨테이너 너비 */
width?: string | number;
/** 컨테이너 높이 */
height?: string | number;
}
export interface VWorldGlobal {
vw?: {
Map: new () => VWorldMapInstance;
CameraPosition: new (coord: VWorldCoord, direction: VWorldDirection) => VWorldCameraPosition;
CoordZ: new (x: number, y: number, z: number) => VWorldCoord;
Direction: new (heading: number, pitch: number, roll: number) => VWorldDirection;
};
v_protocol?: string;
vworldUrl?: string;
vworld2DCache?: string;
vworldBaseMapUrl?: string;
vworldStyledMapUrl?: string;
vworldVectorKey?: string;
vworldApiKey?: string;
vworldNoCss?: string;
vworldIsValid?: string;
vworld3DUrl?: string;
$?: JQueryStatic;
vworldMapInstance?: VWorldMapInstance;
}
declare global {
interface Window extends VWorldGlobal {
}
}