Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Query geoespacial

En esta guía, puede aprender cómo 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 para ejercitar perros en Nueva York

  • Puntos en un grafo

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 de la Tierra

  • Pares de coordenadas heredados, un formato que representa datos geoespaciales en un plano euclidiano

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.

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 (requerido)

  • Latitud en la segunda posición (obligatoria).

  • Elevación en la tercera posición (opcional)

La siguiente es la ubicació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 colocando primero la longitud y segundo la latitud. Asegúrate de verificar qué formato 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.

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 siguiente Point representa la ubicación de la sede de MongoDB:

    {
    "type": "Point",
    "coordinates": [-73.856077, 40.848447]
    }
  • LineString: un arreglo de dos o más posiciones que forma una serie de segmentos de línea. Una LineString puede representar un camino, ruta, frontera o cualquier otro dato geoespacial lineal. El siguiente LineString representa 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]]
    }
  • Polygonun arreglo de posiciones en el que la primera y la última posición son iguales y encierran un espacio. El siguiente Polygon representa aproximadamente el terreno 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 de GeoJSON.

Para obtener más información sobre el formato GeoJSON, consulta la especificación oficial de IETF.

Utiliza pares de coordenadas obsoletos para almacenar datos que representen 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 legacy coordinate pairs, consulta la página del manual del servidor MongoDB sobre legacy coordinate pairs.

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 GeoJSON

  • 2d, used for legacy coordinate pairs

Para obtener más información sobre cómo crear índices geoespaciales, consulte el Índices geoespaciales sección de la guía de índices.

Para consultar datos geoespaciales utilizando el operador find, utilice uno de los siguientes operadores del query:

  • $near

  • $geoWithin

  • $nearSphere

  • $geoIntersects (requiere un índice dsphere 2)

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 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.

Los siguientes ejemplos utilizan el conjunto de datos de muestra de MongoDB Atlas. Para obtener este conjunto de datos de muestra, consulta los Conjuntos de datos de ejemplo de Atlas. Para aprender cómo crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Primeros pasos con PyMongo.

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.

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 la 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 }

El siguiente ejemplo busca documentos con un valor de campo location.geo que se encuentre dentro de los límites de Manhattan. Selecciona 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 }

Volver

Configurar las operaciones CRUD

En esta página