MongoDBの$geoIntersects
を使用して可能です 地理空間クエリ演算子。
したがって、GeoJsonポリゴンのコレクションがあり、指定されたポイントと交差するすべてのポリゴンを見つけたい場合は、次を実行する必要があります。
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
上記のコマンドで、loc
GeoJsonポリゴンの座標を含む各ドキュメントの属性です。また、2dsphere
があることを確認してください <locationFieldOfYourDocuments>
のインデックス 。
ここで、元の問題を解決するために、JavaScriptを少し使用します。より良い解決策があるかもしれませんが、私の知る限りではありません。
すべてのサークルがCircles
に保存されているとしましょう コレクション。そのコレクションにクエリを実行し、各円を1つずつフェッチしてから、円と交差するかどうかに関係なくクエリする単一のポイントを含む別のコレクションとの交差を実行します。したがって、ポイントをSinglePoint
に保存します。 コレクション。
スクリプトは次のようになります...
db.Intersections.remove({}); // emptying the output collection
var circleCursor = db.Circles.find();
while (circleCursor.hasNext()) {
var circle = circleCursor.next();
var coord = circle.location;
var radiusInRadians = circle.radius * conversionFactorForRadius;
var intersect = db.SinglePoint.find({loc :
{ $geoWithin :
{$centerSphere : [coord], radiusInRadians}
}});
if (intersect.hasNext()) {db.Intersections.add(circle)} // this will add all intersecting circles to Intersections collection
}
このスクリプトをファイル(myScript.js)に保存して、電話をかけるだけです。
mongo DBName pathTomyScript.js
これにより、入力ポイントと交差するすべての円がIntersectsコレクションに保存されます。上記のコレクションはすべてDBNameデータベースにある必要があります。