php / mysql zip code proximité recherche
Je suis juste à la recherche de suggestions sur la meilleure façon de le faire...
J'ai besoin de créer une fonction de recherche qui permet de chercher des "utilisateurs" dans un rayon de 50 miles autour d'un code postal. J'ai un code zip qui contient tous les codes postaux aux états-UNIS avec leur latitude/longitude, mais je suis juste essayer de comprendre la meilleure façon de structurer et d'interroger mes données...
Dois-je ajouter de la latitude/longitude de colonnes dans la table des utilisateurs et de l'interroger pour tous les utilisateurs dans le rayon de la donnée code postal? Ou dois-je interroger les codes postaux de table pour tous les codes postaux qui entrent dans le rayon de la requête puis la table des utilisateurs pour tous les utilisateurs avec les résultats(codes postaux)? Ou... ??? Je suis ouvert à toute suggestion à ce point!
Merci!
source d'informationauteur mike | 2010-03-09
Vous devez vous connecter pour publier un commentaire.
Ici est le meilleur moyen que j'ai trouvé. Bien sûr, il faudra que vous avez tous vos zipcodes lat/lon encodés dans la base de données.
Vous devriez être en mesure de simplement déposer dans cette fonction. Passer le $lat $et lon du code postal que vous voulez le rayon pour, inclure l'option rayon, et d'obtenir une liste de zipcodes dos.
Vous pourriez très facilement le modifier pour obtenir tous les utilisateurs, où cp (radius_sql) et obtenir votre liste des utilisateurs.
Bon Codage!
http://www.micahcarrick.com/04-19-2005/php-zip-code-range-and-distance-calculation.html
J'ai trouvé cela très impressionnant.
"interroger les codes postaux de table pour tous les codes postaux qui entrent dans le rayon de la requête puis la table des utilisateurs pour tous les utilisateurs avec les résultats(codes postaux)"
J'ai trouvé c'est la meilleure façon de le faire, sauf si vous avez besoin de mettre les utilisateurs sur une carte google. Si vous êtes simplement à la liste des utilisateurs dans le kilométrage de la fourchette, il devrait être assez facile à interroger la base de données (à l'aide de la classe) pour une liste de fermetures à glissière, puis sélectionnez tous les utilisateurs dans ces zipcodes.
Cela devrait le faire.
Commencer ici, mais notez que la solution n'est pas très rapide:
PHP Code Postal de Gamme et de Calcul de la Distance de
Maintenant pour faire rapide, nous allons remplacer la recherche de l'utilisation d'un index spatial 🙂
Utiliser MySQL
Ajouter une colonne à la base de données appelée emplacement de type POINT
Assurez-vous qu'il accepte les valeurs null maintenant
Exécuter la Requête SQL suivante
UPDATE zip_code SET location = PointFromText(CONCAT('POINT(',lon,' ',lat,')'));
Maintenant, de rendre la colonne de ne pas accepter les valeurs null
Ajouter un index spatial à l'emplacement de la colonne
Dans le code du projet ci-dessus remplacer la fonction "get_zips_in_range" avec le texte suivant:
Découvrez la proximité de la recherche présentée ici:
À l'aide de PHP/MySQL avec Google Maps
Si vos données sont dans la même notation /projection /format (quoi que cela s'appelle), il peut travailler pour vous.
J'avais envisager de réduire le nombre de candidats avec un cadre carré en premier, puis de s'inquiéter du rayon dans une deuxième étape. Vous commencez avec les coordonnées du code postal, puis de calculer le long/lat de 50 miles dans tous les 4 directions, puis sélectionnez seulement les candidats à l'intérieur de cette zone à l'aide de simples plus de/moins de critères. Si votre base d'utilisateurs est bien étaler cela réduit votre ensemble candidat considérablement, alors vous n'avez qu'à faire de vecteur de distance en mathématiques à éliminer les "coins".
Je voudrais d'abord faire une recherche de tous les zipcodes dans le rayon de la cible. Puis de comparer tous les anciens zipcodes à votre table utilisateur zipcodes. Sortez les utilisateurs correspondants.
Il trouve la zipcodes dans un rayon de, trouve cette MySQL appel:
MySQL fait tous les calculs pour vous.
J'ai trouvé une classe qui utilise cette ici:
http://www.nucleusdevelopment.com/code/do/zipcode
Espère que ça aide.
Les coordonnées lat/long) vous avez pour chaque code postal est le centre géographique de que zip, droit? Donc, si vous devez d'abord trouver les codes postaux géographique des centres dans les 50 miles, puis les utilisateurs de ces codes postaux, vous pourriez facilement vous retourner les utilisateurs de plus de 50 km. Donc, si vous voulez sacrifier un peu de l'exactitude de la faire de cette façon.
Mais si vous avez beaucoup d'utilisateurs (plus que le nombre de codes postaux), ce serait plus rapide, depuis que vous aviez une requête contre le plus petit zip codes table en premier. Et vous pourriez index des codes postaux dans la table des utilisateurs, afin de trouver les utilisateurs avec un code postal rapide.
Juste quelques pensées! Donc, si vous vous attendez à un grand nombre d'utilisateurs et le rayon de 50 miles n'a pas besoin d'être exact, je voudrais trouver des codes postaux dans les 50 miles, puis les utilisateurs au sein de ces codes postaux.