Эта глава знакомит с хранением геопространственных данных в MongoDB. Чтобы использовать возможности геопространственного запроса MongoDB, сначала нужно понять, как хранить геопространственные данные.

Геопространственные данные в основном состоят из точек, линий и геометрических фигур.

Точка на карте определяется своими координатами долготы и широты. Несколько точек формируют линию, а несколько линий могут образовать различные формы.

В практических приложениях: Местоположение магазина, "Где я?", и "Где школа?" могут быть представлены с использованием координат. Описание территории кампуса или торгового центра требует геометрических фигур.

Объект GeoJSON

MongoDB использует объекты GeoJSON для представления геопространственной информации.

Распространенные типы GeoJSON включают:

  • Точка - представляет координатную точку
  • LineString - представляет линию
  • Полигон - представляет многоугольник

Формат для сохранения объектов GeoJSON в полях MongoDB следующий:

<поле>: { type: <тип GeoJSON>, coordinates: <координаты> }

Объяснение:

  • <поле> - Имя поля
  • 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]] }

Полигон

Может состоять из одной или нескольких линий. Формат:

{
  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
  ]
}

Геопространственный индекс

MongoDB поддерживает два типа геопространственных индексов для ускорения запросов данных GeoJSON.

2dsphere

Это тип индекса сферической геометрии, что означает, что при расчете расстояния между двумя точками 2dsphere рассматривает Землю как сферу.

Пример создания индекса 2dsphere:

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

Создает индекс для поля location.

2d

2D - это тип плоской геометрии, используемый для расчета расстояния между двумя точками, как если бы они находились в плоскости. Пример создания индекса 2D:

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

Это создает индекс для поля location.

Типы геопространственных запросов

Геопространственные запросы связаны с геометрическими вычислениями. Ниже приведены типы запросов, поддерживаемые MongoDB:

  • $geoIntersects - используется для сопоставления документов с конкретным пересечением геометрической фигуры.
  • $geoWithin - сопоставляет документы, содержащиеся в указанной геометрической области.
  • $near - обычно используется для запроса документов, ближайших к указанной координатной точке.

Примечание: Дополнительную информацию о геопространственных запросах можно найти в следующих главах.