2011-11-27 74 views
2

我正在使用Node.js和MongoDB。 讓說,我有預定義的少數幾個城市(例如西雅圖,邁阿密,紐約)與緯度經度&。有一個用戶點擊我的網站,我知道他的IP地址,並找出經緯度。然後我想知道我定義的哪個城市離用戶最近。我應該用什麼NPM包來找到最近的城市。

我知道我可以使用蒙戈的地理空間功能做到這一點。但使用數據庫來計算每個Web請求的代價是相當「昂貴的」。

是否有一個Node.js的NPM包,可以像我上面描述做地理特徵?

+0

你基準蒙戈的地理空間功能?有了一小排城市,它應該是非常快的。計算並不是那麼複雜。 – ceejayoz

回答

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 :)'); 

你可能想添加一些異常處理在這裏:)

5

多少「預先定義的」城市與Google合作?如果數字很小,可以將列表存儲在內存中並進行線性掃描。 此外,你應該只給蒙戈地理空間查詢想方設法把它到底有多貴的想法,假設它的不合理之前 - 如果你指數的城市位置和,這將是非常快.. 如果您正在處理很多要點,仍然不想依賴mongo geo-indexing,並且需要一些非常專業的東西,或許R-Tree值得嘗試。這是一個JavaScript的r-tree實現。 https://github.com/imbcmdth/RTree

+0

現在不超過10。大部分城市都在北美。並感謝R-Tree。我會看看。 – murvinlai

相關問題