zoukankan      html  css  js  c++  java
  • 地理位置索引 2d索引

    地址位置索引:将一些点的位置存储在mongodb中,创建索引后,可以按照位置来查找其他点
    子分类:
    1、2d索引:平面地理位置索引,用于存储和查找平面上的点。
    2、2dsphere索引:球面地理位置索引,用于存储和查找球面上的点。
    查找方式:
    1、查找距离某个点一定距离内的点。
    2、查找包含在某区域内的点。
      比如当前打车软件比较火,当确定某个乘客的点的时候,服务器需要确定某个范围内的出租车,接收乘客的搭车请求,这个时候就可以使用mongodb的地理位置索引去完成这样的需求
      比如在使用团购网站时,距离我们最近的餐馆,也可以使用mongodb的地理位置索引去完成。

    mongodb的地理位置索引十分强大,可以节省其他数据库所要花费的大量时间来完成应用。



    2d索引
    创建方式:
    db.collection.ensureIndex({w:'2d'})
    位置表示方式:经纬度[经度,纬度] 取值范围:经度[-
    180180] 纬度[-90 90
    > db.location.ensureIndex({'w':'2d'})
    {
        "createdCollectionAutomatically" : true,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
    }
    插入几条数据
    > db.location.insert({w:[1,1]})
    WriteResult({ "nInserted" : 1 })
    > db.location.insert({w:[1,2]})
    WriteResult({ "nInserted" : 1 })
    > db.location.insert({w:[3,2]})
    WriteResult({ "nInserted" : 1 })
    > db.location.insert({w:[100,100]})
    WriteResult({ "nInserted" : 1 })
    > db.location.insert({w:[180,100]})
    WriteResult({ "nInserted" : 1 })
    我们看到经度超过180会报错,纬度超过90,但没报错,对这种点在查询中会有不可预知的错误,所以不应该插入这种点
    > db.location.find()
    { "_id" : ObjectId("5b6b6fa572ff7510af7fc783"), "w" : [ 1, 1 ] }
    { "_id" : ObjectId("5b6b6fa872ff7510af7fc784"), "w" : [ 1, 2 ] }
    { "_id" : ObjectId("5b6b6fab72ff7510af7fc785"), "w" : [ 3, 2 ] }
    { "_id" : ObjectId("5b6b703772ff7510af7fc788"), "w" : [ 180, 80 ] }
    所以插入这些点



    2d索引的查询方式有两种
    1、$near查询:查询距离某个点最近的点。
    2、$geoWithin查询:查询某个形状内的点。
    > db.location.find({w:{$near:[1,1]}})
    { "_id" : ObjectId("5b6b6fa572ff7510af7fc783"), "w" : [ 1, 1 ] }
    { "_id" : ObjectId("5b6b6fa872ff7510af7fc784"), "w" : [ 1, 2 ] }
    { "_id" : ObjectId("5b6b6fab72ff7510af7fc785"), "w" : [ 3, 2 ] }
    { "_id" : ObjectId("5b6b703772ff7510af7fc788"), "w" : [ 180, 80 ] }
    我们看到所有点都返回了,原因是near会返回一百个最近的点
    我们可以使用maxDistance来限制最远的点
    > db.location.find({w:{$near:[4,2],$maxDistance:10}})
    { "_id" : ObjectId("5b6b6fab72ff7510af7fc785"), "w" : [ 3, 2 ] }
    { "_id" : ObjectId("5b6b6fa872ff7510af7fc784"), "w" : [ 1, 2 ] }
    { "_id" : ObjectId("5b6b6fa572ff7510af7fc783"), "w" : [ 1, 1 ] }
    我们看到只返回了3个点,这种简单的,这里不支持minDistance



    $geoWithin查询
    形状的表示
    1、$box:矩形,使用
      {$box:[[<x1>,<y1>],[<x2>,<y2>]]}表示
      都是坐标,第一个坐标表示矩形的左边界,第二个坐标表示矩形的右边界
    2、$center:圆形,使用
      {$center:[[<x1>,<y1>],r]}
      第一个表示圆心位置,第二个代表半径
    3、$polygon:多边形,使用
      {$polygon:[<x1>,<y1>],[<x2>,<y2>],[<x3>,<y3>]}表示
      每个数组代表一个坐标点,这些点代表一个多边形
  • 相关阅读:
    用Jetpack的Site Accelerator为网站CDN加速
    习惯了安逸的日子永远不知道折腾了才叫人生
    谷歌2019年最热门搜索词榜单公布
    如何隐藏WooCommerce Shop Page页面的标题
    woocommerce调用分类描述另一种方法
    修改woocommerce列表产品显示数量
    centos用手机号无法登入安全狗的解决方法
    centos安装安全狗5步就能完成
    centos安装安全狗提示Need system command 'locate' to install safedog for linux的解决方法
    yoast breadcrumb面包屑导航修改去掉product
  • 原文地址:https://www.cnblogs.com/wzndkj/p/9446692.html
Copyright © 2011-2022 走看看