Расчет расстояния между почтовыми индексами в PHP

StackOverflow https://stackoverflow.com/questions/407989

Вопрос

Я взял отсюда базу данных почтовых индексов, их долготы/широты и т. д.Эта страница.Он имеет следующие поля:

Почтовый индекс, ШИРОТА, ДОЛГОТА, ГОРОД, ШТАТ, ОКРУГ, ZIP_CLASS

Данные были в текстовом файле, но я вставил их в таблицу MySQL.Теперь у меня вопрос: как я могу использовать приведенные выше поля для расчета расстояния между двумя почтовыми индексами, которые пользователь может ввести на веб-сайте?Рабочий код на PHP будет оценен по достоинству.

Это было полезно?

Решение

Вы также можете попробовать воспользоваться веб-сервисом, чтобы рассчитать расстояние.Пусть кто-нибудь другой сделает тяжелую работу.

https://www.zipcodeapi.com/API#distance

Другие советы

Это ответ Майка с некоторыми аннотациями для магические числа.Мне показалось, что это работает нормально для меня некоторые тестовые данные:

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.Оба метода описаны в этом посте:

http://dev.strategystar.net/2011/10/mysql-php-get-distance-between-two-coordinates-in-miles-kilometers/

Расчет в примере основан на формуле, уже обсуждавшейся в этой теме.Он предоставляет радиус Земли как в милях, так и в километрах, поэтому позволит вам получить расстояние между двумя точками в обеих единицах измерения.

Ссылка выше великолепна, потому что метод расчета не включает никаких магических чисел, а только радиус Земли!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top