2010-10-29 22 views
0

J'ai une base de données avec les coordonnées actuelles de chaque utilisateur en ligne. En appuyant sur un bouton, l'utilisateur peut mettre à jour ses coordonnées pour mettre à jour son emplacement actuel (qui est ensuite envoyé au serveur). L'application vous permettra de définir le rayon d'un cercle (où l'utilisateur est au centre) dans lequel vous pouvez voir les autres utilisateurs sur une carte. Les utilisateurs en dehors du cercle sont mis au rebut.Trouver des utilisateurs près de vous alors que les coordonnées de vous et des autres sont libres de changer

Quelle est la manière optimale de trouver les utilisateurs autour de vous?

1) La solution la plus simple est de trouver la distance entre vous et chaque utilisateur, puis de voir si elle est inférieure au rayon. Cela placerait le serveur sous une charge inutilement élevée, car il faut comparer avec tous les utilisateurs du monde. En outre, comment traiterait-on des changements dans les lieux?

2) Une façon améliorée serait de calculer et de comparer uniquement la distance avec d'autres utilisateurs ayant des latitude et longitude similaires. Encore une fois, afin d'être efficace, si le rayon est diminué, l'application ne doit cibler que les utilisateurs avec des coordonnées encore plus proches. Ce n'est pas si facile que ça en a l'air. Si l'on devait marcher autour du pôle Nord avec, disons, un rayon de 10 m, chaque pas autour de la circonférence équivaudrait à un changement de 9 degrés de longitude. Chaque étape le long de l'équateur serait marginale. Cependant, même en étant très rude et en supposant qu'il n'y a pas beaucoup d'utilisateurs visitant les Polonais, je pourrais le réduire dans une certaine mesure.

Toute idée de trouver des utilisateurs à proximité et comment les tenir à jour serait grandement appréciée! :)

Andres

Répondre

0

Très bonne pratique consiste à utiliser geohash notion (http://geohash.org/) ou géomodèle http://code.google.com/p/geomodel/ (mieux pour BigTable comme des bases de données). Ce sont des moyens efficaces de recherches géospatiales. Je vous encourage à lire quelques-uns de ceux à liens que je vous ai donnés, mais en quelques mots:

  • geohash TRADUIT et latitude à LON chaîne de hachage unique que vous pouvez interroger la base de données par les hash. Si les points sont plus proches l'un de l'autre, le préfixe similaire sera bi plus long

  • GeoModel est similaire à GegoHash avec cette différence que hashed sont des carrés avec une précision définie. Si le carré est plus petit, le hachage est plus long.

J'espère que je vous ai aidé. Mais la décision, que vous choisirez, vous appartient :). Lukasz

+0

Deux emplacements peuvent être spatialement très proches mais le géohash peut différer beaucoup (c'est génial pour des points plus éloignés). Par conséquent, il ne fournit pas beaucoup d'aide lorsque j'essaie de déterminer la proximité entre 2 points. Quelque chose comme Natural Area Code (NAC) est beaucoup mieux dans ce sens, mais il est sous un brevet :) Merci de m'indiquer dans la bonne direction, je vais essayer de lire plus demain;) – Andres

0

1) vous auriez probablement besoin d'un processus en deux étapes ici. A) En supposant que tous les emplacements vont dans une base de données, vous pouvez faire une comparaison au niveau de sql (très rugueux) basé sur le lat & long, à savoir si vous cherchez des distances de 100m, vous pouvez ignorer les emplacements qui diffèrent de plus de 0,01 degré dans les deux sens. Je ne pense pas que les utilisateurs de votre Pôle Nord s'occuperont;) Aussi, ne considérez pas ceci inutile - mieux le faire sur le serveur que l'iPhone. B) vous pouvez ensuite utiliser, pour les entrées restantes, une formule de comparaison comme indiqué ci-dessous.

2), vous pouvez trouver un moyen de calculer les distances entre les deux coordonnées ici http://snipplr.com/view/2531/calculate-the-distance-between-two-coordinates-latitude-longitude/

0

La meilleure solution actuellement, à mon avis, est d'envelopper la terre entière dans une matrice. Chaque cellule couvrira une petite zone et aura un identifiant unique. Cette information serait stockée pour chaque coordonnée dans la base de données et elle me permet de filtrer rapidement les utilisateurs non pertinents (qui sont très loin). Ensuite, utilisez Pythagoras pour calculer la distance entre tous les autres utilisateurs et le client.