Расчет расстояния между почтовыми индексами в PHP
Вопрос
Я взял отсюда базу данных почтовых индексов, их долготы/широты и т. д.Эта страница.Он имеет следующие поля:
Почтовый индекс, ШИРОТА, ДОЛГОТА, ГОРОД, ШТАТ, ОКРУГ, ZIP_CLASS
Данные были в текстовом файле, но я вставил их в таблицу MySQL.Теперь у меня вопрос: как я могу использовать приведенные выше поля для расчета расстояния между двумя почтовыми индексами, которые пользователь может ввести на веб-сайте?Рабочий код на PHP будет оценен по достоинству.
Решение
Вы также можете попробовать воспользоваться веб-сервисом, чтобы рассчитать расстояние.Пусть кто-нибудь другой сделает тяжелую работу.
Другие советы
Это ответ Майка с некоторыми аннотациями для магические числа.Мне показалось, что это работает нормально для меня некоторые тестовые данные:
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 = радиус Земли (средний радиус = 6371 км)
- Δlat = широта2− широта1
- Δlong = long2− long1
- a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
- c = 2.atan2(√a, √(1−a))
- d = Rc
(Обратите внимание, что для передачи тригонометрическим функциям углы должны быть в радианах).
В вашей zip-таблице вам нужно получить координаты (широта, долгота) двух точек, для которых вы хотите получить расстояние.
Затем вы можете рассчитать расстояние прямо в SQL или с помощью PHP.Оба метода описаны в этом посте:
Расчет в примере основан на формуле, уже обсуждавшейся в этой теме.Он предоставляет радиус Земли как в милях, так и в километрах, поэтому позволит вам получить расстояние между двумя точками в обеих единицах измерения.
Ссылка выше великолепна, потому что метод расчета не включает никаких магических чисел, а только радиус Земли!