public Double calculateAngle(NavigationPosition other) {
   if (hasCoordinates() && other.hasCoordinates()) {
     Bearing bearing =
         calculateBearing(
             getLongitude(), getLatitude(), other.getLongitude(), other.getLatitude());
     return bearing.getAngle();
   }
   return null;
 }
 public Double calculateSpeed(NavigationPosition other) {
   if (getTime() != null && other.getTime() != null) {
     double interval =
         abs(getTime().getTimeInMillis() - other.getTime().getTimeInMillis()) / 1000.0;
     Double distance = calculateDistance(other);
     if (distance != null && interval > 0.0) return distance / interval * 3.6;
   }
   return null;
 }
 public Double calculateOrthogonalDistance(NavigationPosition pointA, NavigationPosition pointB) {
   if (hasCoordinates() && pointA.hasCoordinates() && pointB.hasCoordinates()) {
     Bearing bearingAD =
         calculateBearing(
             pointA.getLongitude(), pointA.getLatitude(), getLongitude(), getLatitude());
     Double distanceAtoD = bearingAD.getDistance();
     if (distanceAtoD != null) {
       double courseAtoD = toRadians(bearingAD.getAngle());
       double courseAtoB = toRadians(pointA.calculateAngle(pointB));
       return asin(sin(distanceAtoD / EARTH_RADIUS) * sin(courseAtoD - courseAtoB)) * EARTH_RADIUS;
     }
   }
   return null;
 }
 public Long calculateTime(NavigationPosition other) {
   if (getTime() != null && other.getTime() != null) {
     return other.getTime().getTimeInMillis() - getTime().getTimeInMillis();
   }
   return null;
 }
 public Double calculateElevation(NavigationPosition other) {
   if (getElevation() != null && other.getElevation() != null) {
     return other.getElevation() - getElevation();
   }
   return null;
 }
 public Double calculateDistance(NavigationPosition other) {
   return other.hasCoordinates()
       ? calculateDistance(other.getLongitude(), other.getLatitude())
       : null;
 }