sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo obtener todos los círculos en los que está contenido un punto?

Es posible usando $geoIntersects de MongoDB Operador de consulta geoespacial.

Por lo tanto, si tiene una colección de polígonos GeoJson y desea encontrar todos los polígonos que se cruzan con su punto dado, debe ejecutar lo siguiente:

db.places.find( { <locationFieldOfYourDocuments> :
                  { $geoIntersects :
                    { $geometry :
                      { type : "Point" ,
                        coordinates: [long, lat]
                } } } } )

En el comando anterior, loc es ese atributo de cada documento que contiene las coordenadas para el polígono GeoJson. Además, asegúrese de tener 2dsphere índice sobre <locationFieldOfYourDocuments> .

Ahora, para resolver su problema original, usaré un poco de javascript. Puede haber mejores soluciones pero no en mi conocimiento.

Digamos que todos tus círculos están almacenados en Circles recopilación. Consultaría esa colección y buscaría cada círculo uno por uno y luego realizaría una intersección con otra colección que contendría un solo punto que sería el que desea consultar si se cruza con los círculos o no. Deje que el punto se almacene en SinglePoint colección.

El guión se vería así...

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
}

Todo lo que tiene que hacer es guardar este script en un archivo (myScript.js) y hacer una llamada:

mongo DBName pathTomyScript.js

Esto almacenará todos los círculos que se cruzan con su punto de entrada en la colección Intersects. Todas las colecciones anteriores deben estar en la base de datos DBName.