2009-01-02 11 views
23

J'ai saisi une base de données des codes postaux et de leurs langages/latitudes, etc à partir de ce This page. Il a obtenu les champs suivants:Calcul de la distance entre les codes postaux dans PHP

ZIP, LATITUDE, LONGITUDE, Ville, État, comté, ZIP_CLASS

Les données ont été dans un fichier texte mais j'inséré dans une table MySQL. Ma question est maintenant, comment puis-je utiliser les champs ci-dessus pour calculer la distance entre deux codes postaux qu'un utilisateur peut entrer sur le site? le code de travail en PHP sera apprécié

+5

Qu'est-ce que c'est «distance»? Voulez-vous la distance "à vol d'oiseau"/la distance du grand cercle? Distance de la route? Distance 3D réelle entre les deux points dans l'espace? – ShreevatsaR

+3

@Shreevats: Comme il demande un calcul en utilisant lat/long, il est raisonnable de supposer que vous n'obtiendrez pas de distance sur la route. La distance réelle entre deux points dans l'espace (par exemple à travers le corps terrestre) n'est probablement pas non plus utile. Par conséquent, "à vol d'oiseau"/grand cercle est le plus probable. –

Répondre

6

Vous pouvez également essayer de frapper un service Web pour calco la distance. Laissez quelqu'un d'autre faire le gros du travail.

https://www.zipcodeapi.com/API#distance

+3

qui fonctionnerait pour 2 codes postaux, mais imaginez essayer de sélectionner les 100 emplacements les plus proches d'un code postal donné, à partir de milliers d'enregistrements dans la base de données :) – aryaxt

+0

le lien est mort –

+0

mis à jour vers un autre service qui fonctionne – brendan

7

Il peut être fait avec seulement les maths ...

function calc_distance($point1, $point2) 
{ 
    $distance = (3958 * 3.1415926 * sqrt(
      ($point1['lat'] - $point2['lat']) 
      * ($point1['lat'] - $point2['lat']) 
      + cos($point1['lat']/57.29578) 
      * cos($point2['lat']/57.29578) 
      * ($point1['long'] - $point2['long']) 
      * ($point1['long'] - $point2['long']) 
     )/180); 

    return $distance; 
} 
+3

Pouvez-vous donner une référence à l'endroit d'où vous avez pris ce calcul? –

+2

Trop de nombres magiques, et beaucoup trop d'indentation à droite! –

+0

À quelle unité renvoie-t-on la distance? Pour un code postal qui devrait donner 10 miles, il a donné quelque chose comme 7892.xx (environ). Comment cela peut-il être converti en miles? –

6

Vérifiez la Haversine formula pour le calcul des distances orthodromiques entre deux points. Certains autres échantillons peuvent être trouvés here

formule Haversine:

  • R = rayon de la Terre (rayon moyen = 6371 km)
  • Δlat = lat2- lat1
  • Δlong = long2- long1
  • a = sin² (Δlat/2) + cos (LAT1) cos (LAT2) .sin² (Δlong/2)
  • c = 2.atan2 (√a, √ (1-a))
  • d = Rc

(Notez que les angles doivent être en radians pour passer aux fonctions trigonométriques).

24

Ceci est la réponse de Mike avec quelques annotations pour les nombres magiques . Il semblait bien fonctionner pour moi some test data:

function calc_distance($point1, $point2) 
{ 
    $radius  = 3958;  // Earth's radius (miles) 
    $deg_per_rad = 57.29578; // Number of degrees/radian (for conversion) 

    $distance = ($radius * pi() * sqrt(
       ($point1['lat'] - $point2['lat']) 
       * ($point1['lat'] - $point2['lat']) 
       + cos($point1['lat']/$deg_per_rad) // Convert these to 
       * cos($point2['lat']/$deg_per_rad) // radians for cos() 
       * ($point1['long'] - $point2['long']) 
       * ($point1['long'] - $point2['long']) 
     )/180); 

    return $distance; // Returned using the units used for $radius. 
} 
1

Dans votre table zip vous devez saisir les coordonnées (latitude, long) pour les deux points pour lesquels vous souhaitez obtenir la distance.

Vous pouvez ensuite soit calculer la distance à droite dans le SQL ou avec PHP. Les deux méthodes sont décrites dans ce post:

http://dev.strategystar.net/2011/10/mysql-php-get-distance-between-two-coordinates-in-miles-kilometers/

Le calcul dans l'exemple est basé sur la formule déjà discuté dans ce fil. Il fournit le rayon de la terre dans les deux miles et les kilomètres de sorte qu'il vous permettra d'obtenir la distance entre deux points dans les deux unités.

Le lien ci-dessus est génial car la méthode de calcul n'inclut aucun nombre magique, juste le rayon de la terre!

Questions connexes