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 de ejercicio para perros en la ciudad de Nueva York
Puntos en un gráfico
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.
Par de coordenadas heredado, 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 solo lugar en la Tierra y existe en el código como una matriz que contiene los siguientes valores:
Longitud en la primera posición (obligatorio)
Latitud en la segunda posición (obligatorio)
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 como longitud primero y latitud después. Esto puede resultar sorprendente, ya que las convenciones de los sistemas de coordenadas geográficas generalmente indican la latitud primero y la longitud después. Asegúrate de verificar el formato que usan otras herramientas con las que trabajas. Herramientas populares como OpenStreetMap y Google Maps indican las coordenadas como latitud primero y longitud después.
Tipos
El tipo de su objeto GeoJSON determina la forma geométrica que representa. Las formas geométricas se componen de posiciones.
A continuación se muestran algunos tipos GeoJSON comunes 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: una matriz de dos o más posiciones que forma una serie de segmentos de línea. UnLineStringpuede representar una ruta, una frontera o cualquier 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}, }}}, }, } Polygon: una matriz de posiciones donde la primera y la última son iguales y encierran espacio. El siguientePolygonrepresenta el terreno 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 IETF.
Legacy Coordinate Pairs
Utilice pares de coordenadas heredadas para almacenar datos que representan información geoespacial en un plano euclidiano bidimensional.
Su campo debe contener una matriz de dos valores en la 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 pares de coordenadas heredados, consulte la página del manual del servidor MongoDB sobre pares de coordenadas heredados.
Índices geoespaciales
Para habilitar las consultas sobre datos geoespaciales, debe crear un índice que se corresponda con el formato de los datos. Los siguientes tipos de índice permiten realizar consultas geoespaciales:
2dspherepara datos GeoJSON2dpara pares de coordenadas heredados
2dsphere
Para consultar datos almacenados en formato GeoJSON, agregue el campo que contiene tanto type como 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) }
2 d
Para consultar datos almacenados como pares de coordenadas heredados, debe agregar el campo que contiene los pares de coordenadas heredados 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 una consulta geoespacial, cree un filtro de consulta con un nombre de campo y un operador de consulta geoespacial. Puede especificar opciones adicionales para ciertos operadores de consulta geoespacial 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 () y planos2dsphere2d () admiten algunos, pero no todos, los mismos operadores de consulta. Para obtener una lista completa de operadores y su compatibilidad con índices, consulte la entrada del manual sobre 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
Al utilizar el operador $near, puede especificar los siguientes operadores de distancia:
$minDistance$maxDistance
Al utilizar el operador $geoWithin, puede especificar los siguientes operadores de forma:
$box$polygon$center$centerSphere
Para obtener más información sobre los operadores de consultas geoespaciales, consulte la entrada manual para consultas geoespaciales.
Ejemplos
Los siguientes ejemplos utilizan el conjunto de datos de ejemplo de MongoDB Atlas. Puede cargar conjuntos de datos de ejemplo en su base de datos en la versión gratuita de MongoDB Atlas siguiendo la Guía de introducción a Atlas o importar el conjunto de datos de ejemplo a una instancia local de MongoDB.
Los ejemplos utilizan la colección theaters de 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.
Consulta por proximidad
El siguiente ejemplo busca documentos con un campo location.geo a menos de 1000 metros de la sede de MongoDB en Nueva York. Devuelve los documentos desde el más cercano hasta el más lejano.
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 busca documentos con un campo location.geo a una distancia no inferior a 2000 metros ni superior a 3000 metros de la sede de MongoDB en Nueva York. Devuelve los documentos desde el más cercano al más lejano.
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, consulte la entrada manual de datos geoespaciales.
Para obtener más información sobre los tipos GeoJSON admitidos, consulte la entrada del manual GeoJSON.
Para obtener más información sobre los operadores de consultas geoespaciales, consulte la entrada manual para consultas geoespaciales.
Para obtener más información sobre cómo trabajar con índices con el controlador Go, consulte la guía de índice.