我正在使用Node.js和MongoDB。 讓說,我有預定義的少數幾個城市(例如西雅圖,邁阿密,紐約)與緯度經度&。有一個用戶點擊我的網站,我知道他的IP地址,並找出經緯度。然後我想知道我定義的哪個城市離用戶最近。我應該用什麼NPM包來找到最近的城市。
我知道我可以使用蒙戈的地理空間功能做到這一點。但使用數據庫來計算每個Web請求的代價是相當「昂貴的」。
是否有一個Node.js的NPM包,可以像我上面描述做地理特徵?
我正在使用Node.js和MongoDB。 讓說,我有預定義的少數幾個城市(例如西雅圖,邁阿密,紐約)與緯度經度&。有一個用戶點擊我的網站,我知道他的IP地址,並找出經緯度。然後我想知道我定義的哪個城市離用戶最近。我應該用什麼NPM包來找到最近的城市。
我知道我可以使用蒙戈的地理空間功能做到這一點。但使用數據庫來計算每個Web請求的代價是相當「昂貴的」。
是否有一個Node.js的NPM包,可以像我上面描述做地理特徵?
如果您已經擁有了用戶的位置和每個城市的位置,應該是相當快速地計算到最近的距離。看看這個網站: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 :)');
你可能想添加一些異常處理在這裏:)
多少「預先定義的」城市與Google合作?如果數字很小,可以將列表存儲在內存中並進行線性掃描。 此外,你應該只給蒙戈地理空間查詢想方設法把它到底有多貴的想法,假設它的不合理之前 - 如果你指數的城市位置和,這將是非常快.. 如果您正在處理很多要點,仍然不想依賴mongo geo-indexing,並且需要一些非常專業的東西,或許R-Tree值得嘗試。這是一個JavaScript的r-tree實現。 https://github.com/imbcmdth/RTree
現在不超過10。大部分城市都在北美。並感謝R-Tree。我會看看。 – murvinlai
你基準蒙戈的地理空間功能?有了一小排城市,它應該是非常快的。計算並不是那麼複雜。 – ceejayoz