根据经度和纬度计算最近位置(来自数据库)的算法
Algorithm to calculate the nearest location (from the database) based on logitude & latitude
我想做的是开发一种算法来计算哪些已知位置最接近所选位置。
假设我在数据库中有 7 个位置,当用户选择一个位置时,他应该可以选择查看前 3 个最近的位置(来自数据库)。在数据库中,每个位置都保存有经纬度。
知道我该怎么做吗?
示例:假设列表包含 100 个自行车站位置。我在第 5 站,我想知道列表中的其他站在附近。不是距离,而是位置。
您可以查看有关如何计算它的一个很好的例子here。
来自这个网站:
var R = 6371e3; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();
var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
Math.cos(φ1) * Math.cos(φ2) *
Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c; //<-- distance between lat1/lon1 and lat2/lon2
好问题,假设我们在数据库中有以下三个值:
var dataFromDb = [{
"location": "First location",
"lat": "1.28210155945393",
"lng": "103.81722480263163",
}, {
"location": "Second location",
"lat": "1.2777380589964",
"lng": "103.83749709165197",
"location": "Stop 2"
}, {
"location": "Third Location",
"lat": "1.27832046633393",
"lng": "103.83762574759974",
}];
为两地之间的距离创建一个函数:
function distanceBetweenTwoPlace(firstLat, firstLon, secondLat, secondLon, unit) {
var firstRadlat = Math.PI * firstLat/180
var secondRadlat = Math.PI * secondLat/180
var theta = firstLon-secondLon;
var radtheta = Math.PI * theta/180
var distance = Math.sin(firstRadlat) * Math.sin(secondRadlat) + Math.cos(firstRadlat) * Math.cos(secondRadlat) * Math.cos(radtheta);
if (distance > 1) {
distance = 1;
}
distance = Math.acos(distance)
distance = distance * 180/Math.PI
distance = distance * 60 * 1.1515
if (unit=="K") { distance = distance * 1.609344 }
if (unit=="N") { distance = distance * 0.8684 }
return distance
}
定义当前位置:
var currentLat = 1.28210155945393;
var currentLng = 103.81722480263163;
查找 1KM 以内的记录:
for (var i = 0; i < data.length; i++) {
if (distance(currentLat, currentLng, data[i].lat, data[i].lng, "K") <= 1) {
console.log(data[i].location);
}
}
我想做的是开发一种算法来计算哪些已知位置最接近所选位置。 假设我在数据库中有 7 个位置,当用户选择一个位置时,他应该可以选择查看前 3 个最近的位置(来自数据库)。在数据库中,每个位置都保存有经纬度。
知道我该怎么做吗?
示例:假设列表包含 100 个自行车站位置。我在第 5 站,我想知道列表中的其他站在附近。不是距离,而是位置。
您可以查看有关如何计算它的一个很好的例子here。
来自这个网站:
var R = 6371e3; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();
var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
Math.cos(φ1) * Math.cos(φ2) *
Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c; //<-- distance between lat1/lon1 and lat2/lon2
好问题,假设我们在数据库中有以下三个值:
var dataFromDb = [{
"location": "First location",
"lat": "1.28210155945393",
"lng": "103.81722480263163",
}, {
"location": "Second location",
"lat": "1.2777380589964",
"lng": "103.83749709165197",
"location": "Stop 2"
}, {
"location": "Third Location",
"lat": "1.27832046633393",
"lng": "103.83762574759974",
}];
为两地之间的距离创建一个函数:
function distanceBetweenTwoPlace(firstLat, firstLon, secondLat, secondLon, unit) {
var firstRadlat = Math.PI * firstLat/180
var secondRadlat = Math.PI * secondLat/180
var theta = firstLon-secondLon;
var radtheta = Math.PI * theta/180
var distance = Math.sin(firstRadlat) * Math.sin(secondRadlat) + Math.cos(firstRadlat) * Math.cos(secondRadlat) * Math.cos(radtheta);
if (distance > 1) {
distance = 1;
}
distance = Math.acos(distance)
distance = distance * 180/Math.PI
distance = distance * 60 * 1.1515
if (unit=="K") { distance = distance * 1.609344 }
if (unit=="N") { distance = distance * 0.8684 }
return distance
}
定义当前位置:
var currentLat = 1.28210155945393;
var currentLng = 103.81722480263163;
查找 1KM 以内的记录:
for (var i = 0; i < data.length; i++) {
if (distance(currentLat, currentLng, data[i].lat, data[i].lng, "K") <= 1) {
console.log(data[i].location);
}
}