球体上の円内のロケーションのクエリ
球体上の円内のロケーション データをクエリできます。 これらのクエリを使用して、 球面上限内のデータを返します。
球体上の円内のロケーション データをクエリするには、 $geoWithin
と$centerSphere
演算子を使用します。 $centerSphere
演算子で、クエリする円の座標と半径を指定します。
db.<collection>.find( { <location field> : { $geoWithin : { $centerSphere: [ [ <longitude>, <latitude> ], <radius> ] } } } )
このタスクについて
経度と緯度の座標を指定する場合は、最初に経度、次に緯度を指定します。
有効な経度の値は、
-180
以上、180
以下です。有効な緯度の値は
-90
以上、90
以下です。
$centerSphere
演算子で、円の半径をラジアンで指定します。 他の単位をラジアンに変換したり、ラジアンから任意の値に変換するには、「球面演算子の距離をラジアンに変換する 」を参照してください。この例では、距離をキロメートル単位で計算します。 キロメートルをラジアンに変換するには、キロメートルの値を
6378.1
で割ります。
$geoWithin
には地理空間インデックスは必要ありません。 ただし、地理空間インデックスを使用するとクエリのパフォーマンスが向上します。 2dsphere地理空間インデックスのみが$geoWithin
をサポートします。 詳細については、 「2dsphere インデックスの作成」 を参照してください。
始める前に
これらのドキュメントを含むplaces
コレクションを作成します。
db.places.insertMany( [ { loc: { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Park" }, { loc: { type: "Point", coordinates: [ -73.88, 40.78 ] }, name: "La Guardia Airport", category: "Airport" }, { loc: { type: "Point", coordinates: [ -1.83, 51.18 ] }, name: "Stonehenge", category : "Monument" } ] )
手順
コレクションをクエリするには、 $geoWithin
と$centerSphere
演算子を使用します。
db.places.find( { loc: { $geoWithin: { $centerSphere: [ [ -1.76, 51.16 ], 10 / 6378.1 ] } } } )
クエリは、 loc
フィールドが経度-1.76
、緯度51.16
の点の 10 キロメートル以内にあるドキュメントを返します。
出力:
[ { _id: ObjectId("63fd205e4a08b5e248c03e32"), loc: { type: 'Point', coordinates: [ -1.83, 51.18 ] }, name: 'Stonehenge', category: 'Monument' } ]