kevinulrich/greatCircle

View on GitHub
lib/Vector.js

Summary

Maintainability
A
0 mins
Test Coverage
"use strict";

const earthRadius = 6371000;

class Vector {
    constructor(start, end) {
        this.start = start || null;
        this.end = end || null;
    }

    invert() {
        var start = this.start;
        var end = this.end;

        this.start = end;
        this.end = start;

        return this;
    }

    getDistance() {
        if(!this.isValid()) {
            throw new Error('Vector is invalid');
        }

        var radLatFrom = Vector.floatToRadians(this.start.latitude);
        var radLatTo = Vector.floatToRadians(this.end.latitude);

        var radDeltaLat = Vector.floatToRadians(this.end.latitude - this.start.latitude);
        var radDeltaLon = Vector.floatToRadians(this.end.longitude - this.start.longitude);

        var a = Math.sin(radDeltaLat / 2) * Math.sin(radDeltaLat / 2) +
                Math.cos(radLatFrom) * Math.cos(radLatTo) *
                Math.sin(radDeltaLon / 2) * Math.sin(radDeltaLon / 2);

        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        // Precision less than a meter is not really accurate here

        return parseInt(earthRadius * c);
    }

    isValid() {
        if(this.start === null || this.end === null) {
            return false;
        }

        if(this.start.constructor.name !== 'Point' || this.end.constructor.name !== 'Point') {
            return false;
        }

        if(!this.start.isValid() || !this.end.isValid()) {
            return false;
        }

        return true;
    }


    /**
     * Convert a degree as floating point number to degree radians
     * @param  {number} number The input degree
     * @return {number}        Degree Radians
     * @static
     */
    static floatToRadians(number) {
        return number * Math.PI / 180;
    }
}

module.exports = Vector;