Par exemple, disons que j'ai une table:
Business(BusinessID, Lattitude, Longitude)
Tous sont bien sûr indexés. Il y a aussi 1 million d'enregistrements
Supposons que je veuille trouver des entreprises les plus proches de 106,5, par exemple, comment dois-je procéder?
Si je fais
SELECT *
FROM Business
WHERE (Some formula to compute distance here) < 2000
par exemple, ou si je le fais
SELECT *
FROM Business
TOP 20
En théorie, l'ordinateur devra calculer la distance pour tous les biz alors qu'en pratique, seuls ceux dont la lattitude et la longitude se situent dans une certaine plage devraient être calculés.
Alors, comment puis-je faire ce que je veux en PhP ou en SQL, par exemple?
Je suis reconnaissant de la réponse jusqu'à présent. J'utilise mysql et ils n'ont rien de plus efficace que la solution évidente. MySQL spatial n'a pas non plus de fonction de calcul de distance.
(Divulgation: je suis un gars de Microsoft SQL Server, donc mes réponses sont influencées par cela.)
Pour vraiment le faire efficacement, il y a deux choses que vous voulez: la mise en cache et la prise en charge des données spatiales natives. La prise en charge des données spatiales vous permet de stocker des données de géographie et de géométrie directement dans la base de données sans effectuer de calculs intensifs / coûteux à la volée, et vous permet de créer des index pour trouver très rapidement le point le plus proche de votre emplacement actuel (ou l'itinéraire le plus efficace ou autre).
La mise en cache est importante si vous souhaitez évoluer, point final. La requête la plus rapide est celle que vous ne faites jamais. Chaque fois qu'un utilisateur demande les choses les plus proches de lui, vous stockez son emplacement et le jeu de résultats dans un cache comme Redis ou memcached pendant une période de plusieurs heures. Les emplacements des entreprises ne changeront pas pendant 4 heures - eh bien, ils pourraient le faire si quelqu'un modifie une entreprise, mais vous n'avez pas nécessairement besoin que cela soit mis à jour immédiatement dans tous les ensembles de résultats.
la source
Yelp utilise probablement le SIG
PostgreSQL a l'implémentation de référence pour les SIG avec PostGIS . Yelp utilise peut-être MySQL, qui est inférieur à tous égards . Dans le cas de quelque chose comme Yelp, ils gardent presque certainement les coordonnées,
Ces coordonnées sont presque certainement dans WGS84, et stockées comme type Geography. Dans PostgreSQL et PostGIS, cela ressemblerait à quelque chose comme ça,
Ils rempliraient ce tableau. Ensuite, ils saisissent les coordonnées WGS84 de votre téléphone et génèrent une requête, comme celle-ci avec SQL Alchemy (dans le cas de Yelp),
Pour plus d'informations, consultez notre espace et consultez les systèmes d'information géographique @ StackExchange
la source