109 lines
3.5 KiB
TypeScript
109 lines
3.5 KiB
TypeScript
import { RedisService } from '../common/redis.service';
|
|
import { ArtilleryMissionRequestDto, TacticalSymbolDto } from './dto/tactical.dto';
|
|
export interface LosPoint {
|
|
index: number;
|
|
distanceMeters: number;
|
|
lat: number;
|
|
lng: number;
|
|
groundElevationMeters: number;
|
|
earthCurvatureSagittaMeters: number;
|
|
apparentElevationMeters: number;
|
|
sightRayElevationMeters: number;
|
|
marginMeters: number;
|
|
isVisible: boolean;
|
|
isDeadGround: boolean;
|
|
horizonAngleMils: number;
|
|
}
|
|
export interface LineOfSightResponse {
|
|
isDirectlyVisible: boolean;
|
|
status: 'CLEAR_LINE_OF_SIGHT' | 'OBSTRUCTED';
|
|
statusAr: string;
|
|
summary: {
|
|
totalDistanceMeters: number;
|
|
totalDistanceKm: number;
|
|
azimuthDegrees: number;
|
|
verticalAngleDegrees: number;
|
|
verticalAngleMilsNato: number;
|
|
verticalAngleMilsSoviet: number;
|
|
observerGroundElevationMeters: number;
|
|
observerTotalElevationMeters: number;
|
|
targetGroundElevationMeters: number;
|
|
targetTotalElevationMeters: number;
|
|
minElevationMeters: number;
|
|
maxElevationMeters: number;
|
|
deadGroundPercentage: number;
|
|
samplePointsCount: number;
|
|
stepMeters?: number;
|
|
};
|
|
highestObstacle: {
|
|
distanceMeters: number;
|
|
lat: number;
|
|
lng: number;
|
|
elevationMeters: number;
|
|
sightRayElevationMeters: number;
|
|
penetrationMeters: number;
|
|
} | null;
|
|
observer: {
|
|
lat: number;
|
|
lng: number;
|
|
heightOffsetMeters: number;
|
|
groundElevationMeters: number;
|
|
totalElevationMeters: number;
|
|
};
|
|
target: {
|
|
lat: number;
|
|
lng: number;
|
|
heightOffsetMeters: number;
|
|
groundElevationMeters: number;
|
|
totalElevationMeters: number;
|
|
};
|
|
profile?: LosPoint[];
|
|
}
|
|
export declare class TacticalService {
|
|
private readonly redisService;
|
|
private readonly logger;
|
|
constructor(redisService: RedisService);
|
|
computeLineOfSight(observerLat: number, observerLng: number, targetLat: number, targetLng: number, observerHeight?: number, targetHeight?: number, samplesCount?: number, stepMeters?: number, compact?: boolean): Promise<LineOfSightResponse>;
|
|
calculateArtilleryFireMission(dto: ArtilleryMissionRequestDto): Promise<{
|
|
fireMissionId: string;
|
|
caliber: string;
|
|
muzzleVelocityMs: number;
|
|
distanceMeters: number;
|
|
distanceKm: number;
|
|
azimuthDegrees: number;
|
|
azimuthMils: number;
|
|
gunElevationMeters: number;
|
|
targetElevationMeters: number;
|
|
apexAltitudeMeters: number;
|
|
timeOfFlightSeconds: number;
|
|
lowAngle: {
|
|
degrees: number;
|
|
mils: number;
|
|
};
|
|
highAngle: {
|
|
degrees: number;
|
|
mils: number;
|
|
};
|
|
hasCrestClearance: boolean;
|
|
criticalObstacle: any;
|
|
trajectoryPoints: any[];
|
|
}>;
|
|
assessHelicopterLandingZones(lat: number, lng: number, radiusMeters?: number): Promise<{
|
|
centerLat: number;
|
|
centerLng: number;
|
|
searchRadiusMeters: number;
|
|
totalAssessed: number;
|
|
suitableCount: number;
|
|
zones: any[];
|
|
}>;
|
|
saveScenario(name: string, symbols: TacticalSymbolDto[]): Promise<{
|
|
success: boolean;
|
|
count: number;
|
|
name: string;
|
|
}>;
|
|
getScenario(name: string): Promise<TacticalSymbolDto[]>;
|
|
private haversineDistance;
|
|
private calculateBearing;
|
|
private estimateElevation;
|
|
}
|