Oui, il y a une meilleure façon. Vous devez utiliser un index spatial . Ces index organisent des métadonnées sur les géométries pour filtrer très rapidement les géométries éloignées, économisant ainsi beaucoup de cycles CPU en évitant les calculs que vous décrivez. Vous ne devriez pas vous soucier de l'implémenter vous-même, car toutes les principales bases de données relationnelles fournissent un type de géométrie spatiale et des index pour les accompagner.
Ce que vous voulez examiner, ce sont des requêtes "à distance" (requêtes pour des géométries à une certaine distance d'une autre géométrie). Ce sont des problèmes très standard et résolus et sont possibles dans toutes les bases de données ci-dessus (et intégrées dans plusieurs):
- PostGIS:
ST_DWithin
- SQL Server:
STDistance
(pas clair que l'utilisation de l'index sur la version de géographie 3D de cette fonction est prise en charge)
- Oracle:
SDO_WITHIN_DISTANCE
(Cela ne dit pas explicitement que cela déclenchera l'utilisation de l'index. Je revérifierais le plan de requête. Vous pourriez avoir besoin d'appliquer un SDO_FILTER
pour qu'il utilise l'index.)
- MySQL: Toujours en train de comprendre cela.
Solution de contournement pour déclencher l'utilisation de l'index
Dans le pire des cas où vous avez du mal à faire en sorte que le système utilise l'index spatial avec ces requêtes, vous pouvez ajouter un filtre supplémentaire. Vous créez un cadre de délimitation carré avec des côtés de longueur 2 * (distance de recherche) centrés sur votre point de recherche et comparez les cadres de délimitation des géométries de table à ceux-ci avant de vérifier la distance réelle. C'est ce que fait PostGIS ST_DWithin
ci-dessus en interne de toute façon.
Distance en SIG
Alors que les index spatiaux sont fantastiques et absolument la bonne solution à votre problème, le calcul de la distance peut devenir logiquement compliqué. En particulier, vous devez vous soucier de la projection (essentiellement tous les paramètres du système de coordonnées) dans laquelle vos données sont stockées. La plupart des projections 2D (autres que les systèmes de coordonnées angulaires comme les diverses projections lat / longues) déforment considérablement la longueur. Par exemple, la projection Web Mercator (celle utilisée par Google, Bing et tous les autres principaux fournisseurs de cartes de base) élargit de plus en plus les zones et les distances à mesure que l'emplacement s'éloigne de l'équateur . Je peux me tromper car je ne suis pas formellement formé aux SIG, mais le meilleur que j'ai vu pour les projections 2D est quelques-unes spécifiques qui promettent des distances correctes à partir d'unpoint unique et constant dans le monde entier. (Non, il n'est pas pratique d'utiliser une projection différente pour chaque requête; cela rendrait vos index inutiles.)
L'essentiel est que vous devez vous assurer que vos calculs sont exacts. La façon la plus simple de le faire dans une perspective de développement est d'utiliser des projections angulaires (souvent appelées "géographiques") et des fonctions qui prennent en charge le calcul à l'aide d'un modèle sphéroïde, mais ces calculs sont légèrement plus chers que les équivalents 2D. et certaines bases de données peuvent ne pas prendre en charge leur indexation. Si vous pouvez obtenir des performances acceptables en les utilisant, c'est probablement la voie à suivre. Une autre option courante est les projections régionales (comme les zones UTM) qui rapprochent à la fois les distances et les zones à corriger si vos données sont limitées à une partie particulière du monde. Ce qui convient le mieux à votre application dépendra de vos besoins spécifiques,
Cela s'applique même si vous n'utilisez pas d'index spatiaux intégrés. Vos données ont une projection quelle que soit la technologie ou la technique que vous utilisez ou utilisez actuellement, et elles affectent déjà actuellement toutes les requêtes et tous les calculs que vous effectuez.