Calculando distância entre códigos postais em PHP
Pergunta
Peguei um banco de dados dos códigos postais e seus langitudes / latitudes, etc a partir desta Esta página . Tem os seguintes campos:
ZIP, latitude, longitude, cidade, estado, município, ZIP_CLASS
Os dados estava em um arquivo de texto, mas eu inseri-lo em uma tabela MySQL. Minha pergunta agora é: como posso utilizar os campos acima para calcular a distância entre dois zip códigos que um usuário pode entrar no site? código de trabalho em PHP será apreciado
Solução
Você também pode tentar bater um serviço web para calc a distância. Deixar alguém fazer o trabalho pesado.
Outras dicas
Esta é a resposta de Mike com algumas anotações para o números mágicos . Ele parecia funcionar bem para mim para alguns dados de teste :
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.
}
Isso pode ser feito com apenas matemática ...
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;
}
Confira o Haversine fórmula de cálculo grandes distâncias de círculo entre dois pontos. Alguns mais amostras pode ser encontrada href="http://www.movable-type.co.uk/scripts/latlong.html" aqui
fórmula Haversine:
- R = raio da Terra (raio médio = 6,371 km)
- ? MTA = lat2- lat1
- ?long = long2- long1
- a sin² = (? MTA / 2) + cos (lat1) .cos (Lat2) .sin² (?long / 2)
- c = 2.atan2 (va, v (1-a))
- d = R. C
(Note-se que os ângulos precisam estar em radianos para passar para funções trigonométricas).
Em sua mesa zip você precisa pegar as coordenadas (lat, long) para os dois pontos para o qual você deseja obter a distância.
Você pode então calcular o direito distância no SQL ou com PHP. Ambos os métodos são descritos neste post:
O cálculo no exemplo baseia-se na fórmula já discutido neste segmento. Ele fornece o raio para a terra em ambas as milhas e quilômetros por isso lhe permitirá obter a distância entre dois pontos em ambas as unidades.
O link acima é grande, porque o método de cálculo não inclui quaisquer números mágicos, apenas o raio da Terra!