2009-07-27 8 views
1

Je voudrais construire une application de localisation qui détecte automatiquement l'emplacement d'un utilisateur et leur présente une liste triée des points de repère les plus proches d'une base de données historique. L'application sera construite sur l'iPhone.Quelle est la meilleure façon d'architecturer une application géolocalisée "find nearest" sur l'iPhone?

Les questions fondamentales sont les suivantes:

  1. Comment calculer les distances à proximité des monuments et trier « le plus proche »
  2. Où effectuer les calculs - sur un serveur externe via un service Web - ou sur la L'iPhone lui-même via une base de données SQLite et/ou Core Location

Idéalement, l'application calculerait les distances en utilisant la «distance routée» par opposition à la distance de vol à voile (c'est-à-dire la plus grande distance de cercle), étant la méthode la plus précise . Bien sûr, cela a un coût - il sera beaucoup plus lent à calculer. Je voudrais savoir quelle méthode serait la plus appropriée. En outre, l'avantage d'effectuer les calculs sur le téléphone lui-même (en utilisant Core Location?) Est qu'il n'est pas nécessaire de parler à un serveur (plus rapide) et l'application peut être utilisée sans connexion Internet. L'inconvénient réside dans la difficulté de garder la base de données historique synchronisée avec les données les plus récentes.

Je voudrais savoir s'il existe une façon standard dans l'industrie de mettre en œuvre une telle application. Si ce n'est pas le cas, veuillez suggérer la meilleure solution possible au problème.

Répondre

2

Je recommanderais une solution à deux niveaux pour la plupart de vos problèmes. Prenez des décisions de niveau brut avec la solution la plus rapide, puis utilisez une prise de décision de haut niveau avec vos meilleurs résultats. Par exemple, à votre question de stocker sur l'appareil ou sur le serveur, je recommande de stocker des choses "localish" sur l'appareil en fonction de la dernière position de l'utilisateur. C'est-à-dire que les choses que l'utilisateur était proche avant qu'elle soit probablement proche de nouveau, ainsi ces choses devraient être synchronisées vers le bas. Lorsque l'utilisateur quitte une zone, les éléments de cette zone doivent être déplacés vers la liste la moins récemment utilisée et éventuellement purgés. Donc, quand vous allez à un nouvel emplacement, il sera lent pendant un certain temps, mais au fil du temps va accélérer. En ce qui concerne le tri, encore une fois, deux niveaux est le meilleur. Trier d'abord par des mouches à pattes. Ensuite, vous pouvez trier vos meilleurs résultats par routage si le routage est bon marché (même si ce n'est probablement pas le cas). Si l'utilisateur ne voit que 20 résultats, peu importe si une entrée aurait été # 80 ou # 100. C'est trop loin pour s'en soucier, alors c'est trop loin pour calculer.

En général en ce qui concerne le tri sur l'iPhone, je recommande fortement la vitesse sur la précision. Si quelque chose aurait dû être # 1 et est réellement # 3, cela n'a pas d'importance autant que cela prend 20 secondes pour calculer par rapport à 5.

+0

Vous faites une excellente suggestion - une sorte d'approche hybride. Je me demande s'il serait possible de mettre en cache les données d'un point de repère d'une ville entière (ne serait-ce que de 1000 lignes ou plus). Il peut être plus efficace de ne mettre en cache que les emplacements les plus proches, disons dans un rayon de 10 miles, mais je ne suis pas sûr de savoir comment vous en feriez une solution optimale pour trouver les points de repère les plus proches. C'est à dire. Si l'utilisateur bouge légèrement, mais est toujours dans ce rayon, il n'y a aucune garantie que les emplacements les plus proches le seront également. Il peut également être délicat de gérer efficacement les problèmes de chevauchement des emplacements. – mwalsher

0

La solution dépend du nombre d'objets géographiques que vous voulez rechercher. Si vous avez moins de quelques milliers, vous pouvez utiliser une approche simple.
Si vous avez 100.000 à des millions, vous avez besoin d'un arbre Quad.
Oubliez la base de données, c'est à dire ralentir, sauf s'il s'agit d'une base de données spatiale qui n'est pas disponible sur iphone.