我应该使用啥 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 包来查找最近的城市。的主要内容,如果未能解决你的问题,请参考以下文章