Converter distância para radianos para operadores esféricos
Nesta página
Os índices 2D suportam determinados operadores de query que calculam distâncias utilizando geometria esférica. Os operadores de query esférica utilizam radianos para distância. Para usar operadores de query esférica com um índice 2d, você deve converter distâncias para radianos.
Os índices 2D suportam os seguintes operadores de query esférica:
$geoNear
estágio do pipeline com a opçãospherical: true
Sobre esta tarefa
Usar um índice 2d para queries sobre dados esféricos pode retornar resultados incorretos ou um erro. Por exemplo, índices 2d não permitem queries esféricas que envolvam os pólos.
Se seus dados são armazenados como longitude e latitude e você geralmente executa query em superfícies esféricas, use um índice 2dsphere em vez de um índice 2d.
Quando você especificar coordenadas de longitude e latitude, liste primeiro a longitude e depois a latitude.
Os valores de longitude válidos estão entre
-180
e180
, ambos inclusos.Os valores de latitude válidos estão entre
-90
e90
, ambos inclusos.
Procedimento
Para converter a distância para radianos, divida a distância pelo raio da esfera (por exemplo, a Terra) nas mesmas unidades que a medida de distância.
O raio equatorial da Terra é de aproximadamente 3.963,2 milhas ou 6.378,1 quilômetros.
Exemplos
Os exemplos seguintes utilizam o operador $centerSphere
para executar queries. O operador $centerSphere
utiliza radianos para calcular distância.
Crie a coleção contacts
:
db.contacts.insertMany( [ { name: "Evander Otylia", phone: "202-555-0193", address: [ 55.5, 42.3 ] }, { name: "Georgine Lestaw", phone: "714-555-0107", address: [ -74, 44.74 ] } ] )
O campo address
contém pares de coordenadas legados.
Converter milhas em radianos
A seguinte query retorna documentos onde o campo address
está dentro de um círculo com ponto central [ -72, 44 ]
e um raio de 200 milhas:
db.contacts.find( { address: { $geoWithin: { $centerSphere: [ [ -72, 44 ] , 200 / 3963.2 ] } } } )
Saída:
[ { _id: ObjectId("647e565c6cdaf4dc323ec92d"), name: 'Georgine Lestaw', phone: '714-555-0107', address: [ -74, 44.74 ] } ]
Na query anterior, para converter 200 milhas para radianos, as milhas especificadas foram divididas por 3963.2.
Converter quilômetros em radianos
A seguinte query retorna documentos onde o campo address
está dentro de um círculo com ponto central [ 55, 42 ]
e um raio de 500 quilômetros:
db.contacts.find( { address: { $geoWithin: { $centerSphere: [ [ 55, 42 ] , 500 / 6378.1 ] } } } )
Saída:
[ { _id: ObjectId("647e565c6cdaf4dc323ec92c"), name: 'Evander Otylia', phone: '202-555-0193', address: [ 55.5, 42.3 ] } ]
Na query anterior, para converter 500 quilômetros para radianos, os quilômetros especificados foram divididos por 6378,1.