1

次のデータから最も近いデータを取得しようとしています

> db.points.insert({name:"Skoda" , pos : { lon : 30, lat : 30 } }) 
> db.points.insert({name:"Honda" , pos : { lon : -10, lat : -20 } }) 
> db.points.insert({name:"Skode" , pos : { lon : 10, lat : -20 } }) 
> db.points.insert({name:"Skoda" , pos : { lon : 60, lat : -10 } }) 
> db.points.insert({name:"Honda" , pos : { lon : 410, lat : 20 } }) 

> db.points.ensureIndex({ loc : "2d" })

それから私は試しました

> db.points.find({"loc" : {"$within" : {"$centerSphere" : [[0 , 0],5]}}})

今回は別のエラーが発生しました

error: {
    "$err" : "Spherical MaxDistance > PI. Are you sure you are using radians?",
    "code" : 13461

それから私は試しました

> db.points.find({"loc" : {"$within" : {"$centerSphere" : [[10 , 10],2]}}})
error: {
    "$err" : "Spherical distance would require wrapping, which isn't implemented yet",
    "code" : 13462

これを行う方法は?GEOポイントから与えられたradiousに基づいて最も近いデータを取得したいだけです。

ありがとう

4

2 に答える 2

2

注意すべき点がいくつかあります。まず、「pos」というフィールドに座標を保存していますが、「loc」というフィールドでクエリを実行しています(インデックスを作成しています)。

$ centerSphereは、一連の座標とラジアン単位の値を取ります。したがって、$ centerSphere:[[10、10]、2]は、2 *(地球の半径)= 12,756 kmの円で[10、10]の周りのアイテムを検索します。$ centerSphere演算子は、この広い領域でドキュメントを検索するようには設計されていません(そして、地球の極を包むのは難しいです)。.005などの小さい値を使用してみてください。

最後に、一部のドライバーはドキュメント内のフィールドの順序を保持しない可能性があるため、座標を要素として配列に格納することをお勧めします(緯度と経度を入れ替えると、地理的な場所が大幅に異なります)。

于 2012-08-07T17:08:41.677 に答える
0

お役に立てれば:

地球の半径は約 3963.192 マイルまたは 6378.137 キロメートルです。

1 マイル:

db.places.find( { loc: { $centerSphere: [ [ -74, 40.74 ] ,
                                    1 / 3963.192 ] } } )
于 2012-12-20T07:28:19.393 に答える