2011-10-28 5 views
1

Je voudrais interroger certains points de géolocalisation avec un cadre morphologique. J'utilise ma latitude, ma longitude et mon rayon (100 km) avec la méthode "Near" pour interroger l'autre autour de mon emplacement et limiter 10 résultats. Tout comme ceci:Recherche de géo-spatial avec morpho mongodb en utilisant Java

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

Il ne l'erreur pas, mais le résultat me montre les points de localisation qui autour de moi et hors de portée de mon rayon (100 km.). Donc, mon rayon ne concerne pas lors de l'interrogation du résultat.

Quel est mon problème avec l'instruction de requête?

Merci à l'avance vous

Répondre

4

La longueur d'une arcdegree de différence de latitude nord-sud, est à environ 60 miles nautiques, 111 km ou 69 miles de loi en toute latitude; Vous pouvez en savoir plus sur ici wikipedia ou dans la page géospatiale mongo Earth is Round but Maps are Flat.

Convertir la distance par 111,12 (un degré est d'environ 111,12 kilomètres) en utilisant km, ou par 69 (pour les miles).

changer Ainsi, votre requête

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

Et assurez-vous que MongoDB accepte les coordonnées dans [long, lat].

+0

Merci pour votre réponse. J'ai déjà lu vos liens et mieux comprendre la distance du rayon avec la méthode de mongo db. – Mojiiz

+0

@Mojiiz, je suis content que ça a aidé .. :) – RameshVel

3

Selon le site (MongoDB: Calculate Distances in a 2d Index Using Spherical Geometry) pour obtenir les radians de la distance où nous regardons, nous devons utiliser la terre dans les 3.959 miles ou 6.371 km.

Consulter la documentation (MongoDB:$nearSphere) Je pense que l'appel devrait être:

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

Dans mon cas, et après quelques vérifications, voici comment je travaille.

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()); 
    } 
Questions connexes