2011-10-28 10 views
1

私はmorphiaフレームワークでいくつかの地理的位置ポイントを照会したいと思います。私は緯度、経度、および半径(100km)を「近く」の方法で使用し、他の場所を照会して10の結果を制限します。ちょうどこのように:Javaを使ってmorphia mongodbでジオ空間を見つける

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100).limit(10).asList(); 

これはエラーではありませんが、私の周りの場所ポイントと私の半径(100km)の範囲外の結果が表示されます。したがって、私の半径は結果を照会する際には関係ありません。

質問文の問題は何ですか?予め

答えて

4

おかげでき南北緯度差のarcdegreeの長さは、任意の緯度で約60海里、111キロまたは69法定マイルです。詳しくは、wikipediaまたはmongo地理空間ページEarth is Round but Maps are Flatを参照してください。

kmを使用した場合は111.12(1度は約111.12キロメートル)、マイルを使用する場合は69マイル(69.1マイル)で距離を変換します。

だからあなたのクエリが

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100/111.12).limit(10).asList(); 

に変更し、MongoDBのは、[長い、LAT]で座標を受け入れることを確認してください。

+0

ありがとうございました。私はすでにあなたのリンクを読んでおり、さらにmongo dbの方法で半径距離を理解しています。 – Mojiiz

+0

@モージズ、それは助けて嬉しいです:) – RameshVel

3

私たちが見て距離のラジアンを取得するには、ウェブサイト(MongoDB: Calculate Distances in a 2d Index Using Spherical Geometry)によると、私たちは、3.959マイルまたは6.371キロ以内の土地を使用する必要があります。ドキュメント(MongoDB:$nearSphere)を表示

は、私は、コールがされるべきだと思う:

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100/6371, true).limit(10).asList(); 

私の場合は、いくつかチェックした後、これは私がどのように働くかです。

0
public static void test() { 
     DB datastore = ConnectionFactory.getInstance().getDatabaseMongo(); 
     double[] near = { 20.593684, 78.96288 }; 
     BasicDBObject basicDBObject = new BasicDBObject(); 
     basicDBObject.put("type", "Point"); 
     basicDBObject.put("coordinates", near); 
     BasicDBObject geoNearParams = new BasicDBObject(); 
     geoNearParams.append("geoNear", <Collection name>); 
     geoNearParams.append("near", basicDBObject); 
     geoNearParams.append("spherical", true); 
     geoNearParams.append("maxDistance", 100); 
     geoNearParams.append("limit", 10); 
     CommandResult commandResult = datastore.command(geoNearParams); 
     commandResult.getErrorMessage(); 
     Object data = commandResult.get("results"); 
     System.out.println(data.toString()); 
    } 
関連する問題