Calcul de la distance entre les codes postaux en PHP

J'ai saisi une base de données des codes postaux et de leurs langitudes/latitudes, etc à partir de ceci Cette page. Il a les champs suivants:

ZIP, LATITUDE, LONGITUDE, VILLE, ÉTAT, COMTÉ, ZIP_CLASS

Les données étaient dans un fichier texte mais je l'ai insérée 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é

23
demandé sur Click Upvote 2009-01-02 23:52:57

5 réponses

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

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

6
répondu brendan 2017-01-06 16:33:43

C'est la réponse de mike avec quelques annotations pour les nombres magiques. Cela semblait bien fonctionner pour moi pour certaines données de test :

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.
}
24
répondu Adam Bellaire 2011-12-18 05:32:16

Cela peut être fait avec juste des 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;
}
7
répondu Mike Paterson 2009-01-02 21:03:39

Consultez la Formule Haversine pour calculer les grandes distances de cercle entre deux points. D'autres échantillons peuvent être trouvés ici

Formule Haversine:

  • R = rayon de la terre (rayon moyen = 6,371 km)
  • Δlat = lat2-lat1
  • Δlong = long2-long1
  • a = sin2 (Δlat / 2) + cos (lat1).cos (lat2).sin2 (Δlong / 2)
  • c = 2.atan2(√a, √(1-un))
  • d = R. C

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

6
répondu Paul Dixon 2009-01-02 21:32:03

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

Vous pouvez alors calculer la distance directement 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 à l' rayon pour la terre en miles et en 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!

1
répondu JV- 2011-10-07 18:12:35