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) /...