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

Usando uma propriedade de objeto como o argumento $maxDistance em uma consulta de geolocalização mongodb


Você não pode fazer isso assim — em geral, você não pode basear nada em suas consultas do MongoDB em valores nas coleções.

No entanto, desde o MongoDB 2.4, oferecemos suporte a um novo índice chamado 2dsphere que permite armazenar não apenas pontos no banco de dados, mas também polígonos. Você armazenaria essas informações em um documento como:
db.so.ensureIndex( { loc: '2dsphere' } );
db.so.insert( {
    name: "Firestation 1",
    loc: {
        type: "Polygon",
        coordinates: [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
    }
} );

E então você pode usar uma consulta "intersect" para descobrir se um ponto é coberto por cada um dos polígonos:
db.so.find( {
    'loc' : {  
        $geoIntersects: { 
            $geometry: { type: 'Point', coordinates: [ 0, 0 ] } 
        } 
    }
} );

Que então retorna:
{ 
    "_id" : ObjectId("51f24d566775068ab0b786f0"), 
    "name" : "Firestation 1", 
    "loc" : { 
        "type" : "Polygon", 
        "coordinates" : [  [  [  0,  0 ],  [  0,  1 ],  [  1,  1 ],  [  1,  0 ],  [  0,  0 ] ] ] 
    } 
}

Aqui encontra o corpo de bombeiros, porque 0, 0 está no meio do polígono. Agora, o truque é calcular os pontos do polígono que compõem um círculo que está "raio" (digamos 10 km) de distância do ponto central. Você não será capaz de obter um círculo real, mas um hexágono ou octógono deve ser bom o suficiente. A matemática para isso não é extremamente simples, mas http:// www.movable-type.co.uk/scripts/latlong.html#destPoint tem um exemplo em JavaScript.Basta fazer um loop de seu rumo em 8 passos de 0 a 2PI para calcular os pontos ao longo da circunferência do círculo e colocá-los nas coordenadas. Certifique-se de incorporá-los em uma matriz duplamente aninhada e tornar o primeiro e o último iguais:
{
    name: "Firestation 1",
    loc: {
        type: "Polygon",
        coordinates: [ [
            [ point1-lon, point1-lat ], 
            [ point2-lon, point2-lat ], 
            [ point3-lon, point3-lat ], 
            ...
            [ point1-lon, point1-lat ], 
        ] ]
    }
}