一、经纬度表示方法

    MongoDB
中对经纬度的储存有着自身的一套标准(首借使为着能够在该字段上创立地理空间引得)。包含三种艺术,分别是 Legacy
Coordinate Pairs
(这么些词实在不知道怎么翻译…) 和  GeoJSON 。

  • Legacy Coordinate Pairs

Legacy Coordinate Pairs
又有三种艺术能够储存经纬度,能够接纳数组(首荐)或嵌入式文书档案。

数组:

<field>: [<longitude>,
<latitude> ]

嵌入式文书档案:

<field>: { <field1>: <longitude>, <field2>: <latitude> }

tips:有效经度值介于-180和180里面。有效纬度值介于-90和90以内。

  • GeoJSON

GeoJson
比 Legacy Coordinate Pairs 要强硬的多,Legacy Coordinate Pairs
仅仅用来保存二个经纬度,而 吉优Json
可以用来钦命点、线和多边形。

点能够用形如[longitude,
latitude]([经度,纬度])的五个因素的数组表示:

{
“geometry”: {
        “type”: “Point”,
        “coordinates”: [125.6,
10.1]
   }
}

线能够用三个由点构成的数组来代表:

{
“geometry”: {
        “type”: “LineString”,
         “coordinates”: [[125.6,
10.1],[125.6,10.2],[125.6,10.3]]
   }
}

多头形的象征方法与线同等(都是一个由点构成的数组),但是”type”差异:

{
“geometry”: {
        “type”: “Polygon”,
         “coordinates”: [[125.6,
10.1],[125.5,10.2],[125.7,10.3]]
  }
又有三种方法能够累积经纬度。 }

type 除了
Point(点)、LineString(线)、Polygon(多边形),还会有 MultiPoint(多点)、MultiLineString(多个线)
和  MultiPolygon(四个多边形)。

“geometry”字段的名字能够是不管三七二十一的,可是中间的子对象是由吉优JSON钦定的,不可能更换。

二、地理空间引得

  • 又有三种方法能够累积经纬度。2dsphere索引

2dsphere索援引于地表类型的地形图,允许选用在 Legacy Coordinate Pairs
保存的中纬度字段上和采取吉优JSON格式保存的点、线和多边形字段上。

  db.world.ensureIndex({"geometry" : "2dsphere"})
  • 2d索引

 对于非球面地图(游戏地图、时间总是的多少等),能够动用”2d”索引代替”2dsphere”。

 2d 索引 仅同意利用在 Legacy Coordinate Pairs 保存的中纬度字段上。

  db.world.ensureIndex({"geometry" : "2d"})
  • 区别:

2dsphere索引只支持球形查询(即球面上几何图形的查询)。

2d索引协理平面查询(即在平面上几何图形的询问)和一些球形查询。固然2d索引协理部分球形查询,可是对这一个球形查询利用2d索引大概会招致错误,譬喻极点周围会并发多量的扭动变形。
又有三种方法能够累积经纬度。2d索引只好对点进行索引。能够保留三个由点构成的数组,可是它只会被封存为由点组成的数组,不会被当成线。极其是对此”$geoWithin”查询来讲,那是一项主要的分别。假设将街道保存为由点组成的数组,那么只要内部的某部点位于给定的形象之内,这么些文书档案就能与$geoWithin相匹配。不过,由那几个点构成的线并不一定完全满含在那几个样子之内。

三、地理空间查询

   
能够运用七种不一致类型的地理空间查询:交集(intersection)、包蕴(within)以及近似(nearness)。

  • $geoIntersects

概念:提出与查询职位相交的文书档案。

支撑的目录:2dsphere

几何操作符:

    1. $geometry (仅援救 2dsphere 索引,钦点吉优JSON格式的几何图形)
  • $geoWithin

概念:指出完全包涵在某些区域的文书档案。

支撑的目录:2dsphere、2d

几何操作符:

  1. $box(仅协助 2d 索引,查询出矩形范围内的有所文书档案)
  2. $center(仅帮助 2d 索引,查询出圆形范围内的拥有文书档案)
  3. 又有三种方法能够累积经纬度。$polygon (仅帮衬 2d 索引,查询出多边形范围内的装有文书档案)
  4. $centerSphere(扶助 2d 索引和 2dsphere
    索引,查询出球面圆形范围内的具有文书档案)
  5. $geometry (仅协助 2dsphere 索引,钦命吉优JSON格式的几何图形)
  • $near

概念:建议与查询职位从近些日子到最远的文书档案。

援救的目录:2dsphere、2d

几何操作符:

  1. $maxDistance (援助 2dsphere 索引和 2d
    索引,钦点询问结果的最大距离)
  2. $minDistance (仅扶助 2dsphere
    索引,钦赐询问结果的纤维距离。在4.0后扶助 2d 索引)
  3. $geometry (仅支持 2dsphere 索引,钦命吉优JSON格式的点)

备注:$minDistance 官方文书档案说仅帮助2dsphere 索引,可是本人实施注解 $minDistance 也援救 2d
索引,大家能够尝试看,这里保留争议。

  • $nearSphere

概念:使用球面几何总括近球面包车型地铁相距,建议与查询职位从近期到最远的文书档案。

支撑的目录:2dsphere、2d

几何操作符:

  1. $maxDistance (辅助 2dsphere 索引和 2d
    索引,钦点询问结果的最大距离)
  2. $minDistance (仅匡助 2dsphere
    索引,钦点询问结果的细微距离。在4.0后扶助 2d 索引)
  3. $geometry (仅支持 2dsphere 索引,钦命吉优JSON格式的点)

备考:MongoDB 4.0 后对地理空间索引扩展的援助?

1、地理空间查询操作符 $near 和 $nearSphere
援协助调查询的分片集结。

2、MongoDB
4.0 为 $geoNear 聚合运算符和 geoNear 命令加多了二个选择key,使顾客能够在询问时内定要使用的地理空间引得。从前,要接纳 $geoNear
聚合运算符或 geoNear 命令,集合只好有一个地理空间引得。

 

db.places.aggregate([
   {
     $geoNear: {
        near: { type: "Point", coordinates: [ -73.98142 , 40.71782 ] },
        key: "location",
        distanceField: "dist.calculated",
        query: { "category": "Parks" }
     }
   }
])

 

四、实践

  • “$geoIntersects” 操作符寻找与查询职位相交的文书档案 ?

图片 1图片 2

db.driverPoint.find(
   {
     coordinate: {
       $geoIntersects: {
          $geometry: {
             type: "Polygon" ,
             coordinates: [
               [ [ 118.193828, 24.492242 ], [ 118.193953, 24.702114 ], [ 118.19387, 24.592242 ],[ 118.193828, 24.492242 ]]
             ]
          }
       }
     }
   }
)

View Code

 tips:coordinates 代表多边形,第一个点 和
最终八个点 必需一律,因为如此技能拼成两个多方形呀!

  • “$geoWithin”操作符寻觅完全包涵在有些区域的文档?

图片 3图片 4

db.driverPoint.find(
   {
     coordinate: {
       $geoWithin: {
          $geometry: {
             type: "Polygon" ,
             coordinates: [
               [ [ 118.193828, 24.492242 ], [ 118.193953, 24.702114 ], [ 119.19387, 28.792242 ],[ 118.193828, 24.492242 ]]
             ]
          }
       }
     }
   }
)

View Code

  • “$geoWithin”操作符找寻矩形范围内的文书档案?

图片 5图片 6

db.driverPoint.find(
{
  coordinate: {
     $geoWithin: {
        $box: [
          [ 118.0,24.0 ],
          [ 120.0,30.0 ]
        ]
     }
  }
}
)

View Code

 tips:”$box”接受二个两成分的数组:第三个成分钦赐左下角的坐标,第二个要素钦点右上角的坐标。

  • “$geoWithin”操作符寻找圆形范围内的文书档案?

图片 7图片 8

db.driverPoint.find(
{
  coordinate: {
     $geoWithin: {
         $center: [ [ 118.067678, 24.444373] , 10 ] 
     }
  }
}
)

View Code

tips:”$center”接受二个两成分数组作为参数:第2个因素是三个点,用于钦点圆心;第3个参数用于钦定半径。

  • “$geoWithin”操作符找寻多边形范围内的文书档案?

图片 9图片 10

db.driverPoint.find(
{
  coordinate: {
     $geoWithin: {
         $polygon: [ [ 118.067678 , 24.444373 ], [ 119.067678 , 25.444373 ], [ 120.067678 , 26.444373 ] ]
     }
  }
}
)

View Code

tips:”$polygon”
列表中的最终三个点会被接连到第一个点,以便重组多边形。

  • “$geoWithin”操作符寻觅球面圆形范围内的文书档案?

图片 11图片 12

db.driverPoint.find(
{
  coordinate: {
     $geoWithin: {
         $centerSphere: [ [ 118.067678, 24.444373 ], 10/3963.2 ]
     }
  }
}
)

View Code

tips:该例子表示 距离 [118.067678,
24.444373] 焦点点10
海里范围内的富有文书档案,查询通过除以地球的大约赤道半径(3963.2海里)将相差转变为弧度。

  • $near 寻找距离三个点相应距离内的文书档案?

geoJson 格式(仅支持 2dsphere 索引):

图片 13图片 14

db.driverPoint.find(
{
   coordinate: {
     $near: {
       $geometry: {
          type: "Point" ,
          coordinates: [ 118.067678 , 24.444373 ]
       },
       $maxDistance: 3000,
       $minDistance: 0
     }
   }
}
)

View Code

Legacy Coordinate Pairs 格式(仅支持 2d 索引):

图片 15图片 16

db.driverPoint.find(
{
   coordinate: {
     $near: [ 118.193828 , 24.492242 ],
     $maxDistance: 0.10
     }
}
)

View Code

tips:1、$near 当用 geoJson
格式表示时, 距离单位是米(meter)。

         2、$near 当用 Legacy Coordinate Pairs
格式表示时,距离单位是弧度(radian)。  

       
 3、”$near”是独一一个会对查询结果开展活动排序的地理空间操作符:”$near”的回来结果是比照距离由近及远排序的。

五、结语

   
怎么说啊?学习那方面包车型客车知识老是给小编一种特地乱的感觉。稍微计算下吧!MongoDB
对于地理空间的查询 是依照 它对 地理空间的目录(即2dsphere 和
2d)来达成的。所以,我们借使搞精通曾几何时 该创制 2dsphere
索引,什么时候该创造 2d
索引,然后再找适用于该索引的操作符就很清晰明了了!同理可得,geoJSON
格式保存的中纬度一定 创立 2dsphere 索引。Legacy Coordinate Pairs
格式保存的中纬度 仅在表示 平面地图的时候才思量创建 2d
索引,别的情况如故采纳 2dsphere 索引。

    Spring Data MongoDB 中对地理地方的询问可参谋 https://github.com/JMCuixy/SpringDataMongoDB 中单元测量检验的
Test03.java。

 

 

参谋资料:

1、《MongoDB 权威指南第二版》

2、

相关文章