Проверка на пересечение ЛВ Земли при расчете ПУУД
This commit is contained in:
+34
@@ -18,7 +18,10 @@ import space.nstart.pcp.pcp_request_service.service.SatelliteService
|
||||
import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionCalculationRequestDTO
|
||||
import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionModeDTO
|
||||
import space.nstart.pcp.pcp_types_lib.dto.ballistics.ExactTimePositionRequestDTO
|
||||
import space.nstart.pcp.pcp_types_lib.dto.ballistics.ObjDTO
|
||||
import space.nstart.pcp.pcp_types_lib.dto.ballistics.ObjViewRequestDTO
|
||||
import space.nstart.pcp.pcp_types_lib.dto.ballistics.OrbPointDTO
|
||||
import space.nstart.pcp.pcp_types_lib.dto.ballistics.PositionDTO
|
||||
import kotlin.math.PI
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.atan
|
||||
@@ -77,6 +80,7 @@ class AngularMotionService(
|
||||
|
||||
fun calculate(request: AngularMotionCalculationRequestDTO): AngularMotionCalculationResultDTO {
|
||||
validate(request)
|
||||
validateTargetVisibility(request)
|
||||
val defaultConfig = AngularMotionConfig()
|
||||
val config = AngularMotionConfig(
|
||||
focus = request.focusMm ?: defaultConfig.focus,
|
||||
@@ -146,6 +150,34 @@ class AngularMotionService(
|
||||
}
|
||||
}
|
||||
|
||||
private fun validateTargetVisibility(request: AngularMotionCalculationRequestDTO) {
|
||||
val windowStart = request.approximateTime.minusMinutes(TARGET_VISIBILITY_WINDOW_MINUTES)
|
||||
val windowStop = request.approximateTime.plusMinutes(TARGET_VISIBILITY_WINDOW_MINUTES)
|
||||
val visiblePoints = satelliteService.mplPoint(
|
||||
ObjViewRequestDTO(
|
||||
satellites = listOf(request.satelliteId),
|
||||
timeStart = windowStart,
|
||||
timeStop = windowStop,
|
||||
obj = ObjDTO(
|
||||
id = ANGULAR_MOTION_TARGET_ID,
|
||||
position = PositionDTO(
|
||||
lat = request.latitudeDeg,
|
||||
long = request.longitudeDeg,
|
||||
height = request.heightM,
|
||||
),
|
||||
),
|
||||
),
|
||||
).collectList().block().orEmpty()
|
||||
|
||||
if (visiblePoints.isEmpty()) {
|
||||
throw CustomValidationException(
|
||||
"Заданная точка не видна КА ${request.satelliteId} в окрестности времени " +
|
||||
"${request.approximateTime}: ${windowStart} — ${windowStop}. " +
|
||||
"Выберите другое время, точку или спутник.",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun loadOrbitalPoints(
|
||||
request: AngularMotionCalculationRequestDTO,
|
||||
config: AngularMotionConfig,
|
||||
@@ -198,5 +230,7 @@ class AngularMotionService(
|
||||
|
||||
private companion object {
|
||||
const val MAP_INTERVAL_MINUTES = 5L
|
||||
const val TARGET_VISIBILITY_WINDOW_MINUTES = 15L
|
||||
const val ANGULAR_MOTION_TARGET_ID = "angular-motion-target"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user