Requête SQL pour Effectuer le Rayon de Recherche en fonction de la Latitude Longitude
Nous avons une table de restaurant qui a lat-long les données pour chaque ligne.
Nous devons écrire une requête qui effectue une recherche afin de trouver tous les restaurants au sein de la condition de rayon par exemple, 1 km, 5 km etc.
Nous avons la requête suivante:
***Parameters***
Longitude: -74.008680
Latitude: 40.711676
Radius: 1 mile
***Query***
SELECT *
FROM restaurant
WHERE (
POW( ( 69.1 * ( Longitude - -74.008680 ) * cos( 40.711676 / 57.3 ) ) , 2 ) + POW( ( 69.1 * ( Latitude - 40.711676 ) ) , 2 )
) < ( 1 *1 );
La table a environ 23k lignes. La taille de l'ensemble de résultats est bizarre des fois par exemple, pour un 5.4 mile de recherche, il donne de l'880 lignes et de 5,5 kilomètres, il donne de l'21k lignes.
Ce tableau contient les données des restaurants à new york - de sorte que la distribution réelle n'est pas comme pour le jeu de résultats.
Question: EST-IL quelque CHOSE de MAL Avec cette requête?
De base de données: MySQL, Longitude: DÉCIMAL(10,6), Latitude: DÉCIMAL(10,6)
Découvrez la réponse à question. Problème similaire.
OriginalL'auteur Puneet | 2009-11-13
Vous devez vous connecter pour publier un commentaire.
À mon avis, la clause where est lente à cause des maths impliqués, et l'utilisation des fonctions dans la clause where empêcher la base de données à l'aide d'un indice de vitesse de la requête - oui, en effet, vous devez examiner chaque restaurant dans la base de données, et d'effectuer le grand cercle de maths sur chaque ligne, chaque fois que vous effectuez une requête.
Personnellement, je voudrais calculer la TopLeft et BottomRight coordonnées d'un carré (qui ne doit être crudly calculée à l'aide de pythagore) dont les côtés sont égaux à la gamme que vous recherchez, puis effectuer la plus compliquée LORSQUE la clause d'essai sur le plus petit sous-ensemble d'enregistrements qui sont dans la Lat/Long carrés.
Avec un Index sur Lat & Long dans la base de données de la requête
doit être très efficace
(Veuillez noter que je n'ai pas connaissance de MySQL plus précisément, seulement de MS SQL)
OriginalL'auteur Kristen
Vous souhaitez peut-être créer un
SPATIAL
index sur votre table pour faire la recherche plus rapide.Pour ce faire, ajoutez un
POINT
colonne de votre tableau:Vous devez stocker
coords
commeUTM
les coordonnées dans une zone unique.OriginalL'auteur Quassnoi
Utiliser une fonction, par exemple, l'un J'ai posté ici.
Ensuite, interrogez vos restaurants, par exemple, pour obtenir le tout dans un rayon de 5 km autour
Effectue bien avec les données code POSTAL.
OriginalL'auteur cdonner
Si vos données sont dans la base de données SQL server, vous pouvez utiliser ceci:
OriginalL'auteur Dinci Garrone