Menu Docs
Página inicial do Docs
/ / /
Driver Rust
/

Pesquisar geoespacialmente

Nesta página

  • Visão geral
  • Armazenar dados geoespaciais
  • GeoJSON
  • Pares de coordenadas legados
  • Índices geoespaciais
  • 2dsphere
  • 2d
  • Consultas geoespaciais
  • Operadores de Consulta
  • Exemplo de query por proximidade
  • Exemplo de query dentro de um intervalo
  • Informações adicionais
  • Documentação da API

Neste guia, você pode aprender como pesquisar dados geoespaciais utilizando o driver Rust. Os dados geoespaciais representam uma localização geográfica na superfície da Terra ou em um plano euclidiano.

Exemplos de dados geoespaciais incluem:

  • Localizações de cinemas

  • Fronteiras de países

  • Rotas de passeios de bicicleta

  • Áreas de exercícios para cães na cidade de Nova York

  • Pontos em um gráfico

Este guia inclui as seguintes seções:

  • Armazenar dados geoespaciais descreve os formatos de dados que você pode utilizar para representar dados geoespaciais

  • Índices geoespaciais descreve como criar um índice em campos que armazenam dados geoespaciais

  • Consultas geoespaciais descrevem como consultar dados geoespaciais armazenados em campos indexados

  • Informações adicionais fornecem links para recursos e documentação da API para os tipos e métodos mencionados neste guia

Todos os dados geoespaciais no MongoDB são armazenados em um dos seguintes formatos:

  • GeoJSON, um formato que representa dados geoespaciais em uma esfera semelhante à Terra

  • Par de Coordenadas Legado, um formato que representa dados geoespaciais em um plano Euclidiano

Utilize GeoJSON para armazenar dados que representam informações geoespaciais em uma esfera semelhante à Terra. O GeoJSON é composto por uma ou mais posições e um tipo.

Uma posição representa um único local na Terra e existe em código como uma array contendo os seguintes valores:

  • Longitude na primeira posição

  • Latitude na segunda posição

O código a seguir representa a posição da sede do MongoDB na cidade de Nova York, NY:

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

Importante

Longitude e depois latitude

A GeoJSON ordena coordenadas como longitude primeiro e latitude segundo. Isso entra em conflito com as convenções do sistema de coordenadas geográficas, que geralmente listam a latitude primeiro e a longitude segundo. Certifique-se de reformatar suas coordenadas para alinhar com os padrões GeoJSON.

O tipo de objeto GeoJSON determina a forma geométrica que representa. Formas geométricas são compostas por posições.

A seguinte lista descreve tipos de GeoJSON comuns e como especificá-los com posições:

  • Point: uma única posição. Por exemplo, o seguinte Point representa a localização da sede do MongoDB:

    let point = doc! {"name": "MongoDB HQ", "location": doc! {
    "type": "Point",
    "coordinates": vec! [-73.986805, 40.7620853],
    }
    };
  • LineString: uma matriz de duas ou mais posições que forma uma série de segmentos de linha. Um LineString pode representar um caminho, rota, borda ou quaisquer outros dados geoespaciais lineares. Por exemplo, o seguinte LineString representa um segmento da Grande Muralha da 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: uma array de posições em que a primeira e a última posição são iguais e incluem algum espaço. Por exemplo, o seguinte Polygon representa a terra dentro da Cidade do 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 saber mais sobre os tipos de GeoJSON que você pode usar no MongoDB, consulte a página GeoJSON no manual do servidor.

Utilize legacy coordinate pairs para representar dados geoespaciais em um plano Euclidiano bidimensional.

O código a seguir especifica um par de coordenadas legado que representa a localização de Washington, DC:

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

Para saber mais sobre legacy coordinate pairs, consulte Pares de legacy coordinate pairs no manual do servidor MongoDB.

Antes de consultar dados geoespaciais, você deve criar um índice que corresponde ao formato de dados. Os seguintes tipos de índice habilitam query geoespaciais:

  • 2dsphere para dados GeoJSON

  • 2d para pares de coordenadas legadas

As seções a seguir sobre índices 2dsphere e 2d incluem exemplos de código que usam a coleção theaters no banco de dados sample_mflix dos dados de exemplo do Atlas.

Dica

Para saber mais sobre como criar um índice, consulte o guiaÍndices .

Para obter instruções sobre como importar os dados de amostra do Atlas, consulte a página Carregar dados de amostra .

Para dados de query armazenados no formato GeoJSON, adicione o campo que contém os campos type e coordinates a um índice 2dsphere . O seguinte exemplo cria um índice 2dsphere no 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 dados armazenados como pares de coordenadas legados, adicione o campo que contém pares de coordenadas legados a um índice 2d . O seguinte exemplo cria um índice 2d no 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"

Após criar um índice 2dsphere ou 2d em campo contendo dados geoespaciais, você pode executar query geoespaciais que acessam estes campo.

Para executar query de dados geoespaciais, crie um filtro de query com um nome de campo e um operador de query geoespacial. Você pode especificar opções para determinados operadores de query geoespacial para limitar os documentos retornados.

As seguintes seções sobre query geoespaciais incluem exemplos de código que utilizam a collection theaters no reconhecimento de data center sample_mflix a partir dos dados de amostra do Atlas. Suponha que a collection theaters tenha um índice 2dsphere no campo location.geo .

Dica

Para saber mais sobre como consultar dados, consulte o guia Especificar uma query .

Para obter instruções sobre como importar os dados de amostra do Atlas, consulte a página Carregar dados de amostra .

Para fazer query de seus dados geoespaciais, utilize um dos seguintes operadores de query:

  • $near

  • $geoWithin

  • $nearSphere

  • $geoIntersects (requer um índice 2dsphere)

Ao utilizar o operador $near, você pode especificar os seguintes operadores de distância:

  • $minDistance

  • $maxDistance

Ao utilizar o operador $geoWithin, você pode especificar os seguintes operadores de forma:

  • $box

  • $polygon

  • $center

  • $centerSphere

Dica

Para saber mais sobre operadores de query geoespacial, consulte Operadores de query geoespacial no manual do servidor MongoDB.

O exemplo a seguir faz query de documentos em que o campo location.geo armazena um local em um raio de 1.000 metros da sede do MongoDB na cidade de Nova York, NY. O código retorna documentos em ordem crescente de distância da sede do 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] } } }

A seguinte query de exemplo para documento em que o campo location.geo armazena um local dentro da área de Ohio. O exemplo cria um vetor denominado chicago que armazena quatro coordenadas representando os limites da área de pesquisa 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 saber mais sobre como encontrar operações, consulte o guia Recuperar dados .

Para saber mais sobre como trabalhar com dados geoespaciais, consulte as seguintes páginas de manual do servidor:

Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo:

Voltar

Agrupamentos