Distance To Line Segment

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
 * http://www.movable-type.co.uk/scripts/latlon.js
 * 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 cloneObject(obj) {
    if (obj === null || typeof obj !== 'object') { return obj; }
    var temp = obj.constructor();
    for (var key in obj) { temp[key] = cloneObject(obj[key]); }
    return temp;
}

function findLines(items, maxDistance, minPoints) {
    var i = 0,
        j = 0,
        k = 0,
        p1 = {},
        p2 = {},
        p3 = {},
        R = 6371,
        distance = 0,
        line = {},
        lines = [];
    
    if (!maxDistance) { maxDistance = 1; } // 1km
    if (!minPoints) { minPoints = 3; } // 3 = start point, end point and at least one other point in line
    
    // loop through points to start line segment
    for (i = 0; i < items.length; i += 1) {
        p1 = new LatLon(items[i].lat, items[i].long);
        
        // loop through points to end the line segment
        for (j = (i + 1); j < items.length; j += 1) {
            p2 = new LatLon(items[j].lat, items[j].long);
            line = {
                name: 'Line ' + (lines.length + 1),
                points: [items[i], items[j]]
            };
            
            // loop through all other points and check minimum distance to line segment
            for (k = 0; k < items.length; k += 1) {
                if (k !== i && k !== j) {
                    p3 = new LatLon(items[k].lat, items[k].long);
                    distance = Math.abs(Math.asin(Math.sin(p1.distanceTo(p3) /...