C'est possible en utilisant $geoIntersects
de MongoDB Opérateur de requête géospatiale.
Donc, si vous avez une collection de polygones GeoJson et que vous souhaitez découvrir tous les polygones qui se croisent avec votre point donné, vous devez exécuter ce qui suit :
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
Dans la commande ci-dessus, loc
est cet attribut de chaque document qui contient les coordonnées du polygone GeoJson. Assurez-vous également que vous disposez de 2dsphere
index sur <locationFieldOfYourDocuments>
.
Maintenant, pour résoudre votre problème d'origine, je vais utiliser un peu de javascript. Il existe peut-être de meilleures solutions mais pas à ma connaissance.
Disons que tous vos cercles sont stockés dans Circles
le recueil. J'interrogerais cette collection et chercherais chaque cercle un par un, puis effectuerais une intersection avec une autre collection qui contiendrait un seul point qui serait celui que vous vouliez interroger s'il croise ou non les cercles. Alors laissez le point être stocké dans SinglePoint
collecte.
Le script ressemblerait à...
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
}
Il vous suffit de sauvegarder ce script dans un fichier (myScript.js) et de lancer un appel :
mongo DBName pathTomyScript.js
Cela stockera tous les cercles qui se croisent avec votre point d'entrée dans la collection Intersects. Toutes les collections ci-dessus doivent être dans la base de données DBName.