È possibile utilizzare $geoIntersects
di MongoDB Operatore di interrogazione geospaziale.
Quindi, se hai una raccolta di poligoni GeoJson e vuoi scoprire tutti i poligoni che si intersecano con il punto specificato, devi eseguire quanto segue:
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
Nel comando sopra, loc
è quell'attributo di ogni documento che contiene le coordinate per il poligono GeoJson. Inoltre, assicurati di avere 2dsphere
indice su <locationFieldOfYourDocuments>
.
Ora, per risolvere il tuo problema originale, userò un po' di javascript. Potrebbero esserci soluzioni migliori ma non a mia conoscenza.
Supponiamo che tutte le tue cerchie siano archiviate in Circles
collezione. Vorrei interrogare quella raccolta e recuperare ogni cerchio uno per uno e quindi eseguire un'intersezione con un'altra raccolta che conterrebbe un singolo punto che sarebbe quello che volevi interrogare se si interseca con i cerchi o meno. Quindi lascia che il punto sia memorizzato in SinglePoint
raccolta.
Lo script sembrerebbe...
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
}
Tutto quello che devi fare è salvare questo script in un file (myScript.js) ed effettuare una chiamata:
mongo DBName pathTomyScript.js
Questo memorizzerà tutti i cerchi che si intersecano con il tuo punto di input nella raccolta Interseca. Tutte le raccolte di cui sopra dovrebbero trovarsi nel database DBName.