zoukankan      html  css  js  c++  java
  • 利用MongoDB进行地理坐标查询

    BS的应用在生活中已经非常常见,我们打车,叫外卖,查个地图之类的都会查询附近的相关坐标位置,mongodb提供了原生的二维地图查询,极大地方便了大家的开发。

    假定我们有一个定义了位置信息的集合location,给定a,b,c,d节点

    db.location.find()
    { "_id" : "A", "position" : [ 0, 10 ] }
    { "_id" : "B", "position" : [ 10, 0 ] }
    { "_id" : "C", "position" : [ 20, 0 ] }
    { "_id" : "D", "position" : [ 0, 15 ] }

    这四个点的位置如图所示:  为location的position字段指定2d索引。

    db.location.ensureIndex( {position: "2d"} )
    {
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
    }

    我们假定找出坐标点(0,0)附近半径为10的所有坐标点:

    db.location.find( {position: { $near: [0,0], $maxDistance: 10  } } )
    { "_id" : "A", "position" : [ 0, 10 ] }
    { "_id" : "B", "position" : [ 10, 0 ] }

    其中$near表示中心坐标点,而$maxDistance表示最远的路径10.

    再增加一个坐标点E(5,0),然后再次查询

    db.location.insert({_id:"E",position:[5,0]});
    db.location.find( {position: { $near: [0,0], $maxDistance: 10  } } )
    { "_id" : "E", "position" : [ 5, 0 ] }
    { "_id" : "A", "position" : [ 0, 10 ] }
    { "_id" : "B", "position" : [ 10, 0 ] };

    由查询可见,mongodb会将数据按照离中心点的距离进行排序,约近的坐标点顺序越靠前。

    除此之外,使用$center函数也可以完成同样的动作。

    db.location.find({"position":{$geoWithin:{"$center":[[0,0],10]}}})
    { "_id" : "E", "position" : [ 5, 0 ] }
    { "_id" : "A", "position" : [ 0, 10 ] }
    { "_id" : "B", "position" : [ 10, 0 ] }

    mongodb还支持选定空间(box)的查询,查询在某一个矩形范围内的坐标点:

    db.location.find({"position":{$geoWithin:{"$box":[[0,0],[15,15]]}}})
    { "_id" : "E", "position" : [ 5, 0 ] }
    { "_id" : "A", "position" : [ 0, 10 ] }
    { "_id" : "B", "position" : [ 10, 0 ] }
    { "_id" : "D", "position" : [ 0, 15 ] }

    mongo在地理查询上还支持多边形($polygon)等操作,丰富的操作极大提升了地理信息系统的开发。结合redis的3.2版本可以制作出很丰富的地理信息应用了。 

  • 相关阅读:
    8.9乘船问题
    8.8几个背包问题
    8.7贪心策略例题:字典序最小问题
    8.6贪心策略例题:区间覆盖问题
    8.5贪心策略例题:区间选点问题
    8.4贪心策略例题:区间调度问题
    SQL 报表 生成月份临时表
    CentOS8 .NET Core项目部署
    Django with database on SQL Server
    SQL 父子表,显示表中每条记录所在层级
  • 原文地址:https://www.cnblogs.com/xubao/p/12272394.html
Copyright © 2011-2022 走看看