- 백엔드: 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>
158 lines
4.2 KiB
TypeScript
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;
|
|
}
|