开发APP时对于地理位置查询是怎样制作的?
基于LBS的App,必不可少的一个功能是根据当前用户的位置查找附近范围内的人或物。这些App的数据中部包含了地理位置信息,而如何处理、分析、存储这些地理位置信息,则是LBS技术的个关键点。关于LBS技术的详细分析,可查看深圳APP开发公司本站LBSApp后台架构”这一篇文章。因为MongoDB封装了LBS常用的操作全球流行的LBS应用foursquare,国内的快的打车和滴滴打车(现在这两家公司己合并)都曾经选择TMongoDB处理LBS。APP开发公司程序员将在本节中将演示如何使用MongoDB处理LBS。首先在MongoDB中插入地理位置的数据示例如下:
本文演示的LBS功能使用的数据是上面location集合中的数据,其中name表示用户的名称coordlnate表示用户的坐标MongoDB原生支持地理位置索引,可以直接用于位置距离计算和查询,常用的地理位置索引有两种。
·2d:平面坐标索引,适用于基于平面的距离计算。
·2dsphere:几何球体索引,适用于球面上的距离计算。
在地理位置数据上建立地理位置索引:
>db.location.ensurelndex({'coordinate':'/d'})
或者
>db.location.ensurelndex({'coordinate':'/dsphere'})
如果要追求最准确的精度,应该选择2dsphere,在坐标跨度不大的情况下(例如几百、几千千米).这两者的计算结果相差无几MongoDB官方推荐使用2dsphere。
下面演示了LBS应用中最常用的“查找附近的人(物)”的操作,同时也演示了如何查找个特定区域内的坐标
1.使用llougoDH查找附近的人
在LBS中,应该会遇到如图8-11所示的需求,把当前用户附近的人(物)在地图中显示出来。
APP开发地理位置定位制作经验示意图8-11显示当前用户附近的人(物)
查找附近的人(物)的功能,可以等同于在MongoDB中,查找有哪些坐标和用户当前坐标直线距离为某个固定值以内(例如1000米范围内)。MongoDB使用“$nearSphere”操作符条查询语句就能把这个功能实现。
下面的语句表示查找集合location中,和坐标[113.392237,23062429]的间距在l千米范围内的坐标。
上面“spherical”为true表示计算距离,distanceMultiplier指定地球半径来得到实际的千米或者米的距离,“1000/6378137”就是把距离转化为弧度。
查找500米范围,可使用如下的命令:
还有一种报常见的需求,把查找到的坐标按照距离排序,并标明和当前用户坐标的距离,如图8-12所示。
APP开发定位处理示意图8-12标注距离的附近的人
这个需求和前面的查找附近的人很相近,但是返回结果需要包含距离,MongoDB提供了geoNearmm命令来解决这个需求。geoNear的返回结果中包含了距离的信息。geoNear命令是基于db的command,而不是基于collection的find,也就是需要通过runcommand执行。在查找集合location中,和坐标113.392237,23.062429]的间距在500米范围内的坐标,同时显示和目标坐标的距离,整个命令如下:
在上面的命令中.geoNear指定了要操作的集合,之所以在命令中没出coordinate这个存储了坐标的Kev,是因为在个集合中只能在一个key上建立地理坐标索引,所以MougoDB会自动查找到这个索引。返回的结果是有序的,包含了类似下面的信息:
返回值中dis为20.表示用户tom“113.392354,23062582”和当前用户jeff“113.392237,23062429’距离20米。
APP制作时怎样进行查找某个范围内的坐标的开发?
MongoDB除了支持附近的搜索外,还支持使用$geoWithin操作符搜索某个范围内的坐标,这个操作符支持下面的3种类型
·$box矩形
·$center圆(平面)、$centerSphere圆(球面)
·$polygon多边形
其中搜索$center圆(平面)、$centerSphere圆(球面)区域内的坐标,和查找某个用户附近的人(物)的坐标是相似的,都是指定圆心的坐标,通过指定半径得到圆的范围。区别是前者返回的结果是无序的,后者返回的结果是有序的。
下面以$box矩形为侧说明,假设如图8-13所示,要在MongoDB集合中查找黑色矩形区域内的坐标。
APP开发定位示意图8-13查找矩形区域内的坐标
定义一个矩形范围的范围,根据图8-13指定矩形个对角的坐标“113.39168,23062726”、“113.392848,23061973”,使用如下的查询语句就能查找location集合中矩形区域内的坐标:
好了,APP开发公司关于我们在项目制作时怎样处理定位设置的经验本文就分享到这里,博纳网络希望这类型的文章对您的工作有所帮助,如有需要,您也可以联系我们在线客服,为您提供更完善的解答。谢谢关注。