前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mongodb11天之屠龙宝刀(五)lbs地理位置检索:存储经纬度以及查询

mongodb11天之屠龙宝刀(五)lbs地理位置检索:存储经纬度以及查询

作者头像
学到老
发布2019-02-14 15:52:36
6160
发布2019-02-14 15:52:36
举报

mongodb11天之屠龙宝刀(五)lbs地理位置检索:存储经纬度以及查询

原文连接:直通车

基本原理

LBS,存储每个地点的经纬度坐标,搜寻附近的地点,建立地理位置索引可提高查询效率。

mongodb地理位置索引,2d和2dsphere,对应平面和球面。

mongodb位置查询文档

实现原理:参考文章

两种索引方式

地理位置索引,必须创建索引才可以能查询,目前有两种索引。

2d index:

使用2d index 能够将数据作为2维平面上的点存储起来,在MongoDB 2.2以前推荐使用2d index索引。

2dsphere index:

2dsphere index 支持球体的查询和计算,同时它支持数据存储为GeoJSON 和传统坐标。

3种距离单位

米(meters)

平面单位(flat units,可以理解为经纬度的“一度”)

弧度(radians)

2d索引能同时支持center和center和center和centerSphere,

2dsphere索引支持centerSphere。centerSphere。centerSphere。 center默认是度,$centerSphere默认距离是弧度

地理位置索引创建与查询
地理位置索引-2d索引

首先需对col里的w设置索引为’2d’,方可进行$near查询

代码语言:javascript
复制
db.location.ensureIndex({w:"2d"})  

w对应的经纬度外镶字段

创建了地理位置索引,默认mongoDB**不允许查询超过180的值**

2d索引查询方式
$near 附近的点
代码语言:javascript
复制
db.location.find({w:{$near:[1,1]}})

$near会返回最近的100个记录.

地理位置索引-2d索引-$near 限制返回的距离的远近,限制最远距离:限制最近距离:maxDistance单位是弧度, 地球表面1弧度距离约为6378137米, 0.001弧度距离为6378米

$geoWithin 某个形状内的点

地理位置索引-2d索引 $geoWithin 形状的表示

由于$geoWithin是查询某个形状内的点,所以先要学会如何表示形状.

地理位置索引-2d索引 $geoWithin 查询矩形中的点

代码语言:javascript
复制
db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
db.location.find({w:{$geoWithin:{$box:[[1,1],[2,3]]}}})

地理位置索引-2d索引 $geoWithin 查询圆形中的点

代码语言:javascript
复制
db.location.find({w:{$geoWithin:{$center:[[0,0],5]}}})

地理位置索引-2d索引 $geoWithin 查询多边形中的点

代码语言:javascript
复制
db.location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}})
geoNear

地理位置索引-2d索引 geoNear

geoNear查询使用runCommand命令进行使用,db.runCommand({geoNear:,near:,,minDistance:(对2D索引无效,2Dsphere有效),maxDistance:(最大距离),num:(返回结果个数)})

代码语言:javascript
复制
db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:1})
地理位置索引-2dsphere索引

查询案例:

代码语言:javascript
复制
db.user.find({"geo": {$near: [118.10388605,24.48923061], $maxDistance:0.1}},{id:1, name:1, state:1, geo:1}).limit(1).pretty()
2dsphere操作案例
插入 lbs;
代码语言:javascript
复制
db.lbs.insert(  
    {  
        loc:{  
            type: "Point",  
            coordinates: [113.332264, 23.156206]  
        },  
        name: "广州东站"  
    }  
)  

db.lbs.insert(  
    {  
        loc:{  
            type: "Point",  
            coordinates: [113.330611, 23.147234]  
        },  
        name: "林和西"  
    }  
)  

db.lbs.insert(  
    {  
        loc:{  
            type: "Point",  
            coordinates: [113.328095, 23.165376]  
        },  
        name: "天平架"  
    }  
)  

插入结果,IDE显示如下

地理位置索引
代码语言:javascript
复制
db.lbs.ensureIndex(  
    {  
        loc: "2dsphere"  
    }  
) 

创建完成之后在indexes中出现了新的索引形式即为成功

#注意此调用情况下,maxdistance 单位是米

代码语言:javascript
复制
db.lbs.find(  
    {  
        loc: {  
            $near:{  
                $geometry:{  
                    type: "Point",  
                    coordinates: [113.323568, 23.146436]  
                },  
                $maxDistance: 1000  
            }  
        }  
    }  
)  

最终查询结果下:

查询更多字段

查询更多字段时,执行:

db.lbs.find(

代码语言:txt
复制
 { 
代码语言:txt
复制
     loc: { 

near:{near:{near:{ geometry:{

代码语言:txt
复制
                 type: “Point”, 
代码语言:txt
复制
                 coordinates: [113.323568, 23.146436] 
代码语言:txt
复制
             }, 
代码语言:txt
复制
             $maxDistance: 1000 
代码语言:txt
复制
         } 
代码语言:txt
复制
     } 
代码语言:txt
复制
 }  ,{此处添加比如:type:1,name:1} 

)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年12月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本原理
  • 两种索引方式
    • 2d index:
      • 2dsphere index:
      • 3种距离单位
      • 地理位置索引创建与查询
        • 地理位置索引-2d索引
          • 2d索引查询方式
            • $near 附近的点
            • $geoWithin 某个形状内的点
            • geoNear
          • 地理位置索引-2dsphere索引
            • 2dsphere操作案例
              • 插入 lbs;
              • 地理位置索引
              • 查询更多字段
          相关产品与服务
          云数据库 MongoDB
          腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档