MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como obter todos os círculos em que um ponto está contido?


É possível usando o $geoIntersects do MongoDB Operador de consulta geoespacial.

Portanto, se você tem uma coleção de polígonos GeoJson e deseja descobrir todos os polígonos que se cruzam com seu ponto fornecido, é necessário executar o seguinte:
db.places.find( { <locationFieldOfYourDocuments> :
                  { $geoIntersects :
                    { $geometry :
                      { type : "Point" ,
                        coordinates: [long, lat]
                } } } } )

No comando acima, loc é aquele atributo de cada documento que contém as coordenadas do polígono GeoJson. Além disso, certifique-se de ter 2dsphere indexe sobre <locationFieldOfYourDocuments> .

Agora, para resolver seu problema original, usarei um pouco de javascript. Pode haver soluções melhores, mas não no meu conhecimento.

Digamos que todos os seus círculos estejam armazenados em Circles coleção. Eu consultaria essa coleção e buscaria cada círculo um por um e, em seguida, realizaria uma interseção com outra coleção que conteria um único ponto que seria aquele que você deseja consultar se cruza com os círculos ou não. Então deixe o ponto ser armazenado em SinglePoint coleção.

O roteiro ficaria assim...
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
}

Tudo o que você precisa fazer é salvar este script em um arquivo (myScript.js) e fazer uma chamada:
mongo DBName pathTomyScript.js

Isso armazenará todos os círculos que se cruzam com seu ponto de entrada na coleção Intersects. Todas as coleções acima devem estar no banco de dados DBName.