Ref T390, Ref T372, check for equal coordinates to avoid NaN

This commit is contained in:
Klaus Basan
2018-10-04 17:19:09 +02:00
parent c42900f959
commit 484d89dd85
2 changed files with 12 additions and 1 deletions

View File

@@ -66,9 +66,18 @@ namespace BlackSample
CCoordinateGeodetic geo2(geoVector);
deltaLat = geo2.latitude() - lat;
deltaLng = geo2.longitude() - lng;
out << deltaLat.valueRoundedWithUnit(digits) << " " << deltaLng.valueRoundedWithUnit(digits) << endl;
// Heading/bearing of same values
CAngle bearing = geo.calculateBearing(geo);
CLength distance = geo.calculateGreatCircleDistance(geo);
out << bearing.valueRoundedWithUnit(CAngleUnit::deg(), 2) << " " << distance.valueRoundedWithUnit(CLengthUnit::m(), 2) << endl;
const CCoordinateGeodetic nullCoordinate;
bearing = geo.calculateBearing(nullCoordinate);
distance = geo.calculateGreatCircleDistance(nullCoordinate);
out << bearing.valueRoundedWithUnit(CAngleUnit::deg(), 2) << " " << distance.valueRoundedWithUnit(CLengthUnit::m(), 2) << endl;
// bye
out << "-----------------------------------------------" << endl;
return 0;

View File

@@ -43,6 +43,7 @@ namespace BlackMisc
CLength calculateGreatCircleDistance(const ICoordinateGeodetic &coordinate1, const ICoordinateGeodetic &coordinate2)
{
if (coordinate1.isNull() || coordinate2.isNull()) { return CLength::null(); }
// if (coordinate1.equalNormalVectorDouble(coordinate2)) { return CLength(0, CLengthUnit::defaultUnit()); }
static const float earthRadiusMeters = 6371000.8f;
const QVector3D v1 = coordinate1.normalVector();
const QVector3D v2 = coordinate2.normalVector();
@@ -53,6 +54,7 @@ namespace BlackMisc
CAngle calculateBearing(const ICoordinateGeodetic &coordinate1, const ICoordinateGeodetic &coordinate2)
{
if (coordinate1.isNull() || coordinate2.isNull()) { return CAngle::null(); }
// if (coordinate1.equalNormalVectorDouble(coordinate2)) { return CAngle(0, CAngleUnit::defaultUnit()); } // null or 0?
static const QVector3D northPole { 0, 0, 1 };
const QVector3D c1 = QVector3D::crossProduct(coordinate1.normalVector(), coordinate2.normalVector());
const QVector3D c2 = QVector3D::crossProduct(coordinate1.normalVector(), northPole);