Расчет расстояния между почтовыми кодами в PHP
Я взял базу данных почтовых индексов и их языков/широт и т. Д. Из этого Эта страница . Он содержит следующие поля:
ПОЧТОВЫЙ ИНДЕКС, ШИРОТА, ДОЛГОТА, ГОРОД, ШТАТ, ОКРУГ, КЛАСС ZIP_CLASS
Данные были в текстовом файле, но я вставил их в таблицу MySQL. Теперь мой вопрос заключается в том, как я могу использовать поля выше, чтобы рассчитать расстояние между двумя почтовыми кодами, которые пользователь может ввести на веб-сайте? Рабочий код на PHP будет оценен по достоинству
5 answers
Вы также можете попробовать подключиться к веб-сервису, чтобы вычислить расстояние. Пусть кто-нибудь другой сделает тяжелую работу.
Это ответ Майка с некоторыми аннотациями для магических чисел. Мне показалось, что это хорошо работает для некоторых тестовых данных:
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.
}
Это можно сделать с помощью простой математики...
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;
}
Ознакомьтесь с формулой Хаверсина для вычисления расстояний больших окружностей между двумя точками. Еще несколько примеров можно найти здесь
Формула Хаверсина:
- R = радиус Земли (средний радиус = 6,371 км)
- Δlat = lat2-lat1
- Δlong= длинна2-длинна1
- a =sin2(Δlat/2) +cos(lat1).cos(lat2).sin2(Δlong/2)
- c=2.atan2(√a, √(1-a))
- d=R.c
( Обратите внимание, что углы должны быть в радианах для перехода к функциям тригонометрии).
В вашей таблице zip вам нужно получить координаты (широта, долгота) для двух точек, для которых вы хотите получить расстояние.
Затем вы можете либо рассчитать расстояние прямо в SQL, либо с помощью PHP. Оба метода описаны в этом посте:
Расчет в примере основан на формуле, уже обсуждавшейся в этой теме. Он обеспечивает радиус земли как в милях, так и в километрах, так что это позволит вам получить расстояние между двумя точками в обеих единицах измерения.
Ссылка выше великолепна, потому что метод расчета не включает никаких магических чисел, только радиус земли!