Overview
En esta guía, puede 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.
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
Formatos de 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
Pares de coordenadas heredados, 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 una única ubicación 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.
[-73.986805, 40.7620853]
Importante
Longitud luego latitud
GeoJSON ordena las coordenadas con la longitud primero y la latitud después. Asegúrate de verificar el formato que usan las demás herramientas con las que trabajas, ya que muchas herramientas populares, como OpenStreetMap y Google Maps, listan las coordenadas con la latitud primero y la longitud después.
Tipos
El tipo de tu 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:{ "type": "Point", "coordinates": [-73.856077, 40.848447] } 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:{ "type": "LineString", "coordinates": [[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 aproximadamente el territorio dentro de la Ciudad del Vaticano:{ "type": "Polygon", "coordinates": [[[12.446086, 41.901977], [12.457952, 41.901559], [12.455375, 41.907351], [12.449863, 41.905186], [12.446086, 41.901977]]] }
Para obtener más información sobre los tipos GeoJSON que puede utilizar en MongoDB, consulte la Entrada manual GeoJSON.
Para obtener más información sobre el formato 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 bidimensional.
Los pares de coordenadas heredados se representan con un arreglo de dos valores, en los que el primer valor representa el valor del eje x y el segundo representa el valor del eje y.
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:
2dsphere, utilizado para datos GeoJSON2d, utilizado para pares de coordenadas heredados
Para obtener más información sobre cómo crear índices geoespaciales, consulte la Sección Índices geoespaciales de la guía Índices.
Operadores del query
Para consultar datos geoespaciales utilizando el operador find, utilice uno de los siguientes operadores de consulta:
$near$geoWithin$nearSphere$geoIntersects(requiereun 2índice dsphere)
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 consultar datos geoespaciales utilizando el operador aggregate, debes utilizar la etapa de pipeline $geoNear.
Para obtener más información sobre los operadores de consulta geoespacial, consulte Operadores de consulta geoespacial en el manual del servidor.
Ejemplos
Los siguientes ejemplos utilizan el conjunto de datos de ejemplo de MongoDB Atlas. Para obtener este conjunto de datos, consulte Conjuntos de datos de ejemplo de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de ejemplo, consulte Introducción a PyMongo.
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 valor de campo location.geo a menos de 1000 metros de la sede de MongoDB en Nueva York. Devuelve los documentos del más cercano al más lejano. Seleccione Synchronous o pestaña Asynchronous para ver el código correspondiente:
# set query with point at MongoDB headquarters and a maxDistance of 1000 meters query = { "location.geo": { "$near": { "$geometry": { # Search around this location "type": "Point", "coordinates": [-73.986805, 40.7620853] }, "$maxDistance": 1000 # Distance in meters (1 km) } } } # fetches the _id and theaterId fields projection = { "theaterId": 1 } nearby_places = collection.find(query, projection) for i in nearby_places: print(i)
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 }
# set query with point at MongoDB headquarters and a maxDistance of 1000 meters query = { "location.geo": { "$near": { "$geometry": { # Search around this location "type": "Point", "coordinates": [-73.986805, 40.7620853] }, "$maxDistance": 1000 # Distance in meters (1 km) } } } # fetches the _id and theaterId fields projection = { "theaterId": 1 } nearby_places = collection.find(query, projection) async for i in nearby_places: print(i)
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 }
Consulta por polígono
El siguiente ejemplo busca documentos con un valor de campo location.geo dentro de los límites de Manhattan. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:
# Polygon representation of Manhattan query = { "location.geo": { "$geoWithin": { "$geometry": { # Search around this location "type": "Polygon", "coordinates": [[[-73.925492, 40.877410], [-73.910372, 40.872366], [-73.935127, 40.834020], [-73.929049, 40.798569], [-73.976485, 40.711432], [-74.015747, 40.701229], [-74.018859, 40.708367], [-74.008007, 40.754307], [-73.925492, 40.877410]]] } } } } # fetches the _id and theaterId fields projection = { "theaterId": 1 } nearby_places = collection.find(query, projection) for i in nearby_places: print(i)
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47287cfa9a3a73e51eccb"), "theaterId" : 835 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 } { "_id" : ObjectId("59a47286cfa9a3a73e51e744"), "theaterId" : 1028 } { "_id" : ObjectId("59a47287cfa9a3a73e51ebe1"), "theaterId" : 609 } { "_id" : ObjectId("59a47287cfa9a3a73e51e8ed"), "theaterId" : 1906 } { "_id" : ObjectId("59a47287cfa9a3a73e51e87d"), "theaterId" : 1531 } { "_id" : ObjectId("59a47287cfa9a3a73e51eb63"), "theaterId" : 482 }
# Polygon representation of Manhattan query = { "location.geo": { "$geoWithin": { "$geometry": { # Search around this location "type": "Polygon", "coordinates": [[[-73.925492, 40.877410], [-73.910372, 40.872366], [-73.935127, 40.834020], [-73.929049, 40.798569], [-73.976485, 40.711432], [-74.015747, 40.701229], [-74.018859, 40.708367], [-74.008007, 40.754307], [-73.925492, 40.877410]]] } } } } # fetches the _id and theaterId fields projection = { "theaterId": 1 } nearby_places = collection.find(query, projection) async for i in nearby_places: print(i)
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47287cfa9a3a73e51eccb"), "theaterId" : 835 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 } { "_id" : ObjectId("59a47286cfa9a3a73e51e744"), "theaterId" : 1028 } { "_id" : ObjectId("59a47287cfa9a3a73e51ebe1"), "theaterId" : 609 } { "_id" : ObjectId("59a47287cfa9a3a73e51e8ed"), "theaterId" : 1906 } { "_id" : ObjectId("59a47287cfa9a3a73e51e87d"), "theaterId" : 1531 } { "_id" : ObjectId("59a47287cfa9a3a73e51eb63"), "theaterId" : 482 }
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.