球面形状を使用した距離の計算
警告
球面クエリの場合は、 2dsphere
インデックス結果を使用します。
球面クエリに2d
インデックスを使用すると、北極と南極が入っている球面クエリに2d
インデックスを使用するなど、誤った結果が生じる可能性があります。
2d
インデックスは、ユークリッド平面(平面)上の距離を計算するクエリをサポートしています。 インデックスは、球面ジオメトリを使用して距離を計算する次のクエリ演算子とコマンドもサポートしています。
注意
球面距離を使用する基本的なクエリは2d
インデックスでサポートされていますが、データが経度と緯度が主な場合は、 2dsphere
インデックスへの移行を検討してください。
$geoNear
オプション付きの パイプライン ステージspherical: true
重要
上記の操作では、距離にラジアンが使用されます。 他の球面クエリ演算子$geoWithin
など)ではこの処理は実行されません。
球面クエリ演算子が正しく機能するには、距離をラジアンに変換し、ラジアンからアプリケーションで使用される距離単位に変換する必要があります。
変換するには:
ラジアンへの距離 : 距離測定と同じ単位で、距離を球体(例: 地球)の半径で割ります。
ラジアンから距離: 距離を変換する単位システムで、ラジアンの測定値に球体(例:地球)の半径を掛けます。
地球の等価半径は約3,963.2
マイル、または6,378.1
キロです。
次のクエリでは、中心[ -74, 40.74 ]
によって記述され、半径が100
マイルである円内にあるplaces
コレクションからドキュメントが返されます。
db.places.find( { loc: { $geoWithin: { $centerSphere: [ [ -74, 40.74 ] , 100 / 3963.2 ] } } } )
注意
重要
緯度と経度の座標を指定する場合は、最初に経度、次に緯度を指定します。
有効な経度の値は、
-180
以上、180
以下です。有効な緯度の値は
-90
以上、90
以下です。