Este capítulo introduce cómo almacena MongoDB datos geoespaciales. Para poder hacer uso de la funcionalidad de consultas geoespaciales de MongoDB, primero necesitamos entender cómo almacenar datos geoespaciales.

Los datos geoespaciales consisten principalmente en puntos, líneas y formas geométricas.

Un punto en un mapa se define por sus coordenadas de longitud y latitud. Varios puntos forman una línea, y varias líneas pueden formar diversas formas.

En aplicaciones prácticas: La ubicación de una tienda, "¿Dónde estoy?", y "¿Dónde está la escuela?" pueden representarse utilizando coordenadas. Describir la extensión de un campus o un centro comercial requiere formas geométricas.

Objeto GeoJSON

MongoDB utiliza objetos GeoJSON para representar información geoespacial.

Los tipos comunes de GeoJSON incluyen:

  • Punto: representa un punto de coordenadas.
  • LineString: representa una línea.
  • Polígono: representa un polígono.

El formato para almacenar objetos GeoJSON en campos de MongoDB es el siguiente:

<campo>: { type: <tipo geojson>, coordinates: <coordenadas> }

Explicación:

  • - Nombre del campo
  • type - Tipo GeoJSON
  • coordinates - Un arreglo de puntos de coordenadas. El formato varía para diferentes tipos de GeoJSON.

Ejemplo:

ubicacion: {
      type: "Point",  // tipo de dato geoespacial, en este caso, es un punto de coordenadas
      coordinates: [-73.856077, 40.848447] // longitud, latitud
}

Explicación: El campo ubicación almacena datos geoespaciales del tipo punto de coordenadas.

Punto de Coordenadas (Point)

Formato:

{ type: "Point", coordinates: [ longitud, latitud ] }

Ejemplo:

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

Línea (LineString)

Formato:

{ type: "LineString", coordinates: [ punto1, punto2, ...] }

Ejemplo:

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

Polígono

Puede estar compuesto por una o más líneas. Formato:

{
  type: "Polygon",
  coordinates: [ 
		línea1,
		línea2,
		....
	]
}

Nota: Las coordenadas de inicio y fin de cada segmento de línea deben ser las mismas para formar una forma cerrada.

Forma Compuesta por un Único Segmento de Línea

{
  type: "Polygon",
  coordinates: [
  		[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] // Puntos de coordenadas del segmento de línea, nota que las primeras y últimas coordenadas son iguales.
	]
}

Forma Compuesta por Múltiples Segmentos de Línea

{
  type : "Polygon",
  coordinates : [
     [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ], // Segmento de línea 1
     [ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]  // Segmento de línea 2
  ]
}

Índice Geoespacial

MongoDB soporta dos tipos de índices geoespaciales para acelerar la búsqueda de datos GeoJSON.

2dsphere

Este es un tipo de índice de geometría esférica, lo que significa que al calcular la distancia entre dos puntos, 2dsphere considera la tierra como una esfera.

Ejemplo de creación de un índice 2dsphere:

db.coleccion.createIndex( { ubicacion : "2dsphere" } )

Crea un índice para el campo ubicacion.

2d

2D es un tipo de geometría plana que se utiliza para calcular la distancia entre dos puntos como si estuvieran en un plano. Ejemplo de creación de un índice 2D:

db.coleccion.createIndex( { ubicacion : "2d" } )

Esto crea un índice para el campo ubicacion.

Tipos de Consultas Geoespaciales

Las consultas geoespaciales están relacionadas con cálculos geométricos. A continuación se muestran los tipos de consultas admitidos por MongoDB:

  • $geoIntersects: utilizado para hacer coincidir documentos con una intersección específica de formas geométricas.
  • $geoWithin: coincide con documentos contenidos dentro de un área geométrica especificada.
  • $near: utilizado típicamente para consultar documentos más cercanos a un punto de coordenadas especificado.

Nota: Para más información sobre consultas geoespaciales, consulte los siguientes capítulos.