これをこのように行うことはできません。一般に、コレクション内の値に基づいて MongoDB クエリを作成することはできません。
ただし、MongoDB 2.4 以降2dsphere
では、データベースにポイントだけでなくポリゴンも格納できるようにする新しいインデックスがサポートされています。その情報を次のようなドキュメントに保存します。
db.so.ensureIndex( { loc: '2dsphere' } );
db.so.insert( {
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
} );
次に、「交差」クエリを使用して、ポイントが各ポリゴンで覆われているかどうかを確認できます。
db.so.find( {
'loc' : {
$geoIntersects: {
$geometry: { type: 'Point', coordinates: [ 0, 0 ] }
}
}
} );
次に、次を返します。
{
"_id" : ObjectId("51f24d566775068ab0b786f0"),
"name" : "Firestation 1",
"loc" : {
"type" : "Polygon",
"coordinates" : [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
}
}
ここでは、0, 0 がポリゴンの中央にあるため、消防署が見つかります。ここでのコツはもちろん、中心点から「半径」(たとえば 10km) 離れた円を構成するポリゴン ポイントを計算することです。本当の円は作れませんが、六角形や八角形で十分です。その計算はそれほど単純ではありませんが、http://www.movable-type.co.uk/scripts/latlong.html#destPointに JavaScript の例があります。方位を 0 から 2PI までの 8 ステップでループして、円周に沿った点を計算し、それらを座標に入れます。それらを二重にネストされた配列に埋め込み、最初と最後の配列を同じにするようにしてください。
{
name: "Firestation 1",
loc: {
type: "Polygon",
coordinates: [ [
[ point1-lon, point1-lat ],
[ point2-lon, point2-lat ],
[ point3-lon, point3-lat ],
...
[ point1-lon, point1-lat ],
] ]
}
}