我应该使用什么NPM包来找到最近的城市。

时间:2011-11-27 11:55:08

标签: mongodb node.js geolocation ip-address

我正在使用Node.js和MongoDB。 假设我预定了几个城市(例如西雅图,迈阿密,纽约)和Lat&经度。并且有用户点击我的网站,我知道他的IP地址,并找到lat& LON。然后我想知道我定义的哪个城市最接近用户。

我知道我可以使用Mongo的地理空间功能来做到这一点。但是使用DB来计算每个Web请求的数量会非常“昂贵”。

是否有Node.js NPM软件包可以像上面描述的那样执行地理特征?

2 个答案:

答案 0 :(得分:5)

您正在使用多少个“预定义”城市?如果它是一个小数字,你可能只是将列表存储在内存中并进行线性扫描。 此外,您可能只是尝试给mongo地理空间查询尝试以确定它究竟有多贵,然后再假设它是不合理的 - 如果您为城市位置编制索引,那么它将非常快...... 如果你正在处理很多问题,仍然不想依赖mongo地理索引,并且需要一些非常专业的东西,也许R-Tree值得尝试。这是javascript的r-tree实现。 https://github.com/imbcmdth/RTree

答案 1 :(得分:3)

如果您已经拥有用户的位置和每个城市的位置,那么计算距离最近的距离应该非常快。查看此网站:http://www.movable-type.co.uk/scripts/latlong.html 我已经使用了第一种算法几次。

  function getDistance(lat1,lat2,lon1,lon2){
    var R = 6371; // km
    var c = Math.PI / 180;
    var dLat = (lat2-lat1) * c;
    var dLon = (lon2-lon1) * c;
    var lat1 = lat1 * c;
    var lat2 = lat2 * c;

    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c;
    return d;
   }
var closest, dist = Number.MAX_VALUE;
for(var i = 0, l=cities.length;i<l;++i){
  if(getDistance(cities[i].longitude, cities[i].latitude, user.longitude, user.latitude) < max){
  closest = cities[i];
 }
}

  alert(closest.name + ' is the winner :)');

您可能希望在此处添加一些异常处理:)