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é
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.
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.
}
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;
}
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).
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:
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!