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

Buscar geoespacialmente

En esta guía, puedes aprender a buscar datos geoespaciales utilizando el driver de Rust. Los datos geoespaciales representan una ubicación geográfica en la superficie de la Tierra o 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

Esta guía incluye las siguientes secciones:

  • Almacene datos geoespaciales describe los formatos de datos que puede usar para representar datos geoespaciales

  • Índices geoespaciales describe cómo crear un índice en campos que almacenan datos geoespaciales

  • Consultas geoespaciales describe cómo consultar datos geoespaciales almacenados en campos indexados

  • Información adicional proporciona enlaces a recursos y documentación de la API para los tipos y métodos mencionados en esta guía

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

Utilice GeoJSON para almacenar datos que representan 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 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

  • Latitud en la segunda posición

El siguiente código representa la posición de la sede de MongoDB en la ciudad de Nueva York, NY:

let coords = vec! [-73.986805, 40.7620853];

Importante

Longitud luego latitud

GeoJSON ordena las coordenadas como longitud primero y latitud segundo. Esto entra en conflicto con las convenciones del sistema de coordenadas geográficas, que generalmente indican primero la latitud y segundo la longitud. Asegúrate de reformatear tus coordenadas para alinearlas con los estándares GeoJSON.

El tipo de tu objeto GeoJSON determina la forma geométrica que representa. Las formas geométricas se componen de posiciones.

La siguiente lista describe los tipos GeoJSON comunes y cómo especificarlos con posiciones:

  • Point: una única posición. Por ejemplo, el siguiente Point representa la ubicación de la sede central de MongoDB:

    let point = doc! {"name": "MongoDB HQ", "location": doc! {
    "type": "Point",
    "coordinates": vec! [-73.986805, 40.7620853],
    }
    };
  • 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. Por ejemplo, las siguientes LineString representan un segmento de la Gran Muralla China:

    let line = doc! {"name": "Great Wall of China", "location": doc! {
    "type": "LineString",
    "coordinates": vec! [
    vec! [116.572, 40.430],
    vec! [116.570, 40.434],
    vec! [116.567, 40.436],
    vec! [116.566, 40.441]
    ],
    }
    };
  • Polygon: un arreglo de posiciones en las que la primera y la última posición son iguales y rodean un espacio. Por ejemplo, la siguiente Polygon representa el terreno dentro de la Ciudad del Vaticano:

    let polygon = doc! {"name": "Vatican City", "location": doc! {
    "type": "Polygon",
    "coordinates": vec![
    vec! [
    vec! [12.458, 41.906],
    vec! [12.458, 41.901],
    vec! [12.450, 41.901],
    vec! [12.450, 41.906],
    vec! [12.458, 41.906],
    ]
    ],
    }
    };

Para obtener más información sobre los tipos de GeoJSON que puedes usar en MongoDB, consulta la página de GeoJSON en el manual del servidor.

Utiliza legacy coordinate pairs para representar datos geoespaciales en un plano euclidiano bidimensional.

El siguiente código especifica un par de coordenadas heredadas que representa la ubicación de Washington, D.C.:

let capital = vec! [-77.0369, 38.9072];

Para obtener más información sobre pares de coordenadas heredados, consulta Pares de coordenadas heredados en el manual del servidor.

Antes de consultar 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 para datos GeoJSON

  • 2d para pares de coordenadas heredados

Las siguientes secciones sobre los índices 2dsphere y 2d incluyen ejemplos de código que utilizan la colección theaters en la base de datos sample_mflix, a partir de los datos de ejemplo de Atlas.

Tip

Para obtener más información sobre cómo crear un índice, consulte la Indexes guide.

Para obtener instrucciones sobre cómo importar los datos de muestra de Atlas, consulte la página Cargar datos de muestra.

Para consultar datos almacenados en formato GeoJSON, añade el campo que contenga tanto los campos type y coordinates a un índice 2dsphere. El siguiente ejemplo crea un índice 2dsphere en el campo location.geo:

let index = IndexModel::builder()
.keys(doc! { "location.geo": "2dsphere" })
.build();
let idx = my_coll.create_index(index).await?;
println!("Created index:\n{}", idx.index_name);
Created index:
location.geo_"2dsphere"

Para query datos almacenados como legacy coordinate pairs, se debe agregar el campo que contiene legacy coordinate pairs a un índice 2d. El siguiente ejemplo crea un índice 2d en el campo location.geo.coordinates:

let index = IndexModel::builder()
.keys(doc! { "location.geo.coordinates": "2d" })
.build();
let idx = my_coll.create_index(index).await?;
println!("Created index:\n{}", idx.index_name);
Created index:
location.geo.coordinates_"2d"

Después de crear un índice 2dsphere o 2d sobre campos que contengan datos geoespaciales, puedes realizar queries geoespaciales que accedan a esos campos.

Para consultar datos geoespaciales, cree un filtro de query con un nombre de campo y un operador del query geoespacial. Puedes especificar opciones para ciertos operadores del query geoespaciales para limitar los documentos devueltos.

Las siguientes secciones sobre consultas geoespaciales incluyen ejemplos de código que utilizan la colección theaters en la base de datos sample_mflix de los datos de ejemplo de Atlas. Supongamos que la colección theaters tiene un índice 2dsphere en el campo location.geo.

Tip

Para aprender más información sobre la consulta de datos, consulta la guía Especificar una consulta.

Para obtener instrucciones sobre cómo importar los datos de muestra de Atlas, consulte la página Cargar datos de muestra.

Para consultar sus datos geoespaciales, utilice uno de los siguientes operadores de consulta:

  • $near

  • $geoWithin

  • $nearSphere

  • $geoIntersects (requiere 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

Tip

Para saber más sobre los operadores de consulta geoespacial, consulta Operadores de consulta geoespacial en el manual del servidor.

El siguiente ejemplo consulta documentos en los cuales el campo location.geo almacena una ubicación dentro de 1000 metros de la sede central de MongoDB en Nueva York, NY. El código devuelve documentos en orden ascendente de su distancia desde la sede de MongoDB.

let mongodb = vec! [-73.986805, 40.7620853];
let query = doc! {"location.geo":
doc! { "$near": {
"$geometry": {
"type": "Point", "coordinates": mongodb,
},
"$maxDistance": 1000,
}
}
};
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{}", doc);
}
{ "_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] } } }

El siguiente ejemplo query documentos en los que el campo location.geo almacena una ubicación dentro del área de Chicago. El ejemplo crea un vector llamado chicago que almacena cuatro coordenadas que representan los límites del área de búsqueda geográfica.

let chicago = doc! {
"type": "Polygon",
"coordinates": vec![
vec![
vec![-87.851, 41.976],
vec![-87.851, 41.653],
vec![-87.651, 41.653],
vec![-87.651, 41.976],
vec![-87.851, 41.976],
]
]
};
let query = doc! {"location.geo":
doc! { "$geoWithin": { "$geometry": chicago }}
};
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{}", doc);
}
{ "_id":{...},"theaterId":322,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.849403, 41.90707] } } }
{ "_id":{...},"theaterId":2960,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.811262, 41.847938] } } }
{ "_id":{...},"theaterId":323,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.653557, 41.912025] } } }
{ "_id":{...},"theaterId":320,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.805817, 41.847572] } } }
{ "_id":{...},"theaterId":814,"location":{"address":{...},"geo":{ "type":"Point","coordinates":[-87.670631, 41.919514] } } }

Para aprender más sobre las operaciones find, consulte la guía Recuperar Datos.

Para aprender más sobre cómo trabajar con datos geoespaciales, consulte las siguientes páginas del manual de Servidor:

Para obtener más información sobre los métodos y tipos mencionados en esta guía, vea la siguiente documentación de la API:

Volver

intercalación

En esta página