2010-11-03 4 views
1

J'ai un problème spécifique, et j'ai du mal à trouver une solution!Trouver des objets en pointant dans une direction

En utilisant un appareil GPS, je peux trouver ma position actuelle sur terre. Je dois être capable de pointer vers une direction (une boussole sur l'iPhone ou un appareil similaire) et trouver quels sont les objets importants (emplacements) dans cette direction! Supposons que j'ai tous ces emplacements stockés dans une base de données.

+0

Vous devez fournir beaucoup plus d'informations que cela. Accédez-vous à l'appareil via une API? Dans ce cas, quelle API? Ou votre application lit-elle directement les phrases '$ GPRMC' de l'appareil? –

+0

Je développe une application Android, qui utilise une base de données SQLite locale, où elle stocke des informations sur les «points de repère» dans ma ville. Chaque point de repère a sa latitude et sa longitude. Maintenant, je veux utiliser ma boussole intégrée, cela me dira dans quelle direction je suis en train de pointer l'appareil et de me montrer quels objets sont dans cette direction. Donc le code Java ou C# pourrait être utile. – user496607

+0

J'ai utilisé Haversine quand je voulais déterminer la distance entre deux objets. Je pense que la réponse est en trigonométrie, même si j'ai des connaissances très modestes sur le terrain! – user496607

Répondre

1

En supposant que vous avez un emplacement et une direction, votre objectif est de trouver quels éléments de votre base de données sont adjacents à l'emplacement, dans la direction appropriée.

De toute évidence, vous pouvez parcourir tous les éléments de votre base de données et répondre pour chacun d'entre eux, "Est-ce dans la région?". La vraie magie est l'efficacité. comment vous indexez les données dans la base de données de sorte que vous puissiez répondre à cette question sans avoir à examiner chaque enregistrement.

Un bon exemple de ceci est dans MongoDB. Cependant, sa mise en œuvre ne gère pas la direction, vous devrez donc filtrer les résultats. Vous utiliserez la base de données pour obtenir tous les objets à une distance x de vous et filtrerez les éléments qui ne sont pas dans la bonne direction.

Si vous ne pouvez pas utiliser un moteur de base de données avec l'indexation native géospatiale, vous devrez l'implémenter vous-même. Comme mentionné dans les commentaires, la fonction de Haversine est utilisée pour calculer la distance sur une sphère (dans ce cas, la terre). Plutôt que de calculer la distance entre chaque point et vous-même, vous pouvez commencer en éliminant tous les éléments qui sont hors de portée, par ex. (votre latitude + votre distance de recherche) < (la latitude des objets). Ensuite, utilisez la Haversine pour filtrer davantage. Vous pouvez également utiliser une fonction de hachage géospatial pour effectuer la plupart du travail à l'avance. Une fois que vous avez tous les éléments à portée, vous pouvez convertir les coordonnées x-y dans votre base de données en coordonnées polaires. En bref:

arctan((item_y - users_y)/(item_x - users_x)) = the angle between the item and the user 

Si vous calculez cela pour chaque élément dans « gamme » de l'utilisateur, et filtrer tous les éléments qui ne sont pas dans des limites de l'angle de la boussole (+/- 20 degrés, par exemple) , vous obtiendrez les éléments dont vous avez besoin. Si l'efficacité est toujours un problème, vous pouvez devenir plus intelligent en invalidant immédiatement tous les éléments qui, par exemple, sont du mauvais côté de l'utilisateur (si l'utilisateur fait face à l'ouest) que les éléments qui ont une coordonnée x plus élevée que l'utilisateur ne peut pas être à son avis). En fonction de votre langage de programmation, il peut également être plus efficace d'utiliser une table statique d'arctans avec un degré de précision inférieur à celui communément fourni.

Si vous êtes particulièrement intelligent, vous pouvez également trouver des moyens d'indexer les données par angle, ce qui diminuera encore le calcul requis.

+0

Merci Zack pour cette réponse approfondie. Je vais commencer à implémenter cette solution, et publier une mise à jour avec mes résultats/code source. – user496607

Questions connexes