Je to možné pomocí MongoDB $geoIntersects
Operátor geoprostorového dotazu.
Pokud tedy máte sbírku polygonů GeoJson a chcete zjistit všechny polygony, které se protínají s vaším daným bodem, musíte spustit následující:
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
Ve výše uvedeném příkazu loc
je atribut každého dokumentu, který obsahuje souřadnice polygonu GeoJson. Také se ujistěte, že máte 2dsphere
index nad <locationFieldOfYourDocuments>
.
Nyní, abych vyřešil váš původní problém, použiji trochu javascriptu. Možná existují lepší řešení, ale ne podle mých znalostí.
Řekněme, že všechny vaše kruhy jsou uloženy v Circles
sbírka. Dotázal bych se této kolekce a načetl každý kruh jeden po druhém a pak provedl průnik s jinou kolekcí, která by obsahovala jeden bod, který by byl ten, na který byste se chtěli zeptat, zda se protíná s kruhy nebo ne. Nechte tedy bod uložit do SinglePoint
kolekce.
Skript by vypadal...
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
}
Jediné, co musíte udělat, je uložit tento skript do souboru (myScript.js) a zavolat:
mongo DBName pathTomyScript.js
Tím uložíte všechny kružnice, které se protínají s vaším vstupním bodem, do kolekce Průsečíky. Všechny výše uvedené kolekce by měly být v databázi DBName.