我应该使用啥 NPM 包来查找最近的城市。

Posted

技术标签:

【中文标题】我应该使用啥 NPM 包来查找最近的城市。【英文标题】:What NPM package should I use for finding the nearest city.我应该使用什么 NPM 包来查找最近的城市。 【发布时间】:2011-11-27 11:55:07 【问题描述】:

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

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

是否有一个 Node.js NPM 包可以执行我上面描述的地理功能?

【问题讨论】:

您是否对 Mongo 的地理空间功能进行了基准测试?对于一小部分城市,它应该非常快。计算并不那么复杂。 【参考方案1】:

您与多少个“预定义”城市合作?如果它是一个小数字,您可能只需将列表存储在内存中并进行线性扫描。 此外,在假设它不合理之前,您可能应该尝试 mongo 地理空间查询以了解它的确切成本 - 如果您索引城市位置,它会非常快.. 如果您要处理很多点,仍然不想依赖 mongo 地理索引,并且需要一些真正专业的东西,那么 R-Tree 可能值得尝试。这是 javascript 的 r-tree 实现。 https://github.com/imbcmdth/RTree

【讨论】:

目前不超过 10 个。大多数城市都在北美。并感谢 R-Tree。我去看看。【参考方案2】:

如果您已经有了用户的位置和每个城市的位置,那么计算到最近的距离应该会非常快。看看这个网站: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 :)');

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

【讨论】:

以上是关于我应该使用啥 NPM 包来查找最近的城市。的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Google API 查找最近的城市吗?

查找距离指定地点最近的城市

查找与给定经度/纬度最近的城市[关闭]

我应该为这个 UDF 使用啥对象,它应该根据列标题在一组数据中查找值?

我应该使用啥工具或方法来查找 Web 应用程序中的性能点?

查找给定城市的 UTC 偏移量