Det är möjligt att använda MongoDB:s $geoIntersects
Geospatial frågeoperator.
Så om du har en samling GeoJson-polygoner och du vill ta reda på alla polygoner som skär din givna punkt, måste du köra följande:
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
I kommandot ovan, loc
är det attribut för varje dokument som innehåller koordinaterna för GeoJson polygon. Se också till att du har 2dsphere
indexera över <locationFieldOfYourDocuments>
.
Nu, för att få ditt ursprungliga problem löst kommer jag att använda lite javascript. Det kan finnas bättre lösningar men inte vad jag vet.
Låt oss säga att alla dina cirklar är lagrade i Circles
samling. Jag skulle fråga den samlingen och hämta varje cirkel en efter en och sedan utföra en skärning med en annan samling som skulle innehålla en enda punkt som skulle vara den du ville fråga om den skär med cirklarna eller inte. Så låt punkten lagras i SinglePoint
samling.
Manuset skulle se ut som...
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
}
Allt du behöver göra är att spara det här skriptet i en fil (myScript.js) och ringa ett samtal:
mongo DBName pathTomyScript.js
Detta kommer att lagra alla cirklar som korsar din inmatningspunkt i Intersects-samlingen. Alla ovanstående samlingar bör finnas i databasen DBName.