From 1203c58a232fdda407beb5b2e6ebacdd8a1db8c2 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 23 Mar 2018 02:18:47 +0100 Subject: [PATCH] Ref T259, Ref T243 utility functions for aircraft situation/elevation plane --- src/blackmisc/aviation/aircraftsituation.cpp | 6 ++++++ src/blackmisc/aviation/aircraftsituation.h | 3 +++ src/blackmisc/aviation/aircraftsituationlist.cpp | 15 +++++++++++++++ src/blackmisc/aviation/aircraftsituationlist.h | 6 ++++++ src/blackmisc/geo/elevationplane.cpp | 7 +++++++ src/blackmisc/geo/elevationplane.h | 8 +++++--- 6 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/blackmisc/aviation/aircraftsituation.cpp b/src/blackmisc/aviation/aircraftsituation.cpp index d63801742..0c4985aa4 100644 --- a/src/blackmisc/aviation/aircraftsituation.cpp +++ b/src/blackmisc/aviation/aircraftsituation.cpp @@ -381,6 +381,12 @@ namespace BlackMisc return gsKmh >= 1.0; } + bool CAircraftSituation::canLikelySkipNearGroundInterpolation() const + { + if (this->getGroundSpeed().value(CSpeedUnit::kts()) > 250) { return true; } + return false; + } + CLength CAircraftSituation::getDistancePerTime(const CTime &time) const { if (this->getGroundSpeed().isNull()) { return CLength(0, CLengthUnit::nullUnit()); } diff --git a/src/blackmisc/aviation/aircraftsituation.h b/src/blackmisc/aviation/aircraftsituation.h index ff29e221b..275efe8e2 100644 --- a/src/blackmisc/aviation/aircraftsituation.h +++ b/src/blackmisc/aviation/aircraftsituation.h @@ -274,6 +274,9 @@ namespace BlackMisc //! Is moving? Means ground speed > epsilon bool isMoving() const; + //! Situation looks like an aircraft not near ground + bool canLikelySkipNearGroundInterpolation() const; + //! Distance per time PhysicalQuantities::CLength getDistancePerTime(const PhysicalQuantities::CTime &time) const; diff --git a/src/blackmisc/aviation/aircraftsituationlist.cpp b/src/blackmisc/aviation/aircraftsituationlist.cpp index 4f2e04509..22242fd99 100644 --- a/src/blackmisc/aviation/aircraftsituationlist.cpp +++ b/src/blackmisc/aviation/aircraftsituationlist.cpp @@ -77,5 +77,20 @@ namespace BlackMisc { return this->findBy(&CAircraftSituation::hasInboundGroundInformation, hasGroundInfo); } + + bool CAircraftSituationList::hasSituationWithoutGroundElevation() const + { + return this->contains(&CAircraftSituation::hasGroundElevation, false); + } + + bool CAircraftSituationList::hasGroundElevationOutsideRange(const CLength &range) const + { + for (const CAircraftSituation &situation : *this) + { + if (!situation.hasGroundElevation()) { return true; } + if (situation.getGroundElevationPlane().getRadius() > range) { return true; } + } + return false; + } } // namespace } // namespace diff --git a/src/blackmisc/aviation/aircraftsituationlist.h b/src/blackmisc/aviation/aircraftsituationlist.h index 4b20d6453..b77fbe18b 100644 --- a/src/blackmisc/aviation/aircraftsituationlist.h +++ b/src/blackmisc/aviation/aircraftsituationlist.h @@ -62,6 +62,12 @@ namespace BlackMisc //! Find if having inbound information CAircraftSituationList findByInboundGroundInformation(bool hasGroundInfo) const; + + //! Any situation without ground info + bool hasSituationWithoutGroundElevation() const; + + //! Any situation outside range + bool hasGroundElevationOutsideRange(const PhysicalQuantities::CLength &range) const; }; } // namespace } // namespace diff --git a/src/blackmisc/geo/elevationplane.cpp b/src/blackmisc/geo/elevationplane.cpp index 600412c5d..4cfdbceaa 100644 --- a/src/blackmisc/geo/elevationplane.cpp +++ b/src/blackmisc/geo/elevationplane.cpp @@ -8,6 +8,7 @@ */ #include "elevationplane.h" +#include "coordinategeodetic.h" #include "blackmisc/pq/length.h" #include "blackmisc/propertyindex.h" @@ -27,6 +28,12 @@ namespace BlackMisc m_radius.valueRoundedWithUnit(2, i18n)); } + CElevationPlane::CElevationPlane(const ICoordinateGeodetic &coordinate, const ICoordinateGeodetic &rangeCoordinate) : + CCoordinateGeodetic(coordinate) + { + m_radius = this->calculateGreatCircleDistance(rangeCoordinate); + } + const CAltitude &CElevationPlane::getAltitudeIfWithinRadius(const ICoordinateGeodetic &coordinate) const { return (isWithinRange(coordinate)) ? geodeticHeight() : CAltitude::null(); diff --git a/src/blackmisc/geo/elevationplane.h b/src/blackmisc/geo/elevationplane.h index d8b06a338..cbbecc71e 100644 --- a/src/blackmisc/geo/elevationplane.h +++ b/src/blackmisc/geo/elevationplane.h @@ -21,8 +21,7 @@ namespace BlackMisc { //! Plane of same elevation, can be a single point or larger area (e.g. airport) //! \remark 100km/h 1sec => 28m - class BLACKMISC_EXPORT CElevationPlane : - public CValueObject + class BLACKMISC_EXPORT CElevationPlane : public CCoordinateGeodetic { public: //! Properties by index @@ -34,8 +33,11 @@ namespace BlackMisc //! Default constructor CElevationPlane() {} + //! Plane at given coordinates with range to 2nd coordinate + CElevationPlane(const ICoordinateGeodetic &coordinate, const ICoordinateGeodetic &rangeCoordinate); + //! Constructors from CCoordinateGeodetic - using CValueObject::CValueObject; + using CCoordinateGeodetic::CCoordinateGeodetic; //! Radius const PhysicalQuantities::CLength &getRadius() const { return m_radius; }