mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-17 10:55:32 +08:00
Ref T773, use closest positions for average height/elevation values
Testing with XPlane: * even in EDDF the field elevations vary from 353-368ft, which means a difference of 15ft or 4m * that means it is important to use the closest values
This commit is contained in:
committed by
Mat Sutcliffe
parent
57153d45d7
commit
ec92b6dc46
@@ -1423,10 +1423,11 @@ namespace BlackCore
|
|||||||
bool fromNonMoving = false;
|
bool fromNonMoving = false;
|
||||||
bool triedExtrapolation = false;
|
bool triedExtrapolation = false;
|
||||||
bool couldNotExtrapolate = false;
|
bool couldNotExtrapolate = false;
|
||||||
|
|
||||||
CElevationPlane averagePlane = this->averageElevationOfOnGroundAircraft(situation, CElevationPlane::majorAirportRadius(), 2, 3);
|
CElevationPlane averagePlane = this->averageElevationOfOnGroundAircraft(situation, CElevationPlane::majorAirportRadius(), 2, 3);
|
||||||
if (averagePlane.isNull())
|
if (averagePlane.isNull())
|
||||||
{
|
{
|
||||||
averagePlane = this->averageElevationOfNonMovingAircraft(situation, CElevationPlane::majorAirportRadius(), 2);
|
averagePlane = this->averageElevationOfNonMovingAircraft(situation, CElevationPlane::majorAirportRadius(), 2, 3);
|
||||||
fromNonMoving = true;
|
fromNonMoving = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1181,9 +1181,9 @@ namespace BlackCore
|
|||||||
return m_airspace->getLatestAirspaceAircraftSnapshot();
|
return m_airspace->getLatestAirspaceAircraftSnapshot();
|
||||||
}
|
}
|
||||||
|
|
||||||
CElevationPlane CContextNetwork::averageElevationOfNonMovingAircraft(const CAircraftSituation &reference, const CLength &range, int minValues) const
|
CElevationPlane CContextNetwork::averageElevationOfNonMovingAircraft(const CAircraftSituation &reference, const CLength &range, int minValues, int sufficientValues) const
|
||||||
{
|
{
|
||||||
return m_airspace->averageElevationOfNonMovingAircraft(reference, range, minValues);
|
return m_airspace->averageElevationOfNonMovingAircraft(reference, range, minValues, sufficientValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CContextNetwork::setClients(const CClientList &clients)
|
void CContextNetwork::setClients(const CClientList &clients)
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ namespace BlackCore
|
|||||||
virtual void rememberCGFromDB(const BlackMisc::PhysicalQuantities::CLength &cgFromDB, const BlackMisc::Aviation::CCallsign &callsign) override;
|
virtual void rememberCGFromDB(const BlackMisc::PhysicalQuantities::CLength &cgFromDB, const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||||
virtual void rememberCGFromDB(const BlackMisc::PhysicalQuantities::CLength &cgFromDB, const QString &modelString) override;
|
virtual void rememberCGFromDB(const BlackMisc::PhysicalQuantities::CLength &cgFromDB, const QString &modelString) override;
|
||||||
virtual BlackMisc::Simulation::CAirspaceAircraftSnapshot getLatestAirspaceAircraftSnapshot() const override;
|
virtual BlackMisc::Simulation::CAirspaceAircraftSnapshot getLatestAirspaceAircraftSnapshot() const override;
|
||||||
virtual BlackMisc::Geo::CElevationPlane averageElevationOfNonMovingAircraft(const BlackMisc::Aviation::CAircraftSituation &reference, const BlackMisc::PhysicalQuantities::CLength &range, int minValues = 1) const override;
|
virtual BlackMisc::Geo::CElevationPlane averageElevationOfNonMovingAircraft(const BlackMisc::Aviation::CAircraftSituation &reference, const BlackMisc::PhysicalQuantities::CLength &range, int minValues = 1, int sufficientValues = 2) const override;
|
||||||
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
||||||
QObject *receiver,
|
QObject *receiver,
|
||||||
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
|
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
|
||||||
|
|||||||
@@ -611,25 +611,25 @@ namespace BlackMisc
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
CElevationPlane CAircraftSituationList::averageElevationOfTaxiingOnGroundAircraft(const CAircraftSituation &reference, const CLength &range, int minValues) const
|
CElevationPlane CAircraftSituationList::averageElevationOfTaxiingOnGroundAircraft(const CAircraftSituation &reference, const CLength &range, int minValues, int sufficientValues) const
|
||||||
{
|
{
|
||||||
if (this->size() < minValues) { return CElevationPlane::null(); } // no change to succeed
|
if (this->size() < minValues) { return CElevationPlane::null(); } // no change to succeed
|
||||||
|
|
||||||
|
const CAircraftSituationList sorted = this->findWithGeodeticMSLHeight().findWithinRange(reference, range).sortedByEuclideanDistanceSquared(reference);
|
||||||
|
if (sorted.size() < minValues) { return CElevationPlane::null(); }
|
||||||
QList<double> valuesInFt;
|
QList<double> valuesInFt;
|
||||||
int count = 0;
|
|
||||||
for (const CAircraftSituation &situation : *this)
|
for (const CAircraftSituation &situation : *this)
|
||||||
{
|
{
|
||||||
if (situation.getGroundElevationInfo() != CAircraftSituation::FromProvider) { continue; }
|
if (situation.getGroundElevationInfo() != CAircraftSituation::FromProvider) { continue; }
|
||||||
const bool canUse = !situation.isMoving() || (situation.isOnGroundFromNetwork() || situation.isOnGroundFromParts());
|
const bool canUse = !situation.isMoving() || (situation.isOnGroundFromNetwork() || situation.isOnGroundFromParts());
|
||||||
if (!canUse) { continue; }
|
if (!canUse) { continue; }
|
||||||
if (!situation.isWithinRange(reference, range)) { continue; }
|
|
||||||
const double elvFt = situation.getGroundElevationPlane().getAltitude().value(CLengthUnit::ft());
|
const double elvFt = situation.getGroundElevationPlane().getAltitude().value(CLengthUnit::ft());
|
||||||
valuesInFt.push_back(elvFt);
|
valuesInFt.push_back(elvFt);
|
||||||
count++;
|
if (valuesInFt.size() >= sufficientValues) { break; }
|
||||||
if (count > 5 && valuesInFt.size() > 3 * minValues) { break; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count < minValues) { return CElevationPlane::null(); }
|
if (valuesInFt.size() < minValues) { return CElevationPlane::null(); }
|
||||||
|
|
||||||
static const double MaxDevFt = CAircraftSituationChange::allowedAltitudeDeviation().value(CLengthUnit::ft());
|
static const double MaxDevFt = CAircraftSituationChange::allowedAltitudeDeviation().value(CLengthUnit::ft());
|
||||||
const QPair<double, double> elvStdDevMean = CMathUtils::standardDeviationAndMean(valuesInFt);
|
const QPair<double, double> elvStdDevMean = CMathUtils::standardDeviationAndMean(valuesInFt);
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ namespace BlackMisc
|
|||||||
int transferElevationForward(const PhysicalQuantities::CLength &radius = Geo::CElevationPlane::singlePointRadius());
|
int transferElevationForward(const PhysicalQuantities::CLength &radius = Geo::CElevationPlane::singlePointRadius());
|
||||||
|
|
||||||
//! Average elevation for "nearby" aircraft "not/slowly moving" and having an elevation
|
//! Average elevation for "nearby" aircraft "not/slowly moving" and having an elevation
|
||||||
Geo::CElevationPlane averageElevationOfTaxiingOnGroundAircraft(const CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues = 1) const;
|
Geo::CElevationPlane averageElevationOfTaxiingOnGroundAircraft(const CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues = 1, int sufficientValues = 2) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Situation per callsign
|
//! Situation per callsign
|
||||||
|
|||||||
@@ -27,23 +27,23 @@ namespace BlackMisc
|
|||||||
CSequence<CCoordinateGeodetic>(other)
|
CSequence<CCoordinateGeodetic>(other)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
CElevationPlane CCoordinateGeodeticList::averageGeodeticHeight(const CCoordinateGeodetic &reference, const CLength &range, const CLength &maxDeviation, int minValues) const
|
CElevationPlane CCoordinateGeodeticList::averageGeodeticHeight(const CCoordinateGeodetic &reference, const CLength &range, const CLength &maxDeviation, int minValues, int sufficentValues) const
|
||||||
{
|
{
|
||||||
if (this->size() < minValues) { return CElevationPlane::null(); } // no change to succeed
|
if (this->size() < minValues) { return CElevationPlane::null(); } // no change to succeed
|
||||||
|
|
||||||
QList<double> valuesInFt;
|
QList<double> valuesInFt;
|
||||||
int count = 0;
|
const CCoordinateGeodeticList sorted = this->findWithGeodeticMSLHeight().findWithinRange(reference, range).sortedByEuclideanDistanceSquared(reference);
|
||||||
for (const CCoordinateGeodetic &coordinate : *this)
|
if (sorted.size() < minValues) { return CElevationPlane::null(); }
|
||||||
|
|
||||||
|
// we know all values have MSL and are within range
|
||||||
|
for (const CCoordinateGeodetic &coordinate : sorted)
|
||||||
{
|
{
|
||||||
if (!coordinate.hasMSLGeodeticHeight()) { continue; }
|
|
||||||
if (!coordinate.isWithinRange(reference, range)) { continue; }
|
|
||||||
const double elvFt = coordinate.geodeticHeight().value(CLengthUnit::ft());
|
const double elvFt = coordinate.geodeticHeight().value(CLengthUnit::ft());
|
||||||
valuesInFt.push_back(elvFt);
|
valuesInFt.push_back(elvFt);
|
||||||
count++;
|
if (valuesInFt.size() >= sufficentValues) { break; }
|
||||||
if (count > 5 && valuesInFt.size() > 3 * minValues) { break; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count < minValues) { return CElevationPlane::null(); }
|
if (valuesInFt.size() < minValues) { return CElevationPlane::null(); }
|
||||||
|
|
||||||
const double MaxDevFt = maxDeviation.value(CLengthUnit::ft());
|
const double MaxDevFt = maxDeviation.value(CLengthUnit::ft());
|
||||||
const QPair<double, double> elvStdDevMean = CMathUtils::standardDeviationAndMean(valuesInFt);
|
const QPair<double, double> elvStdDevMean = CMathUtils::standardDeviationAndMean(valuesInFt);
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace BlackMisc
|
|||||||
CCoordinateGeodeticList(const CSequence<CCoordinateGeodetic> &other);
|
CCoordinateGeodeticList(const CSequence<CCoordinateGeodetic> &other);
|
||||||
|
|
||||||
//! Average height within range and having an height
|
//! Average height within range and having an height
|
||||||
CElevationPlane averageGeodeticHeight(const CCoordinateGeodetic &reference, const PhysicalQuantities::CLength &range, const PhysicalQuantities::CLength &maxDeviation = PhysicalQuantities::CLength(1.0, PhysicalQuantities::CLengthUnit::m()), int minValues = 3) const;
|
CElevationPlane averageGeodeticHeight(const CCoordinateGeodetic &reference, const PhysicalQuantities::CLength &range, const PhysicalQuantities::CLength &maxDeviation = PhysicalQuantities::CLength(1.0, PhysicalQuantities::CLengthUnit::m()), int minValues = 3, int sufficentValues = 5) const;
|
||||||
};
|
};
|
||||||
} //namespace
|
} //namespace
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -767,10 +767,10 @@ namespace BlackMisc
|
|||||||
return m_partsLastModified.value(callsign, -1);
|
return m_partsLastModified.value(callsign, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
CElevationPlane CRemoteAircraftProvider::averageElevationOfNonMovingAircraft(const CAircraftSituation &reference, const CLength &range, int minValues) const
|
CElevationPlane CRemoteAircraftProvider::averageElevationOfNonMovingAircraft(const CAircraftSituation &reference, const CLength &range, int minValues, int sufficientValues) const
|
||||||
{
|
{
|
||||||
const CAircraftSituationList situations = this->latestOnGroundProviderElevations();
|
const CAircraftSituationList situations = this->latestOnGroundProviderElevations();
|
||||||
return situations.averageElevationOfTaxiingOnGroundAircraft(reference, range, minValues);
|
return situations.averageElevationOfTaxiingOnGroundAircraft(reference, range, minValues, sufficientValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CRemoteAircraftProvider::testAddAltitudeOffset(const CCallsign &callsign, const CLength &offset)
|
bool CRemoteAircraftProvider::testAddAltitudeOffset(const CCallsign &callsign, const CLength &offset)
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ namespace BlackMisc
|
|||||||
//! Average elevation of aircraft in given range, which are NOT moving
|
//! Average elevation of aircraft in given range, which are NOT moving
|
||||||
//! \remark can be used to anticipate field elevation
|
//! \remark can be used to anticipate field elevation
|
||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
virtual Geo::CElevationPlane averageElevationOfNonMovingAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues = 1) const = 0;
|
virtual Geo::CElevationPlane averageElevationOfNonMovingAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues = 1, int sufficientValues = 2) const = 0;
|
||||||
|
|
||||||
//! Connect signals to slot receiver. As the interface is no QObject, slots can not be connected directly.
|
//! Connect signals to slot receiver. As the interface is no QObject, slots can not be connected directly.
|
||||||
//! In order to disconnect a list of connections is provided, which have to be disconnected manually.
|
//! In order to disconnect a list of connections is provided, which have to be disconnected manually.
|
||||||
@@ -344,7 +344,7 @@ namespace BlackMisc
|
|||||||
virtual int aircraftPartsAdded() const override;
|
virtual int aircraftPartsAdded() const override;
|
||||||
virtual qint64 situationsLastModified(const Aviation::CCallsign &callsign) const override;
|
virtual qint64 situationsLastModified(const Aviation::CCallsign &callsign) const override;
|
||||||
virtual qint64 partsLastModified(const Aviation::CCallsign &callsign) const override;
|
virtual qint64 partsLastModified(const Aviation::CCallsign &callsign) const override;
|
||||||
virtual Geo::CElevationPlane averageElevationOfNonMovingAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues = 1) const override;
|
virtual Geo::CElevationPlane averageElevationOfNonMovingAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues = 1, int sufficientValues = 2) const override;
|
||||||
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
|
||||||
QObject *receiver,
|
QObject *receiver,
|
||||||
std::function<void(const Aviation::CAircraftSituation &)> addedSituationSlot,
|
std::function<void(const Aviation::CAircraftSituation &)> addedSituationSlot,
|
||||||
|
|||||||
@@ -167,10 +167,10 @@ namespace BlackMisc
|
|||||||
return m_elvCoordinatesGnd;
|
return m_elvCoordinatesGnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
CElevationPlane ISimulationEnvironmentProvider::averageElevationOfOnGroundAircraft(const CAircraftSituation &reference, const CLength &range, int minValues) const
|
CElevationPlane ISimulationEnvironmentProvider::averageElevationOfOnGroundAircraft(const CAircraftSituation &reference, const CLength &range, int minValues, int sufficientValues) const
|
||||||
{
|
{
|
||||||
const CCoordinateGeodeticList coordinates = this->getElevationCoordinatesOnGround();
|
const CCoordinateGeodeticList coordinates = this->getElevationCoordinatesOnGround();
|
||||||
return coordinates.averageGeodeticHeight(reference, range, CAircraftSituationChange::allowedAltitudeDeviation(), minValues);
|
return coordinates.averageGeodeticHeight(reference, range, CAircraftSituationChange::allowedAltitudeDeviation(), minValues, sufficientValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
CAltitude ISimulationEnvironmentProvider::highestElevation() const
|
CAltitude ISimulationEnvironmentProvider::highestElevation() const
|
||||||
@@ -592,10 +592,10 @@ namespace BlackMisc
|
|||||||
return this->provider()->findClosestElevationWithinRangeOrRequest(reference, range, callsign);
|
return this->provider()->findClosestElevationWithinRangeOrRequest(reference, range, callsign);
|
||||||
}
|
}
|
||||||
|
|
||||||
CElevationPlane CSimulationEnvironmentAware::averageElevationOfOnGroundAircraft(const CAircraftSituation &reference, const CLength &range, int minValues) const
|
CElevationPlane CSimulationEnvironmentAware::averageElevationOfOnGroundAircraft(const CAircraftSituation &reference, const CLength &range, int minValues, int sufficientValues) const
|
||||||
{
|
{
|
||||||
if (!this->hasProvider()) { return CElevationPlane::null(); }
|
if (!this->hasProvider()) { return CElevationPlane::null(); }
|
||||||
return this->provider()->averageElevationOfOnGroundAircraft(reference, range, minValues);
|
return this->provider()->averageElevationOfOnGroundAircraft(reference, range, minValues, sufficientValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
CAltitude CSimulationEnvironmentAware::highestElevation() const
|
CAltitude CSimulationEnvironmentAware::highestElevation() const
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ namespace BlackMisc
|
|||||||
|
|
||||||
//! Average elevation of "on ground" cached values
|
//! Average elevation of "on ground" cached values
|
||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
Geo::CElevationPlane averageElevationOfOnGroundAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues) const;
|
Geo::CElevationPlane averageElevationOfOnGroundAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues, int sufficientValues) const;
|
||||||
|
|
||||||
//! Highest elevation
|
//! Highest elevation
|
||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
@@ -298,7 +298,7 @@ namespace BlackMisc
|
|||||||
Geo::CElevationPlane findClosestElevationWithinRangeOrRequest(const Geo::ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range, const Aviation::CCallsign &callsign);
|
Geo::CElevationPlane findClosestElevationWithinRangeOrRequest(const Geo::ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range, const Aviation::CCallsign &callsign);
|
||||||
|
|
||||||
//! \copydoc ISimulationEnvironmentProvider::averageElevationOfOnGroundAircraft
|
//! \copydoc ISimulationEnvironmentProvider::averageElevationOfOnGroundAircraft
|
||||||
Geo::CElevationPlane averageElevationOfOnGroundAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues) const;
|
Geo::CElevationPlane averageElevationOfOnGroundAircraft(const Aviation::CAircraftSituation &reference, const PhysicalQuantities::CLength &range, int minValues, int sufficientValues) const;
|
||||||
|
|
||||||
//! \copydoc ISimulationEnvironmentProvider::highestElevation
|
//! \copydoc ISimulationEnvironmentProvider::highestElevation
|
||||||
Aviation::CAltitude highestElevation() const;
|
Aviation::CAltitude highestElevation() const;
|
||||||
|
|||||||
Reference in New Issue
Block a user