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

Utilizzo di una proprietà dell'oggetto come argomento $maxDistance in una query di geolocalizzazione mongodb

Non puoi farlo in questo modo:in generale non puoi basare nulla nelle tue query MongoDB sui valori nelle raccolte.

Tuttavia, da MongoDB 2.4 supportiamo un nuovo indice chiamato 2dsphere che ti consente di memorizzare non solo punti nel database, ma anche poligoni. Memorizzeresti queste informazioni in un documento come:

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 poi puoi usare una query "interseca" per capire se un punto è coperto da ciascuno dei poligoni:

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

Che poi restituisce:

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

Qui trova la caserma dei pompieri, perché 0, 0 è nel mezzo del poligono. Ora il trucco è ovviamente calcolare i punti del poligono che compongono un cerchio che è "raggio" (diciamo 10 km) dal punto centrale. Non sarai in grado di ottenere un vero cerchio, ma un esagono o un ottagono dovrebbero essere abbastanza buoni. La matematica per questo non è estremamente semplice, ma http://www.movable-type.co.uk/scripts/latlong.html#destPoint">http:// www.movable-type.co.uk/scripts/latlong.html#destPoint ha un esempio in JavaScript. Basta eseguire un ciclo del rilevamento in 8 passaggi da 0 a 2PI per calcolare i punti lungo la circonferenza del cerchio e inserire quelli nelle coordinate. Assicurati di incorporarli in un array doppiamente nidificato e di rendere uguali il primo e l'ultimo:

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