Calcolo della distanza tra i codici postali in PHP
Domanda
Ho preso un database dei codici postali e delle loro lingue / latitudini, ecc. da questo Questa pagina . Ha i seguenti campi:
ZIP, LATITUDE, LONGITUDE, CITY, STATE, COUNTY, ZIP_CLASS
I dati erano in un file di testo ma li ho inseriti in una tabella MySQL. La mia domanda ora è: come posso utilizzare i campi sopra per calcolare la distanza tra due codici postali che un utente può inserire sul sito Web? Il codice di lavoro in PHP sarà apprezzato
Soluzione
Puoi anche provare a colpire un servizio web per calcolare la distanza. Lascia che qualcun altro faccia il lavoro pesante.
Altri suggerimenti
Questa è la risposta di Mike con alcune annotazioni per i numeri magici . Sembrava funzionare bene per me per alcuni dati di 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.
}
Può essere fatto solo con la matematica ...
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;
}
Dai un'occhiata alla formula Haversine per calcolare grandi distanze circolari tra due punti. Alcuni altri esempi sono disponibili qui
Formula Haversine:
- R = raggio della terra (raggio medio = 6.371 km)
- & # 916; lat = lat2 & # 8722; LAT1
- & # 916; long = long2 & # 8722; long1
- a = sin & # 178; (& # 916; lat / 2) + cos (lat1) .cos (lat2) .sin & # 178; (& # 916; long / 2)
- c = 2.atan2 (& # 8730; a, & # 8730; (1 & # 8722; a))
- d = R.c
(Nota che gli angoli devono essere in radianti per passare alle funzioni di attivazione).
Nella tua tabella zip devi prendere le coordinate (lat, long) per i due punti per i quali vuoi ottenere la distanza.
È quindi possibile calcolare la distanza direttamente in SQL o con PHP. Entrambi i metodi sono descritti in questo post:
Il calcolo nell'esempio si basa sulla formula già discussa in questo thread. Fornisce il raggio per la terra in miglia e chilometri, quindi ti permetterà di ottenere la distanza tra due punti in entrambe le unità.
Il link sopra è fantastico perché il metodo di calcolo non include alcun numero magico, ma solo il raggio della terra!