我的问题与在数据库中处理数据相关gps点的最佳方法有关(在我的例子中是nosql DB MongoDB),以便只返回最近的点。
我的数据库中有一组用户。 现在我需要创建一个新的"表"将用户与gps点相关联(用户可以拥有更多积分)。例如:
User,lat,long
ALFA,40,50
ALFA,30,50
BETA,42,33
...
服务器应该提供一个函数,给定输入中的位置,返回与输入附近的点相关联的用户列表。 例如:
function nearestUsers(lat,lon){
var mindif = 10000;
var closest;
users = getAllRecordsFromDataBase(); //query for MongoDB that returnst all records of the new table
for ( i = 0 ; i < users.length; i++){
if(this.distance(lat,lon,users[i].lat,users[i].lon)>mindif) delete users[i];
}
return users;
}
距离函数如下:
function distance(lat1, lon1, lat2, lon2) {
lat1 = Deg2Rad(lat1);
lat2 = Deg2Rad(lat2);
lon1 = Deg2Rad(lon1);
lon2 = Deg2Rad(lon2);
var R = 6371;
var x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
var y = (lat2 - lat1);
var d = Math.sqrt(x * x + y * y) * R;
return d;
}
我担心,对于大量数据,此approch将导致缓慢。哪种方法可以使算法更具可扩展性?有什么建议吗?
考虑到这个功能在使用MongoDB的Node.js中的服务器内部,我可以直接通过查询或在我的数据库中使用一些特殊结构来实现这个功能吗?
答案 0 :(得分:1)
您可以使用mongodb geospatial indexes and queries。只需将点存储为GeoJSON点,并使用GeoJSON折线作为bbox-es和$geoWithin执行查询。