从用户那里获取 X KM 范围内的所有用户
Posted
技术标签:
【中文标题】从用户那里获取 X KM 范围内的所有用户【英文标题】:get all the users within X KM range from a user 【发布时间】:2015-04-26 20:41:43 【问题描述】:我有一组用户及其 gps 坐标。 我可以使用什么公式来获取 X KM 范围内的所有用户 来自用户?
我需要避免繁重的计算。 我正在考虑对数组进行排序,但我意识到这不是一个好主意,因为我必须为每个用户设置一个排序数组。
【问题讨论】:
您是否正在寻找一种启发式方法来避免对每个用户都使用 Haversine 公式?您是否尝试过这样做并确定它太慢了?因为 Haversine 真的不是一个“繁重的计算”。 Haversine 公式是这样的: hasrsine(lat1,lon1, lat2,lon2) 我想要一个这种形式的函数:function(lat1,lon1, XKM)。如果可以这种形式,我确实想使用 Haversine 公式。 但我真的更喜欢不会强迫我在阵列中的所有用户上运行的解决方案。 对每个用户运行应该真的没问题。我测试了我在下面发布的函数,我可以在 27 毫秒内针对 100,000 个用户的数组运行它。 【参考方案1】:使用Haversine公式查找距指定点指定距离内的用户:
function getNearbyUsers(lat, lng, distanceInKm, users)
var R = 6373;
var latRad = lat * Math.PI/180;
var lngRad = lng * Math.PI/180;
var returnUsers = [];
for (var i = 0; i < users.length; i++)
var lat2Rad = users[i].lat * Math.PI/180;
var lng2Rad = users[i].lng * Math.PI/180;
var dlat = lat2Rad - latRad;
var dlng = lng2Rad - lngRad;
var a = Math.pow(Math.sin(dlat/2),2) + Math.cos(latRad) * Math.cos(lat2Rad) * Math.pow(Math.sin(dlng/2),2);
var c = 2 * Math.atan2(Math.sqrt(a),Math.sqrt(1-a)); // great circle distance in radians
var d = c * R; // Distance from user in km
if (d < distanceInKm) returnUsers.push(users[i]);
return returnUsers;
【讨论】:
以上是关于从用户那里获取 X KM 范围内的所有用户的主要内容,如果未能解决你的问题,请参考以下文章