一架梯子,一头程序猿,仰望星空!
MongoDB入门教程 > 内容正文

MongoDB地理数据模型 (地理位置信息)


本章介绍MongoDB地理空间数据如何存储,我们要想使用MongoDB地理信息查询功能,首先得了解如何存储地理空间数据。

地理空间数据,主要由点、线、几何图形组成。

在地图上的一个点,是有经纬度坐标的,多个点就连成线,多条线可以组成各种形状的图形。

在实际应用场景中:
店铺的位置、我在哪里?、学校在哪里,都可以使用坐标点表示。如果要描述校园的范围、商场的范围就需要几何图形描述。

GeoJSON 对象

MongoDB通过GeoJSON对象表达地理信息数据。

GeoJSON常用类型如下:

  • Point - 坐标点
  • LineString - 线条
  • Polygon - 多边形

MongoDB字段保存GeoJSON对象数据格式如下:

<field>: { type: <geojson type> , coordinates: <coordinates> }

说明:

  • <field> - 字段名
  • type - GeoJSON类型
  • coordinates - 坐标点数组,不同的GeoJSON类型格式不一样。

例子:

location: {
      type: "Point",  // 地理信息数据类型,这里是坐标点
      coordinates: [-73.856077, 40.848447] // 经度,纬度
}

说明:
location字段,保存了一个坐标点类型的地理空间数据

坐标点(Point)

格式:

{ type: "Point", coordinates: [ 经度, 纬度 ] }

例子:

{ type: "Point", coordinates: [ 40, 5 ] }

线 (LineString)

格式:

{ type: "LineString", coordinates: [ 坐标点1, 坐标点2, ...] }

例子:

{ type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }

多边形 (Polygon)

可以由一条或者多条线组成。
格式:

{
  type: "Polygon",
  coordinates: [ 
        线段1,
        线段2,
        ....
    ]
}

说明:每条线段开始坐标和结束坐标,必须一样,才能形成闭合的图形。

一条线段组成的图形

{
  type: "Polygon",
  coordinates: [
          [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] // 线段坐标,注意第一个和最后一个坐标,是一样的。
    ]
}

多条线段组成的图形

{
  type : "Polygon",
  coordinates : [
     [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ], // 线段1
     [ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]  // 线段2
  ]
}

</field></coordinates></geojson></field>

地理位置索引

MongoDB支持两种地理位置索引,用于加快GeoJSON类型数据的查询速度。

2dsphere

这是一种球面几何位置的索引类型,就是计算两点间距离的时候,2dsphere会考虑地球是圆的。

创建2dsphere索引例子:

db.collection.createIndex( { location : "2dsphere" } )

为location字段创建索引。

2d

是一种平面几何类型,计算两点间距离,就当成平面计算。
创建2d索引例子:

db.collection.createIndex( { location : "2d" } )

为location字段创建索引。

地理信息查询类型

地理信息查询,都是跟几何计算有关,下面是MongoDB支持的查询类型

  • $geoIntersects - 用于匹配跟指定图形有交集的文档数据
  • $geoWithin - 用匹配包含在指定图形区域内的文档数据
  • $near - 通常用于查询距离指定坐标点,最近的文档数据

提示:地理信息查询,请参考后续章节。