Overview
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
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
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.
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
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.
Tipos
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 siguientePointrepresenta 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. UnaLineStringpuede representar un camino, ruta, frontera o cualquier otro dato geoespacial lineal. Por ejemplo, las siguientesLineStringrepresentan 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 siguientePolygonrepresenta 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.
Legacy Coordinate Pairs
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.
Índices geoespaciales
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:
2dspherepara datos GeoJSON2dpara 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.
2dsphere
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"
2d
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"
Query geoespacial
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.
Operadores del query
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.
Ejemplo de consulta por proximidad
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] } } }
Ejemplo de query dentro de un rango
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] } } }
Información Adicional
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:
Documentación de la API
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: