Overview
En esta guía, aprenderá a trabajar con datos geoespaciales: formatos de datos, índices y consultas. Los datos geoespaciales representan una ubicación geográfica en la superficie de la Tierra o datos en un plano euclidiano.
Algunos ejemplos de datos geoespaciales incluyen:
Ubicaciones de cines
Fronteras de los países
Rutas de paseos en bicicleta
Áreas para ejercitar perros en Nueva York
Puntos en un grafo
Almacenar datos geoespaciales
Todos los datos geoespaciales en MongoDB se almacenan en uno de los siguientes formatos:
GeoJSON, un formato que representa datos geoespaciales en una esfera similar a la tierra.
Legacy Pair De Coordenadas, un formato que representa datos geoespaciales en un plano euclidiano.
GeoJSON
Utiliza GeoJSON para almacenar datos que representen información geoespacial en una esfera similar a la Tierra. GeoJSON se compone de una o más posiciones y un tipo.
Posiciones
Una posición representa un lugar único en la Tierra y existe en el código como un arreglo que contiene los siguientes valores:
Longitud en la primera posición (requerido)
Latitud en la segunda posición (obligatoria).
Elevación en la tercera posición (opcional)
La siguiente es la posición de la sede de MongoDB en la ciudad de Nueva York, NY.
[]float64{-73.986805, 40.7620853}
Importante
Longitud luego latitud
GeoJSON ordena las coordenadas primero en longitud y en segundo lugar en latitud. Esto puede ser sorprendente ya que las convenciones del sistema de coordenadas geográficas generalmente colocan la latitud primero y luego la longitud. Asegúrate de comprobar qué formato utilizan otras herramientas con las que trabajas. Herramientas populares como OpenStreetMap y Google Maps muestran las coordenadas primero con el formato de latitud y luego longitud.
Tipos
El tipo de tu objeto GeoJSON determina la forma geométrica que representa. Las formas geométricas se componen de posiciones.
Aquí tienes algunos tipos comunes de GeoJSON y cómo puedes especificarlos con posiciones:
Point: una sola posición. El siguientePointrepresenta la ubicación de la sede de MongoDB:bson.D{ {"name", "MongoDB HQ"}, {"location", bson.D{ {"type", "Point"}, {"coordinates", []float64{-73.986805, 40.7620853}}, }}, } LineString: un arreglo de dos o más posiciones que forma una serie de segmentos de línea. UnLineStringpuede representar un camino, ruta, frontera u otro dato geoespacial lineal. El siguienteLineStringrepresenta un segmento de La Gran Muralla China:bson.D{ {"name", "Great Wall of China"}, {"location", bson.D{ {"type", "LineString"}, {"coordinates", [][]float64{ {116.572, 40.430}, {116.570, 40.434}, {116.567, 40.436}, {116.566, 40.441}, }}}, }, } Polygonun arreglo de posiciones en el que la primera y la última posición son iguales y encierran un espacio. Lo siguientePolygonrepresenta la tierra dentro de la Ciudad del Vaticano:bson.D{ {"name", "Vatican City"}, {"location", bson.D{ {"type", "Polygon"}, {"coordinates", [][][]float64{{ {12.446086, 41.901977}, {12.457952, 41.901559}, {12.455375, 41.907351}, {12.449863, 41.905186}, {12.446086, 41.901977}, }}}, }}, }
Para conocer más sobre los tipos de GeoJSON que puedes utilizar en MongoDB, consulta la entrada del manual de GeoJSON.
Para obtener información definitiva sobre GeoJSON, consulte la especificación oficial de IETF.
Legacy Coordinate Pairs
Utilice pares de coordenadas heredadas para almacenar datos que representan información geoespacial en un plano euclidiano bidimensional.
El campo debe contener un arreglo de dos valores, en el que el primero representa el valor del eje x y el segundo representa el valor del eje y.
bson.D{{"center", []int16{0, 0}}}
Para obtener más información sobre legacy coordinate pairs, consulta la página del manual del servidor MongoDB sobre legacy coordinate pairs.
Índices geoespaciales
Para habilitar las consultas en datos geoespaciales, deberás crear un índice que corresponda al formato de los datos. Los siguientes tipos de índice permiten consultas geoespaciales:
2dspherepara datos GeoJSON2dpara pares de coordenadas heredados
2dsphere
Para query datos almacenados en el formato GeoJSON, agregue el campo que contiene tanto la type como la coordinates a un índice 2dsphere. El siguiente ejemplo crea un índice 2dsphere en el campo location:
indexModel := mongo.IndexModel{ Keys: bson.D{{"location", "2dsphere"}}, } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) }
2d
Para query datos almacenados como legacy coordinate pairs, debe agregar el campo que contiene los legacy coordinate pairs a un índice 2d. El siguiente ejemplo crea un índice 2d en el campo coordinates:
indexModel := mongo.IndexModel{ Keys: bson.D{{"location.coordinates", "2d"}}, } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) }
Query geoespacial
Para realizar un query geoespacial, crea un filtro de query con un nombre de campo y un operador del query geoespacial. Puedes especificar opciones adicionales para ciertos operadores del query geoespaciales para limitar los documentos devueltos.
Si aún no lo ha hecho, deberá crear un índice geoespacial para habilitar las consultas geoespaciales.
Tip
Operadores compatibles
Los índices esféricos (2dsphere) y planos (2d) admiten algunos, pero no todos, los mismos operadores del query. Para ver una lista completa de operadores y su compatibilidad con el índice, consulta la entrada del manual de consultas geoespaciales.
Operadores del query
Para consultar sus datos geoespaciales, utilice uno de los siguientes operadores de consulta:
$near$geoWithin$nearSphere$geoIntersectsrequiere un índice 2dsphere
Cuando se usa el operador $near, puede especificar los siguientes operadores de distancia:
$minDistance$maxDistance
Al utilizar el operador $geoWithin, se pueden especificar los siguientes operadores de forma:
$box$polygon$center$centerSphere
Para más información sobre los operadores del query geoespacial, vea la entrada del manual para queries geoespaciales.
Ejemplos
Los siguientes ejemplos utilizan el conjunto de datos de muestra de MongoDB Atlas. Puedes cargar conjuntos de datos de muestra en tu base de datos usando el nivel gratuito de MongoDB Atlas siguiendo los pasos en Cómo comenzar con Atlas o puedes importar el conjunto de datos de muestra en una instancia local de MongoDB.
Los ejemplos utilizan la colección theaters en la base de datos sample_mflix del conjunto de datos de muestra. La colección theaters contiene un índice 2dsphere en el campo location.geo.
Query por Proximidad
El siguiente ejemplo query documentos con un campo location.geo dentro de los 1000 metros de la sede de MongoDB en la ciudad de Nueva York, NY. Devuelve documentos de los más cercanos a los más lejanos.
mongoDBHQ := bson.D{{"type", "Point"}, {"coordinates", []float64{-73.986805, 40.7620853}}} filter := bson.D{ {"location.geo", bson.D{ {"$near", bson.D{ {"$geometry", mongoDBHQ}, {"$maxDistance", 1000}, }}, }}, } var places []bson.D output, err := coll.Find(context.TODO(), filter) if err = output.All(context.TODO(), &places); err != nil { panic(err) } for _, place := range places { res, _ := bson.MarshalExtJSON(place, false, false) fmt.Println(string(res)) }
{"_id":{...},"theaterId":1908,"location":{"address":{...},"geo":{"type":"Point","coordinates":[-73.983487,40.76078]}}} {"_id":{...},"theaterId":1448,"location":{"address":{...},"geo":{"type":"Point","coordinates":[-73.982094,40.769882]}}}
Consulta dentro de un rango
El siguiente ejemplo query documentos con un campo location.geo a no menos de 2000 metros y no más lejos de 3000 metros de la sede de MongoDB en la ciudad de Nueva York, Nueva York. Devuelve documentos de los más cercanos a los más lejanos.
mongoDBHQ := bson.D{{"type", "Point"}, {"coordinates", []float64{-73.986805, 40.7620853}}} filter := bson.D{ {"location.geo", bson.D{ {"$nearSphere", bson.D{ {"$geometry", mongoDBHQ}, {"$minDistance", 2000}, {"$maxDistance", 3000}, }}, }}, } var places []bson.D output, err := coll.Find(context.TODO(), filter) if err = output.All(context.TODO(), &places); err != nil { panic(err) } for _, place := range places { res, _ := bson.MarshalExtJSON(place, false, false) fmt.Println(string(res)) }
{"_id":{...},"theaterId":482,"location":{...},"geo":{"type":"Point","coordinates":[-73.99295,40.74194]}}}
Recursos adicionales
Para obtener más información sobre cómo trabajar con datos geoespaciales, consulta la entrada del manual de datos geoespaciales.
Para obtener más información sobre los tipos de GeoJSON admitidos, consulta la entrada en el manual de GeoJSON.
Para obtener más información sobre los operadores del query geoespacial, consulta la entrada del manual sobre queries geoespaciales.
Para obtener más información sobre cómo trabajar con índices con el controlador de Go, consulte el index guide.