Проверка на пересечение ЛВ Земли при расчете ПУУД
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.AngularMotionCalculationRequestDTO
|
||||||
import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionModeDTO
|
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.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.OrbPointDTO
|
||||||
|
import space.nstart.pcp.pcp_types_lib.dto.ballistics.PositionDTO
|
||||||
import kotlin.math.PI
|
import kotlin.math.PI
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import kotlin.math.atan
|
import kotlin.math.atan
|
||||||
@@ -77,6 +80,7 @@ class AngularMotionService(
|
|||||||
|
|
||||||
fun calculate(request: AngularMotionCalculationRequestDTO): AngularMotionCalculationResultDTO {
|
fun calculate(request: AngularMotionCalculationRequestDTO): AngularMotionCalculationResultDTO {
|
||||||
validate(request)
|
validate(request)
|
||||||
|
validateTargetVisibility(request)
|
||||||
val defaultConfig = AngularMotionConfig()
|
val defaultConfig = AngularMotionConfig()
|
||||||
val config = AngularMotionConfig(
|
val config = AngularMotionConfig(
|
||||||
focus = request.focusMm ?: defaultConfig.focus,
|
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(
|
private fun loadOrbitalPoints(
|
||||||
request: AngularMotionCalculationRequestDTO,
|
request: AngularMotionCalculationRequestDTO,
|
||||||
config: AngularMotionConfig,
|
config: AngularMotionConfig,
|
||||||
@@ -198,5 +230,7 @@ class AngularMotionService(
|
|||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
const val MAP_INTERVAL_MINUTES = 5L
|
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