このようにこれを行うことはできません。一般に、コレクション内の値に基づいて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 ],
] ]
}
}