Overview
En esta guía, aprenderá a buscar datos geoespaciales con el controlador 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 de ejercicio para perros en la ciudad de Nueva York
Puntos en un gráfico
Esta guía incluye las siguientes secciones:
Almacenar datos geoespaciales describe los formatos de datos que puede utilizar 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 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 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
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 después. Esto contradice las convenciones del sistema de coordenadas geográficas, que generalmente indican latitud primero y longitud después. Asegúrese de reformatear sus coordenadas para que se ajusten a los estándares de GeoJSON.
Tipos
El tipo de su 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 sola posición. Por ejemplo, el siguientePointrepresenta la ubicación de la sede de MongoDB:let point = doc! {"name": "MongoDB HQ", "location": doc! { "type": "Point", "coordinates": vec! [-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. Por ejemplo, el siguienteLineStringrepresenta 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 GeoJSON que puede utilizar en MongoDB, consulte la página GeoJSON en el manual del servidor.
Legacy Coordinate Pairs
Utilice pares de coordenadas heredadas 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, DC:
let capital = vec! [-77.0369, 38.9072];
Para obtener más información sobre los pares de coordenadas heredados, consulte 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 de los datos de muestra de Atlas.
Tip
Para obtener más información sobre cómo crear un índice, consulte la Guíade índices.
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, agregue el campo que contiene 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"
2 d
Para consultar datos almacenados como pares de coordenadas heredados, agregue el campo que contiene los pares de coordenadas heredados 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 en los campos que contienen datos geoespaciales, puede realizar consultas 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 obtener más información sobre cómo consultar datos, consulte 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)
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
Tip
Para obtener más información sobre los operadores de consulta geoespacial, consulte Operadores de consulta geoespacial en el manual del servidor.
Ejemplo de consulta por proximidad
El siguiente ejemplo busca documentos cuyo campo location.geo almacena una ubicación a 1000 metros de la sede de MongoDB en Nueva York. El código devuelve los documentos en orden ascendente según su distancia a 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 consulta dentro de un rango
El siguiente ejemplo busca documentos cuyo 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 geográfica de búsqueda.
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 obtener más información sobre cómo trabajar con datos geoespaciales, consulte las siguientes páginas del manual del servidor:
Documentación de la API
Para obtener más información sobre los métodos y tipos mencionados en esta guía, consulte la siguiente documentación de API: