1

i made a script that gets the geolocation of the user, calculates the distance between the position and items in the object using the Haversine formula, and console.log the distances. My question is how can i console.log only the nearest item ? hope someone can help :)

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>

<p id="demo"></p>

<script>

var obj = [

{
    name:"location1",
    lat:60.413750, 
    long:5.322036
},
{
    name:"location2",
    lat:59.749054, 
    long:10.203781
},
{
    name:"location3",
    lat:59.286271, 
    long:11.109228
},
{
    name: "location4",
    lat:59.913869, 
    long:10.752245
}
];



var x = $("#demo");
var hblat ;
var hblong ;
var distance ;


if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(showDistance);
} else {
    x.html("Geolocation is not supported by this browser.");
}


function showDistance(position) {
    hblat = position.coords.latitude;
    hblong = position.coords.longitude;

    $.each(obj, function(key, value){
        distance = hbdistance(hblat, hblong, value.lat, value.long, 'K');

        console.log(Math.round(distance*1000)/1000);  
    }); 
}


function hbdistance(lat1, lon1, lat2, lon2, unit) {
        var radlat1 = Math.PI * lat1/180
        var radlat2 = Math.PI * lat2/180
        var radlon1 = Math.PI * lon1/180
        var radlon2 = Math.PI * lon2/180
        var theta = lon1-lon2
        var radtheta = Math.PI * theta/180
        var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
        dist = Math.acos(dist)
        dist = dist * 180/Math.PI
        dist = dist * 60 * 1.1515
        if (unit=="K") { dist = dist * 1.609344 }
        if (unit=="N") { dist = dist * 0.8684 }
        return dist
}

</script>


</body>
</html>
hb8
  • 83
  • 6

1 Answers1

1

In showDistance() you have an each block where you calculate the distances and that looks right. You're even logging them to console too, so we're almost there.

Let's go with a simple solution here and build up an array of distances:

function showDistance(position) {
    hblat = position.coords.latitude;
    hblong = position.coords.longitude;
    var distances = []; // Array to store distances
    $.each(obj, function(key, value){
        distance = hbdistance(hblat, hblong, value.lat, value.long, 'K');
        distances.push(distance); // Add our distance to the array
    }); 

    var min = Math.min.apply(Math, distances); // Get minimum value

    console.log(min); // Log minimum value
}

You can see another SO post which explains obtaining minimum values from arrays here: Obtain smallest value from array in Javascript?

Hope that helps!

Community
  • 1
  • 1
Dave Cooper
  • 10,494
  • 4
  • 30
  • 50