2016-11-16 8 views
1

Я сделал сценарий, который получает геолокацию пользователя, вычисляет расстояние между позицией и элементами объекта, используя формулу Хаверсина, и console.log расстояния. Мой вопрос: как я могу console.log только ближайший элемент? надеюсь, что кто-то может помочь :)Получить ближайшее расстояние на основе геолокации

<!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> 

ответ

0

showDistance() В вас есть each блок, где вы вычислить расстояния и смотрит вправо. Вы даже регистрируете их для консоли, так что мы почти там.

Давайте идти с простым решением здесь и создать массив расстояний:

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 
} 

Вы можете увидеть другую SO пост, который объясняет получение минимального значения из массивов здесь: Obtain smallest value from array in Javascript?

Надежда, что помогает!

+1

Отлично! Большое спасибо Дэйву, это и получилось :) – hb8