Ten rozdział przedstawia, w jaki sposób MongoDB przechowuje dane geoprzestrzenne. Aby skorzystać z funkcjonalności zapytań geoprzestrzennych w MongoDB, musimy najpierw zrozumieć, w jaki sposób przechowywać dane geoprzestrzenne.

Dane geoprzestrzenne składają się głównie z punktów, linii i kształtów geometrycznych.

Punkt na mapie jest określany przez swoje współrzędne długości i szerokości geograficznej. Wiele punktów tworzy linię, a wiele linii może tworzyć różne kształty.

W praktyce: Lokalizacja sklepu, "Gdzie jestem?" oraz "Gdzie jest szkoła?" mogą być reprezentowane za pomocą współrzędnych. Opisanie rozmiaru kampusu lub centrum handlowego wymaga kształtów geometrycznych.

Obiekt GeoJSON

MongoDB wykorzystuje obiekty GeoJSON do reprezentowania informacji geoprzestrzennych.

Powszechne typy GeoJSON obejmują:

  • Punkt - reprezentujący punkt współrzędny
  • LineString - reprezentujący linię
  • Polygon - reprezentujący wielokąt

Format przechowywania obiektów GeoJSON w polach MongoDB jest następujący:

<field>: { type: <typ GeoJSON>, coordinates: <współrzędne> }

Wyjaśnienie:

  • - Nazwa pola
  • type - Typ GeoJSON
  • coordinates - Tablica punktów współrzędnych. Format różni się w zależności od różnych typów GeoJSON.

Przykład:

location: {
      type: "Point",  // typ danych geoprzestrzennych, w tym przypadku jest to punkt współrzędny
      coordinates: [-73.856077, 40.848447] // długość geograficzna, szerokość geograficzna
}

Wyjaśnienie: Pole location przechowuje dane geoprzestrzenne typu punkt współrzędny.

Punkt w formacie współrzędnych (Point)

Format:

{ type: "Point", coordinates: [ długość, szerokość ] }

Przykład:

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

Linia (LineString)

Format:

{ type: "LineString", coordinates: [ punkt1, punkt2, ...] }

Przykład:

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

Wielokąt

Może składać się z jednej lub więcej linii. Format:

{
  type: "Polygon",
  coordinates: [ 
		linia1,
		linia2,
		....
	]
}

Uwaga: Aby utworzyć zamknięty kształt, współrzędne początkowe i końcowe każdego odcinka linii muszą być takie same.

Kształt składający się z jednego odcinka linii

{
  type: "Polygon",
  coordinates: [
  		[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] // Punkty współrzędnych odcinka linii, zwróć uwagę, że pierwsza i ostatnia współrzędna są takie same.
	]
}

Kształt składający się z wielu odcinków linii

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

Indeks geoprzestrzenny

MongoDB obsługuje dwa typy indeksów geoprzestrzennych, które przyspieszają zapytania dotyczące danych GeoJSON.

2dsphere

Jest to typ indeksu geometrii sferycznej, co oznacza, że obliczając odległość między dwoma punktami, 2dsphere uwzględnia Ziemię jako sferę.

Przykład tworzenia indeksu 2dsphere:

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

Tworzy indeks dla pola location.

2d

2D to rodzaj geometrii płaskiej stosowanej do obliczania odległości między dwoma punktami, tak jakby były na płaszczyźnie. Przykład tworzenia indeksu 2D:

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

Tworzy indeks dla pola location.

Typy zapytań geoprzestrzennych

Zapytania geoprzestrzenne są związane z obliczeniami geometrycznymi. Poniżej przedstawione są typy zapytań obsługiwane przez MongoDB:

  • $geoIntersects - Służy do dopasowania dokumentów z konkretnym przecięciem kształtów geometrycznych.
  • $geoWithin - Dopasowuje dokumenty zawarte w określonym obszarze geometrycznym.
  • $near - Zwykle używane do wyszukiwania dokumentów najbliżej określonego punktu współrzędnych.

Uwaga: Aby uzyskać więcej informacji na temat zapytań geoprzestrzennych, prosimy o odniesienie się do następnych rozdziałów.