Calcular distância utilizando geometria esférica
Aviso
Para queries esféricas, utilize o resultado do índice 2dsphere
.
O uso do índice 2d
para query esféricas pode levar a resultados incorretos, como o uso do índice 2d
para query esféricas que envolvem os pólos.
O índice 2d
suporta queries que calculam distâncias em um plano euclidiano (superfície plana). O índice também suporta os seguintes operadores de query e comando que calculam distâncias utilizando geometria esférica:
Observação
Embora as queries básicas que utilizam distância esférica sejam suportadas pelo índice 2d
, considere mover para um índice 2dsphere
se seus dados forem principalmente longitude e latitude.
$geoNear
estágio do pipeline com a opçãospherical: true
Importante
As operações mencionadas acima utilizam radianos para distância. Outros operadores de query esférica não, como $geoWithin
.
Para que os operadores de query esférica funcionem corretamente, você deve converter distâncias para radianos e converter de radianos para as unidades de distância usadas pelo aplicativo.
Para converter:
distância para radianos: divide a distância pelo raio da esfera (por exemplo, a Terra) nas mesmas unidades que a medida de distância.
radianos para distância: multiplique a medida de radianos pelo raio da esfera (por exemplo, a Terra) no sistema de unidades para o qual você deseja converter a distância.
O raio equatorial da Terra é de aproximadamente 3,963.2
milhas ou 6,378.1
quilômetros.
A query a seguir retornaria documentos da coleção places
dentro do círculo descrito pelo centro [ -74, 40.74 ]
com um raio de 100
milhas:
db.places.find( { loc: { $geoWithin: { $centerSphere: [ [ -74, 40.74 ] , 100 / 3963.2 ] } } } )
Observação
Importante
Se especificar coordenadas de latitude e longitude, liste a longitude primeiro e então 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.