wing-ops/frontend/src/tabs/aerial/services/aerialApi.ts
Nan Kyung Lee 044994bd57 feat(aerial): UP42 위성 패스 조회 + 궤도 지도 표시
- 백엔드: GET /api/aerial/satellite/passes — 한국 주변 위성 패스 시뮬레이션
  UP42 API 연동 준비 (Workspace ID: b9bc92ae, TODO 주석)
  6개 위성 궤도 데이터 (KOMPSAT-3A, Pléiades Neo, Sentinel-1/2, WV-3, SkySat)
- 프론트 API: fetchSatellitePasses() + SatellitePass 인터페이스
- UP42 모달: MapLibre 지도에 위성 궤도 라인 실시간 표시
  한국 영역 AOI 점선 박스 + 궤도별 색상 구분
  위성 클릭 시 해당 궤도 하이라이트 (나머지 투명)
- 패스 타임라인: 통과 시각, 해상도, 앙각, 상승/하강 방향, 긴급도 표시
- 궤도 범례 오버레이 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 10:11:52 +09:00

158 lines
4.2 KiB
TypeScript

import { api } from '@common/services/api';
// ============================================================
// 항공 방제 API
// ============================================================
// === AERIAL_MEDIA ===
export interface AerialMediaItem {
aerialMediaSn: number;
acdntSn: number | null;
fileNm: string;
orgnlNm: string | null;
filePath: string | null;
lon: number | null;
lat: number | null;
locDc: string | null;
equipTpCd: string; // drone/plane/satellite
equipNm: string;
mediaTpCd: string; // 사진/영상/적외선/SAR/가시광/광학
takngDtm: string | null;
fileSz: string | null;
resolution: string | null;
}
// === CCTV_CAMERA ===
export interface CctvCameraItem {
cctvSn: number;
cameraNm: string;
regionNm: string;
lon: number | null;
lat: number | null;
locDc: string | null;
coordDc: string | null;
sttsCd: string; // LIVE/OFFLINE/MAINT
ptzYn: string;
sourceNm: string | null;
streamUrl: string | null;
}
// === SAT_REQUEST ===
export interface SatRequestItem {
satReqSn: number;
reqCd: string;
acdntSn: number | null;
lon: number | null;
lat: number | null;
zoneDc: string | null;
coordDc: string | null;
zoneAreaKm2: number | null;
satNm: string | null;
providerNm: string | null;
resolution: string | null;
purposeDc: string | null;
reqstrNm: string | null;
reqDtm: string | null;
expectedRcvDtm: string | null;
sttsCd: string; // PENDING/SHOOTING/COMPLETED/CANCELLED
}
export interface CreateSatRequestInput {
reqCd: string;
acdntSn?: number;
lon?: number;
lat?: number;
zoneDc?: string;
zoneAreaKm2?: number;
satNm?: string;
providerNm?: string;
resolution?: string;
purposeDc?: string;
reqstrNm?: string;
expectedRcvDtm?: string;
}
export async function fetchAerialMedia(params?: {
equipType?: string;
mediaType?: string;
acdntSn?: number;
search?: string;
}): Promise<AerialMediaItem[]> {
const response = await api.get<AerialMediaItem[]>('/aerial/media', { params });
return response.data;
}
export async function fetchCctvCameras(params?: {
region?: string;
status?: string;
}): Promise<CctvCameraItem[]> {
const response = await api.get<CctvCameraItem[]>('/aerial/cctv', { params });
return response.data;
}
export async function fetchSatRequests(params?: {
status?: string;
}): Promise<SatRequestItem[]> {
const response = await api.get<SatRequestItem[]>('/aerial/sat-requests', { params });
return response.data;
}
export async function createSatRequest(
input: CreateSatRequestInput,
): Promise<{ satReqSn: number }> {
const response = await api.post<{ satReqSn: number }>('/aerial/sat-requests', input);
return response.data;
}
// === DRONE STREAM ===
export interface DroneStreamItem {
id: string;
name: string;
shipName: string;
droneModel: string;
ip: string;
rtspUrl: string;
region: string;
status: 'idle' | 'starting' | 'streaming' | 'error';
hlsUrl: string | null;
error: string | null;
}
export async function fetchDroneStreams(): Promise<DroneStreamItem[]> {
const response = await api.get<DroneStreamItem[]>('/aerial/drone/streams');
return response.data;
}
export async function startDroneStreamApi(id: string): Promise<{ success: boolean; hlsUrl?: string; error?: string }> {
const response = await api.post<{ success: boolean; hlsUrl?: string; error?: string }>(`/aerial/drone/streams/${id}/start`);
return response.data;
}
export async function stopDroneStreamApi(id: string): Promise<{ success: boolean }> {
const response = await api.post<{ success: boolean }>(`/aerial/drone/streams/${id}/stop`);
return response.data;
}
// ============================================================
// UP42 위성 패스 조회
// ============================================================
export interface SatellitePass {
id: string;
satellite: string;
provider: string;
type: 'optical' | 'sar' | 'elevation';
resolution: string;
color: string;
startTime: string;
endTime: string;
maxElevation: number;
direction: 'ascending' | 'descending';
orbit: Array<{ lat: number; lon: number }>;
}
export async function fetchSatellitePasses(): Promise<SatellitePass[]> {
const response = await api.get<{ passes: SatellitePass[] }>('/aerial/satellite/passes');
return response.data.passes;
}