设为首页 收藏本站
查看: 2350|回复: 0

[经验分享] MongoDB学习笔记-->位置查询

[复制链接]
YunVN网友  发表于 2015-7-9 11:03:00 |阅读模式
  一 基本介绍:
  位置服务(LBS)解决的主要问题是当前位置周围某个范围内的人或场所.
在传统的解决方案,开发人员需要根据复杂的几何运算与大量的SQL语句进行查找,这无疑加大的开发人员的开发难度.
现在我们需要更为方便的解决方案,MongoDB为我们完美解决此类LBS问题.
  二 帮助文档:
  http://docs.mongodb.org/manual/core/2d/
  三 代码实现:
  表结构:使用double数组存储经纬度信息,x代表经度,y代表纬度。(指定索引:db.Member.ensureIndex( {Position: "2d"} ))


DSC0000.gif DSC0001.gif View Code


public class Member:SMCore.Core.BaseModel
{
///
/// 会员名称
///
public string Name { get; set; }
///
/// 位置信息
///
public double[] Position { get; set; }
}
  底层驱动:


View Code


///
/// 查询以[经度:x,纬度:y]为中心,半径为maxDistance千米的所有东东
///
public IQueryable GeoNear(double x, double y, double maxDistance, Expression predicate)
{
//3959为地球半径,单位英里。这里将英里转换成千米
var radius = maxDistance / (3959 * 1.61);
var items = db.GetCollection(typeof(T).Name).Find(Query.WithinCircle("Position", x, y, radius, true)).AsQueryable().Where(predicate);
return items;
}
  计算两地距离和生成随机Name方法:


View Code


#region 计算经纬度两点距离
private const double EARTH_RADIUS = 6378.137;//地球半径,单位千米
private static double rad(double d)
{
return d * Math.PI / 180.0;
}
public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +
Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = Math.Round(s * 10000) / 10000;
return s;
}
#endregion
#region 生成随机数
private static char[] constant =   
{   
'0','1','2','3','4','5','6','7','8','9',  
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',   
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'   
};
public static string GenerateRandomNumber(int Length)
{
System.Text.StringBuilder newRandom = new System.Text.StringBuilder(62);
Random rd = new Random();
for (int i = 0; i < Length; i++)
{
newRandom.Append(constant[rd.Next(62)]);
}
return newRandom.ToString();
}
#endregion
  添加数据之后,查看两地距离如图:

  调用驱动,查询位置信息就完成了


View Code


public ActionResult Search(double id)
{
var first = db.FirstOrDefault();
return View(db.GeoNear(first.Position[0], first.Position[1], id, x => true).ToList());
}
  效果如下:

  以上是使用MongoDB实现LBS部分代码。只是最简单的实现,欢迎感兴趣的朋友一起讨论。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84739-1-1.html 上篇帖子: 浅述MongoDB的管理操作【转】 下篇帖子: MongoDB资料
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表