Възможно е с помощта на $geoIntersects
на MongoDB Оператор за геопространствени заявки.
Така че, ако имате колекция от многоъгълници на GeoJson и искате да откриете всички многоъгълници, които се пресичат с дадена точка, тогава трябва да изпълните следното:
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
В командата по-горе, loc
е този атрибут на всеки документ, който съдържа координатите за полигона GeoJson. Също така се уверете, че имате 2dsphere
индекс върху <locationFieldOfYourDocuments>
.
Сега, за да разреша първоначалния ви проблем, ще използвам малко javascript. Може да има по-добри решения, но не и доколкото ми е известно.
Да приемем, че всичките ви кръгове се съхраняват в Circles
колекция. Бих направил запитване към тази колекция и бих извлякъл всеки кръг един по един и след това изпълних пресичане с друга колекция, която би съдържала една точка, която ще бъде тази, която искате да направите запитване, дали се пресича с кръговете или не. Така че нека точката се съхранява в 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.