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

Uso de una propiedad de objeto como argumento $maxDistance en una consulta de geolocalización de mongodb

No puede hacer esto de esta manera:en general, no puede basar nada en sus consultas de MongoDB en los valores de las colecciones.

Sin embargo, desde MongoDB 2.4 admitimos un nuevo índice llamado 2dsphere lo que le permite almacenar no solo puntos en la base de datos, sino también polígonos. Almacenarías esa información en un 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 ] ] ]
    }
} );

Y luego puede usar una consulta de "intersección" para averiguar si un punto está cubierto por cada uno de los polígonos:

db.so.find( {
    'loc' : {  
        $geoIntersects: { 
            $geometry: { type: 'Point', coordinates: [ 0, 0 ] } 
        } 
    }
} );

Que luego devuelve:

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

Aquí encuentra la estación de bomberos, porque 0, 0 está en el medio del polígono. Ahora, el truco es, por supuesto, calcular los puntos del polígono que forman un círculo que tiene un "radio" (digamos 10 km) del punto central. No podrás obtener un círculo real, pero un hexágono u octágono debería ser lo suficientemente bueno. Las matemáticas para eso no son extremadamente simples, pero http:// www.movable-type.co.uk/scripts/latlong.html#destPoint tiene un ejemplo en JavaScript. Simplemente haga un bucle en su rumbo en 8 pasos de 0 a 2PI para calcular los puntos a lo largo de la circunferencia del círculo y colóquelos en las coordenadas. Asegúrate de incrustarlos en una matriz doblemente anidada y haz que el primero y el último sean iguales:

{
    name: "Firestation 1",
    loc: {
        type: "Polygon",
        coordinates: [ [
            [ point1-lon, point1-lat ], 
            [ point2-lon, point2-lat ], 
            [ point3-lon, point3-lat ], 
            ...
            [ point1-lon, point1-lat ], 
        ] ]
    }
}