Het is mogelijk met MongoDB's $geoIntersects
Geospatiale query-operator.
Dus als je een verzameling GeoJson-polygonen hebt en je wilt alle polygonen weten die je gegeven punt kruisen, dan moet je het volgende uitvoeren:
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
In het bovenstaande commando, loc
is dat attribuut van elk document dat de coördinaten voor GeoJson-polygoon bevat. Zorg er ook voor dat u 2dsphere
. heeft index over <locationFieldOfYourDocuments>
.
Om je oorspronkelijke probleem op te lossen, zal ik een klein beetje javascript gebruiken. Er zijn misschien betere oplossingen, maar niet voor zover ik weet.
Stel dat al je kringen zijn opgeslagen in Circles
verzameling. Ik zou die verzameling opvragen en elke cirkel één voor één ophalen en dan een kruising uitvoeren met een andere verzameling die een enkel punt zou bevatten dat het punt zou zijn dat u wilde opvragen of het de cirkels kruist of niet. Dus laat het punt worden opgeslagen in SinglePoint
collectie.
Het script zou er als volgt uitzien...
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
}
Het enige wat je hoeft te doen is dit script op te slaan in een bestand (myScript.js) en te bellen:
mongo DBName pathTomyScript.js
Hiermee worden alle cirkels opgeslagen die uw invoerpunt kruisen in de verzameling Intersects. Alle bovenstaande verzamelingen zouden in de DBName-database moeten staan.