MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come ottenere tutti i cerchi in cui è contenuto un punto?

È 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.