Calculate cross track error

long lat, distance, bearing

by kmturley

HTML

<script src="http://www.movable-type.co.uk/scripts/latlon.js"></script>
<div id="output"></div>

JavaScript

/*
 * Minimum distance to line segment
 * by kmturley
 */

var points = [
    {
        name: 'London, UK',
        lat: 51.508422,
        long: -0.120329
    },
    {
        name: 'Rome, Italy',
        lat:  41.902128,
        long: 12.453630
    },
    {
        name: 'Cyrene, Libya',
        lat: 32.822286,
        long: 21.862405
    },
    {
        name: 'Istanbul, Turkey',
        lat: 41.005911,
        long: 28.975373
    },
    {
        name: 'Mohenjo-daro, Pakistan',
        lat: 27.325346,
        long: 68.133397
    }
];

function degreesToRadians(degrees) {
    return degrees * (Math.PI / 180);
}

function radiansToDegrees(radians) {
    return radians * (180 / Math.PI);
}

function cloneObject(obj) {
    if (obj === null || typeof obj !== 'object') {
        return obj;
    }
    var temp = obj.constructor(); // give temp the original obj's constructor
    for (var key in obj) {
        temp[key] = cloneObject(obj[key]);
    }
    return temp;
}

function distToSegment(lat1, lon1, lat2, lon2, lat3, lon3) {
    var y = Math.sin(lon3 - lon1) * Math.cos(lat3);
    var x = Math.cos(lat1) * Math.sin(lat3) - Math.sin(lat1) * Math.cos(lat3) * Math.cos(lat3 - lat1);
    var bearing1 = radiansToDegrees(Math.atan2(y, x));
    bearing1 = 360 - (bearing1 + 360 % 360);
    var y2 = Math.sin(lon2 - lon1) * Math.cos(lat2);
    var x2 = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lat2 - lat1);
    var bearing2 = radiansToDegrees(Math.atan2(y2, x2));
    bearing2 = 360 - (bearing2 + 360 % 360);
    var lat1Rads = degreesToRadians(lat1);
    var lat3Rads = degreesToRadians(lat3);
    var dLon = degreesToRadians(lon3 - lon1);
    var distanceAC = Math.acos(Math.sin(lat1Rads) * Math.sin(lat3Rads) + Math.cos(lat1Rads) * Math.cos(lat3Rads) * Math.cos(dLon)) * 6371;  
    var min_distance = Math.abs(Math.asin(Math.sin(distanceAC / 6371) * Math.sin(degreesToRadians(bearing1) - degreesToRadians(bearing2))) * 6371);
    return...