Je travaille sur un site d'annuaire d'entreprise local qui utilisera des types de publication personnalisés pour les entrées d'entreprise. L'un des champs sera "Code postal". Comment puis-je configurer une recherche basée sur la position?
J'aimerais que les visiteurs puissent entrer leur code postal et choisir une catégorie et afficher toutes les entreprises ayant un certain rayon, ou toutes les entreprises commandées par distance. J'ai vu quelques plugins qui prétendent le faire, mais ils ne prennent pas en charge WordPress 3.0. Aucune suggestion?
Réponses:
Je modifierais la réponse de gabrielk et du billet de blog lié en utilisant des index de base de données et en minimisant le nombre de calculs de distance réels .
Si vous connaissez les coordonnées de l'utilisateur et que vous connaissez la distance maximale (disons 10 km), vous pouvez dessiner un cadre de délimitation de 20 km sur 20 km avec l'emplacement actuel au milieu. Obtenez ces coordonnées de délimitation et interrogez uniquement les magasins entre ces latitudes et longitudes . N'utilisez pas encore de fonctions de trigonométrie dans votre requête de base de données, car cela empêcherait l'utilisation d'index. (Vous pouvez donc obtenir un magasin à 12 km de vous s'il se trouve dans le coin nord-est du cadre de délimitation, mais nous le jetons à l'étape suivante.)
Calculez uniquement la distance (à vol d'oiseau ou avec les itinéraires réels, selon votre préférence) pour les quelques magasins retournés. Cela améliorera considérablement le temps de traitement si vous avez un grand nombre de magasins.
Pour la recherche associée ( "donnez les dix magasins les plus proches" ), vous pouvez effectuer une recherche similaire, mais avec une estimation de la distance initiale (vous commencez donc avec une zone de 10 km sur 10 km, et si vous n'avez pas assez de magasins, vous la développez pour 20 km sur 20 km et ainsi de suite). Pour cette distance initiale, vous devez calculer le nombre de magasins sur la surface totale et l'utiliser. Ou enregistrez le nombre de requêtes nécessaires et adaptez-vous au fil du temps.
J'ai ajouté un exemple de code complet à la question connexe de Mike , et voici une extension qui vous donne les emplacements X les plus proches (rapides et à peine testés):
la source
Vous avez d'abord besoin d'une table qui ressemble à ceci:
... renseigné pour chaque code postal. Vous pouvez développer cela en ajoutant des champs de ville et d'état si vous souhaitez rechercher de cette façon.
Ensuite, chaque magasin peut recevoir un code postal, et lorsque vous devez calculer la distance, vous pouvez joindre le tableau lat / long aux données du magasin.
Ensuite, vous interrogerez ce tableau pour obtenir la latitude et la longitude du magasin et des codes postaux de l'utilisateur. Une fois que vous l'avez obtenu, vous pouvez remplir votre tableau et le passer à une fonction "obtenir la distance":
Il s'agit d'une preuve de concept, et non d'un code que je recommanderais réellement de mettre en œuvre. Si vous avez 10 000 magasins, par exemple, ce serait une opération assez coûteuse de les interroger tous et de les parcourir et de les trier à chaque demande.
la source
La documentation MySQL contient également des informations sur les extensions spatiales. Curieusement, la fonction standard distance () n'est pas disponible, mais consultez cette page: http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html pour plus de détails sur la façon de "convertir" les deux valeurs POINT à un LINESTRING, puis calculer la longueur de cela. "
Notez que chaque fournisseur est susceptible d'offrir différentes latitudes et longitudes représentant le "centroïde" d'un code postal. Il vaut également la peine de savoir qu'il n'y a pas de véritable fichier de «limite» de code postal défini. Chaque fournisseur aura son propre ensemble de limites qui correspondent à peu près aux listes spécifiques d'adresses qui composent un code postal USPS. (Par exemple, dans certaines "limites", vous devrez inclure les deux côtés de la rue, dans d'autres, un seul.) Les zones de tabulation de code postal (ZCTA), largement utilisées par les fournisseurs, "ne représentent pas précisément les zones de livraison de code postal, et n'incluent pas tous les codes postaux utilisés pour la distribution du courrier " http://www.census.gov/geo/www/cob/zt_metadata.html
De nombreuses entreprises du centre-ville auront leur propre code postal. Vous voudrez un ensemble de données aussi complet que possible, alors assurez-vous de trouver une liste de codes postaux qui comprend à la fois des codes postaux "ponctuels" (généralement des entreprises) et des codes postaux "limites".
J'ai de l'expérience avec les données du code postal de http://www.semaphorecorp.com/ . Même cela n'était pas précis à 100%. Par exemple, lorsque mon campus a pris une nouvelle adresse postale et un nouveau code postal, le code postal a été égaré. Cela dit, c'était la seule source de données que j'ai trouvée qui avait même le nouveau code postal, donc peu de temps après sa création.
J'avais une recette dans mon livre pour savoir exactement comment répondre à votre demande ... à Drupal. Il s'appuyait sur le module Google Maps Tools ( http://drupal.org/project/gmaps , à ne pas confondre avec http://drupal.org/project/gmap , également un module digne.) Vous pourriez trouver quelques exemples utiles code dans ces modules, bien sûr, ils ne fonctionneront pas hors de la boîte dans WordPress.
la source